oxlint-plugin-arch 0.4.0 β†’ 0.6.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.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,61 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 0.6.0
4
+
5
+ - Add `tests.profile` (`fixtures` by default, or `standard`), explicit custom test/assertion names, parameterized-test recognition and assertion-based narrowing guidance. Both profiles retain assertion, mock and type-safety checks; fixtures additionally require named fixture/support imports.
6
+ - Add explicit `modules.migrationFiles` scopes to exempt framework migration functions from service function/signature and folder-layout conventions without globally ignoring their safety checks.
7
+ - Recognize `test.for` titles and configured custom test modifiers; cover profiles and migration isolation with real Oxlint CLI regressions.
8
+ - Replace the preset’s native assertion-presence/placement checks with `modules/test-assertions`, covering native and extended tests, called local helpers and static table-row assertion callbacks. Require an assertion in every row; retain errors for standalone assertions, unused helpers and shadowed expectations. Custom assertion DSLs use `tests.additionalAssertionFunctions` or scoped module-rule options.
9
+ - Recognize polling/soft assertions without mistaking table builders or asymmetric matchers for assertions. Verify Tailwind fixes converge by file contents rather than assuming exit zero means an unchanged next pass.
10
+ - Add `arch/component-props`: every React component with props, exported or local, uses `interface XProps` declared directly above it; inline props always fail. Pass-through components may take a plain `ComponentProps<'tag'>` or `ComponentProps<typeof X>`. `filePrefix` requires local components to carry the file prefix. Enabled in the preset (with `filePrefix`) for `components/**/*.tsx`, excluding `components/ui` and tests; hooks, routes and non-component functions are unaffected. Opt out with `react: { componentProps: false }`, which leaves the other type-placement rules on.
11
+
12
+ ## 0.5.0
13
+
14
+ - Replace the preset's `eslint-plugin-better-tailwindcss` dependency with `oxlint-tailwindcss` 1.14.0. Preserve seven Tailwind checks, per-root CSS themes and root font size, with shadcn retaining unknown-class and component checks. Consumer rule overrides must use the new `tailwindcss/*` IDs documented in the README. Add real autofix/idempotence coverage; deprecated classes now belong to the dedicated deprecation diagnostic.
15
+
16
+ - Breaking unreleased preset API cleanup: grouped limits, modules, imports, oRPC, SQL, forms, React and TanStack Start settings; all boolean/callback policies now live under `policies`. Use `severity`, `cliFiles` and `ruleExclusions`; Tailwind/shadcn leaves use explicit names. Old flat preset keys are removed. Rule behavior, defaults, callback order and standalone rule APIs are unchanged.
17
+
18
+ - Configure per-root folder layouts through role/object architecture entries; keep shorthand defaults, exact flat/domain structure, hook/component naming and layout-derived RPC ownership.
19
+ - Permit strictly named public method-only frontend service objects without changing factory-returned APIs; check their trivial wrappers and parameter contracts.
20
+ - Add TanStack runtime boundary checks with scoped imported factory recognition, an RPC-owner server-branch exception, direct dependency/global checks and exact-file computed-import customization.
21
+ - Expose the existing max-lines ceiling as maxLines (default 400); improve helper, constants, namespace, alias, filename and portable-contract diagnostics with exact-message regressions.
22
+
23
+ - Web runtime service entries support cohesive public operations with domain-prefixed nested helpers and no private module-level functions. Explicit actions/queries and backend service rules remain strict. Web module data moves to domain-prefixed constants files; real service instances keep their lifetimes.
24
+
25
+ - Enable `arch/prefer-namespace-type-import` at `max: 3` in the preset imports policy. Add CLI threshold, namespace acceptance, qualified-reference autofix/idempotence, TypeScript and consumer-option regressions plus rule-coverage fixtures.
26
+
27
+ - Keep every configured frontend library portable: reject app service/API dependencies and foreign domain types, allowing only type-only consumption of a same-root, same-stem contract. Reject app-type re-exports; normalize optional utility stems and resolve relative/configured aliases. Keep backend scopes and existing consumer exceptions intact, with CLI regressions for multiple web roots and domain utilities.
28
+
29
+ - Replace the unreleased preset's fixed architecture slots with normalized path-to-role mappings supporting multiple apps per role and rejecting overlapping roots. Add explicitly declared concept file roles with full domain-role function prefixes and same-app domain boundaries; public service/utils surfaces reject private re-exports. Retain scope-resolved returned-method support for standalone consumers; backend factories remain strict.
30
+
31
+ - Enable precise trivial-function detection in the preset: configurable helper names, renamed generic guards and unchanged-argument wrappers; preserve legacy defaults and meaningful transformations.
32
+ - Require domain prefixes for private utility/action/query functions with `allFunctions`; keep exact filename matching for exported operations and strict service helper boundaries.
33
+
34
+ - Allow meaningful imported generic type instantiations; add opt-in camel-case filename placeholders and enable them for preset action/query names.
35
+
36
+ - Allow standard caller opacity utilities in the preset's shadcn policy; retain bans on other appearance overrides and arbitrary opacity, verified with a real CLI fixture.
37
+
38
+ - Allow private nested helpers only in action/query operations, require exactly one named function export there, and reject additional type/value/re-exports. Keep module-level helpers and other service scopes strict. Add configurable guidance explaining that `.utils.ts` is reserved for genuinely shared helpers.
39
+
40
+ - Disable render-time function/object/array/JSX prop bans for React Compiler projects; keep them when `reactCompiler: false`. Allow frontend service constants while retaining backend separation under configurable architecture roots. Keep portable-type and intentional-wrapper exceptions consumer-owned and file-specific.
41
+
42
+ - Restore missing type-file/helper restrictions and close utility-type, prompt-comment and UI-kit safety/formatting exceptions. Type and constant files reject ordinary and SAFETY comments; constants cannot hide functions.
43
+ - Enable unbound-method, catch-callback typing, noninteractive-tabindex and render-time object/function prop checks. Require typed mocks, enforce file-size/complexity limits in tests, and restrict all console methods to configured scripts/CLI or explicit adapter exceptions.
44
+ - Compare Crauler's enabled rules, disabled rules, exclusions and options against the baseline; retain its route-handler helper restriction without copying product-specific ignores. Add scope regressions and retain passing/failing fixtures for every enabled preset rule.
45
+
46
+ - Cover all 475 enabled preset rules, including implicit Oxlint defaults, with positive and negative CLI fixtures. Compare the manifest to resolved configuration and verify fixture discovery so newly enabled rules cannot silently lack coverage.
47
+ - Recognize SAFETY comments immediately above exported assertions without allowing comments to leak across statement boundaries.
48
+
49
+ - Add checked-in valid, invalid and customized preset mini-projects with real CLI diagnostics and a TypeScript-clean baseline. Fix public-entry export naming, domain type filename scopes, intrinsic JSX dynamic classes and TypeScript package import resolution.
50
+ - Add opt-in `multilineVariables` padding and `operatorMethods` SQL sanitizer checks without changing either rule's existing defaults. The preset enables both.
51
+
52
+ - Keep preset entry points under `src/presets`, explicit configuration groups under `src/configs`, and named contracts under `src/types`. Separate plugin loading, architecture resolution and policy composition; remove runtime rule-name classification and nested preset helpers.
53
+
54
+ - Keep Dillon Mulroy's vendored rules under `src/rules/dillon-anti-slop`, using the `dillon-anti-slop/*` namespace, with upstream attribution and the original MIT license included in the package.
55
+
56
+ - Verify standalone frontend paths, custom import-alias boundaries, exported Props interfaces, public endpoint scopes and policy switches in preset mini projects. Promote native correctness defaults without repeating their rule entries.
57
+
58
+ - Add the typed `tanstack-start-react-modules-preset` export with configurable architecture roots, error/warn level, boolean/callback policies, rule-specific exclusions and native Oxlint composition. Include React, effects, Tailwind/shadcn, formatting, module boundaries and supporting safety rules; verify behavior with CLI mini projects. The preset requires Oxlint 1.85+ and its type-aware engine.
4
59
 
5
60
  - Add `prefer-namespace-type-import` with a configurable named-type-import limit (default 3), module-specific namespace names, and scope-aware autofixes that qualify type references while reporting unsafe rewrites without a fix.
6
61
 
package/README.md CHANGED
@@ -11,6 +11,226 @@ Keep a codebase shaped the way you designed it: files in the right folders, expo
11
11
 
12
12
  ---
13
13
 
14
+ ## TanStack Start React modules preset
15
+
16
+ The optional **`tanstack-start-react-modules-preset`** supplies an opinionated application policy. The individual `arch` rules remain generic; importing the plugin alone does not enable the preset.
17
+
18
+ ```sh
19
+ bun add -d oxlint oxlint-tsgolint oxlint-plugin-arch
20
+ ```
21
+
22
+ In your root `oxlint.config.ts`:
23
+
24
+ ```ts
25
+ import preset from 'oxlint-plugin-arch/presets/tanstack-start-react-modules-preset';
26
+
27
+ export default preset({ root: import.meta.dirname });
28
+ ```
29
+
30
+ The equivalent named import is `tanstackStartReactModulesPreset` from `oxlint-plugin-arch/presets`. Both return a normal `OxlintConfig` object. The preset ships its JS-plugin dependencies and resolves them from its own package, including React, effects, Tailwind, shadcn, import ordering, formatting and type-safety rules. Type-aware linting is enabled; install `oxlint-tsgolint` and provide a tsconfig for the files you lint. Oxlint 1.85 or newer is required.
31
+
32
+ Tailwind checks use `oxlint-tailwindcss`: canonical names, ordering, shorthand, conflicts, duplicates, deprecated classes and whitespace. Shadcn retains unknown-class validation and component styling contracts. The Tailwind plugin caches compiled theme data on disk; cold runs can cost more than subsequent runs. Set `OXLINT_TAILWINDCSS_CACHE_DIR` to control its cache location. Existing `better-tailwindcss/*` consumer overrides must migrate to `tailwindcss/*`: `enforce-canonical-classes` becomes `enforce-canonical`, `enforce-consistent-class-order` becomes `enforce-sort-order`, and `enforce-shorthand-classes` becomes `enforce-shorthand`; the other enabled rule suffixes remain the same.
33
+
34
+ Custom utilities must be declared in the configured CSS entry point or its imports. Conflicts with properties defined by those utilities are still reported. Review intentional property overrides instead of globally allowing custom class names. In Oxlint 1.85, overlapping autofixes to the same class string can require another `--fix` run before it is clean.
35
+
36
+ ### Architecture
37
+
38
+ Paths are relative **app roots**, not `src` directories. These are the defaults:
39
+
40
+ ```ts
41
+ export default preset({
42
+ root: import.meta.dirname,
43
+ architecture: {
44
+ 'apps/web': 'web',
45
+ 'apps/server': 'server',
46
+ scripts: 'scripts',
47
+ packages: 'packages',
48
+ },
49
+ });
50
+ ```
51
+
52
+ `architecture` maps paths to roles and replaces the defaults when supplied. Multiple apps may share a role: `{ 'apps/dashboard': 'web', 'apps/storefront': 'web', 'apps/api': 'server', packages: 'packages', scripts: 'scripts' }`. Use `runner` for another strict backend, or `{ '.': 'web' }` for a standalone frontend. Omit absent roots. Paths are normalized; duplicates, overlapping roots and paths outside the project are rejected. Web and backend roles derive `src/services`, `src/types` and other application scopes; packages have no assumed app layout, and scripts permit console output. Shared baseline policies still apply everywhere. Each web root defaults to its own `src/application/styles.css`. Set `tailwind.cssEntryPointsByRoot: { 'apps/storefront': 'themes/store.css' }` for per-root paths, or `tailwind.cssEntryPoint` for an explicitly shared stylesheet. Entry paths are relative to `root`; `tailwind: false` disables Tailwind. Per-root CSS is supplied through Tailwind rule options because Oxlint 1.85 has no override-level `settings`. Shadcn discovers each app's theme through its own `components.json` (or package-local discovery). `root` makes asset and package resolution independent of the lint command's working directory; invoke the root config from its real filesystem location.
53
+
54
+ Folder layout is independent of role/content rules. Shorthand roles use defaults: web has domain services and flat hooks; server/runner have domain services. Other folders keep their existing role conventions unless explicitly configured. Object entries merge folder choices into those defaults:
55
+
56
+ ```ts
57
+ architecture: {
58
+ 'apps/dashboard': { role: 'web', layout: { services: 'flat', hooks: 'domain', features: 'domain' } },
59
+ 'apps/storefront': { role: 'web', layout: { services: 'domain', features: 'flat' } },
60
+ 'apps/api': { role: 'server', layout: { services: 'domain' } },
61
+ }
62
+ ```
63
+
64
+ Folder keys are literal paths relative to an app's `src` (relative to the root for packages/scripts), not new architecture slots. Segments use letters, numbers, underscores and hyphens; absolute paths, escapes, globs, empty segments and overlapping configured/default folders are rejected. `flat` requires source files directly in that folder. `domain` requires exactly one directory and filename ownership by that directory; loose/deeper files cannot coexist. Checks cover TS/TSX/MTS/CTS source files, not asset directory trees. Generic domain filenames start with their owning directory plus a dot/hyphen; hooks retain `use-` and components retain their existing singular-name convention. Choosing layout never disables service exports, types, constants, runtime suffixes or anti-slop. Existing policy callbacks and native overrides remain available.
65
+
66
+ RPC ownership follows each web root's service layout: `services/rpc.client.ts` for flat, `services/rpc/rpc.client.ts` for domain. `orpc.clientOwnerFile` remains the explicit consumer override. There is no mixed-layout mode.
67
+
68
+ ### Configure settings and policies
69
+
70
+ Settings are grouped by responsibility. The unreleased preset uses only this grouped API; old flat preset keys are not aliases. Standalone rule options are unchanged.
71
+
72
+ ```ts
73
+ export default preset({
74
+ root: import.meta.dirname,
75
+ severity: 'warn',
76
+ limits: { maxFileLines: 400, maxFunctionComplexity: 32 },
77
+ modules: { customFileRoles: ['prompts'] },
78
+ imports: {
79
+ backendEntryPoints: ['@app/server/client'],
80
+ aliases: { '@backend': 'apps/server/src' },
81
+ internalSortPatterns: ['^@app/'],
82
+ },
83
+ orpc: {
84
+ publicProcedureFiles: ['apps/server/src/rpc/public/**/*.ts'],
85
+ outputSchemaComposers: ['paginatedOutput'],
86
+ clientOwnerFile: 'apps/web/src/services/rpc/rpc.client.ts',
87
+ },
88
+ react: { compiler: true },
89
+ forms: { schemaResolver: 'standardSchemaResolver' },
90
+ sql: { likeSanitizers: ['escapeLikeWildcards'] },
91
+ policies: {
92
+ typePlacement: (current) => current.map((scope) => ({
93
+ ...scope,
94
+ excludeFiles: [...(scope.excludeFiles ?? []), '**/portable/**'],
95
+ })),
96
+ },
97
+ });
98
+ ```
99
+
100
+ Each entry under `policies` accepts `true` (default configuration), `false` (disabled), or a callback receiving fresh native Oxlint override objects. Callbacks run in the existing policy order before overall severity is applied; deliberately disabled rules stay disabled. They never mutate another preset invocation. Append an override to the callback's returned array to extend a policy.
101
+
102
+ Available policies: `typePlacement`, `typeSafety`, `serviceStructure`, `fileLayout`, `naming`, `comments`, `formatting`, `statementLayout`, `imports`, `react`, `effects`, `memoization`, `routes`, `forms`, `schemas`, `boundaries`, `tests`, `trivialFunctions`, `mutableState`, `backend`, `rpcClientOwnership`, `tailwind`, and `shadcn`.
103
+
104
+ `policies.typePlacement: false` disables type location restrictions; `policies.typeSafety` still rejects explicit any/unknown. `imports` contains import settings, while `policies.imports` customizes rule overrides. Backend entry points govern permitted imports and schema ownership; internal sort patterns only classify import ordering. `orpc.publicProcedureFiles` identifies endpoint files requiring output schemas. `cliFiles` lists CLI files receiving console/switch exceptions.
105
+
106
+ `severity` defaults to `error` and accepts `warn`. File and function limits default to 400 and 32. React Compiler is assumed by default: manual memoization is banned and the four React performance rules against render-time function/object/array/JSX props are off. `react: { compiler: false }` allows manual memoization and enables those four rules. `react: { componentProps: false }` turns off only `arch/component-props` (props typed with `interface XProps` directly above each component); it is on by default. `shadcn: false` disables shadcn integration while retaining Tailwind checks. `tailwind` accepts `cssEntryPoint`, `cssEntryPointsByRoot` and `rootFontSize`; `shadcn` accepts `uiImportPath` and `componentImportSources`. UI-kit files remain linted, with architecture/appearance exceptions rather than a global ignore.
107
+
108
+ Shadcn allows caller-owned layout and standard opacity utilities. Add product-specific component contracts through `policies.shadcn` or native overrides, keeping `layout` and `opacity` in replacement allowances.
109
+
110
+ Module configuration, lookup tables, limits and defaults belong in domain `.constants.ts` files, including frontend services. All frontend constant declarations carry the domain prefix (for example `BOT_MODEL_PRIORITY`). Frontend service scopes enable `modules/domain-constants` with `includeData: true`: it detects module-level literal/object/array data, literal calculations and seeded Map/Set tables, plus the existing uppercase constants. Function-local calculations and call-created service instances remain in their owner; empty Map/Set state is not classified as configuration. This is syntactic enforcement, not semantic data-flow analysis: imported aliases and arbitrary call-created configuration still need review. Backend rule defaults are unchanged. Every scope follows the configured architecture roots; a web `.server.ts` file remains frontend-owned.
111
+
112
+ ### Tests
113
+
114
+ Both test profiles use the same assertion, typed-mock, type-safety and no-module-mocking rules. `fixtures` is the default and preserves the backend convention of importing named fixtures or `tests/support`, rather than `tests/helpers`. `standard` leaves helper-folder organization open. Neither profile chooses a database, constructs a test kit, changes fixture lifetimes, or requires a particular service assembly.
115
+
116
+ ```ts
117
+ export default preset({
118
+ tests: {
119
+ profile: 'fixtures', // Or 'standard'.
120
+ additionalTestFunctions: ['integrationTest'],
121
+ additionalAssertionFunctions: ['expectRejectsWithInternal'],
122
+ },
123
+ });
124
+ ```
125
+
126
+ Regular tests, `test.for`/`test.each` tables and their `it` equivalents are recognized in both profiles, including concurrent/sequential forms. Additional test names also register those forms. Test-function names must be literal identifiers or dotted names. Assertion helpers also accept rooted dotted patterns, for example `arch.**.to*` for an explicitly reviewed fluent assertion API. Register only assertion helpers that actually fail on incorrect results; registering a name does not inspect its implementation. Standard Vitest `expect`, `expectTypeOf`, `assert`, `assert.*` and `assertType` assertions remain enabled.
127
+
128
+ `modules/test-assertions` checks assertion presence and placement for native Vitest tests, locally extended fixture tests and configured custom functions. It replaces the preset’s `vitest/expect-expect` and `vitest/no-standalone-expect` checks: those cannot consistently follow fixture and table-row callbacks. It follows called local helpers and statically declared object table rows, including destructured/renamed callbacks, and requires an assertion for every row. Unused assertion callbacks do not satisfy it. Assertions outside tests or assertion helpers remain errors.
129
+
130
+ Move custom native assertion-name overrides to `tests.additionalAssertionFunctions` (or scoped `modules/test-assertions` options through `policies.tests`). This is a static check, not proof that every execution reaches an assertion. Imported callbacks, dynamically constructed tables and cross-file helper bodies are not inferred; keep a direct assertion or register a reviewed imported assertion helper. Conditional assertions remain forbidden by the separate Vitest rule.
131
+
132
+ Prefer a throwing assertion to conditional expectations when narrowing a discriminated result:
133
+
134
+ ```ts
135
+ import { assert, expect } from 'vitest';
136
+
137
+ const result = await service.run(params);
138
+
139
+ assert(result.ok, 'Expected the operation to succeed');
140
+
141
+ expect(result.data.ordersCreated).toBe(1);
142
+ ```
143
+
144
+ `assert` fails the test and narrows the TypeScript type. No cast, custom unwrap helper or conditional expectation is needed. A prior success expectation followed by an `if` can be logically sound, but this form is simpler and keeps the conditional-expect rule enabled. Use `policies.tests` for native policy customization and `ignorePatterns` only when intentionally excluding tests from the entire lint run.
145
+
146
+ ### Framework migrations
147
+
148
+ Migration files can have framework-required exports such as Kysely's `up`/`down`. Declare their exact scope instead of restructuring them into service factories:
149
+
150
+ ```ts
151
+ export default preset({
152
+ modules: {
153
+ migrationFiles: ['apps/server/src/services/database/migrations/**/*.ts'],
154
+ },
155
+ });
156
+ ```
157
+
158
+ No migration paths are assumed by default. The supplied files are excluded from flat/domain folder-depth enforcement and the general service-functions/inline-signature scope. Formatting, naming, imports, type safety, constants and other rules still apply; this is not a whole-file ignore. Keep scopes narrow. In particular, `unknown` or framework-specific type exceptions require their own explicit `ruleExclusions`.
159
+
160
+ ### Exceptions and native customization
161
+
162
+ Action/query files (`services/**/*-{action,query}.*.ts` under configured app roots) export exactly one named operation. Helpers used only by that operation may be private nested functions or arrows inside it. Extra exports, including types, constants and re-exports, fail. Module-level private helpers still fail. Backend service files retain the stricter helper policy; `.utils.ts` files are for genuinely shared domain helpers, not a destination for every extraction. The trivial-function rule still applies.
163
+
164
+ Frontend `.client.ts`, `.server.ts` and `.rsc.{ts,tsx}` service entries are cohesive modules: multiple public domain-prefixed operations are allowed. No private module-level function satellites are allowed. Operation-only helpers stay nested inside their public operation and retain the domain prefix; genuinely shared helpers belong in domain `.utils.ts`. Factories are optional for real state, injection or lifetimes, and existing singleton exports remain valid. Do not export helpers just to evade this rule. Runtime suffix checks, React-free client checks and anti-slop rules remain enabled. A direct `export const themeService = { themeApply(...) { ... } }` is also allowed: a nonempty method-only object, static identifier keys, both binding and methods domain-prefixed. Data fields, getters/setters, strings/computed keys, spreads, arrow properties and callback-reference tables do not qualify. Returned factory API keys retain their existing contract. `allowServiceMethods` on domain-constants, `serviceMethods` on naming/object-parameter rules and `checkServiceMethods` on no-trivial-functions are enabled only for frontend runtime scopes; backend defaults remain unchanged. Object methods receive wrapper/generic-guard checks and named-parameter-contract rules. This is a syntax form, not proof that an object owns meaningful state.
165
+
166
+ Frontend actions/queries retain their runtime suffix: `theme-action.apply.client.ts` exports exactly `themeActionApply`, not `themeActionApplyClient`. Related helpers stay inside that operation. Backend operations remain `domain-action.name.ts` / `domain-query.name.ts`, without runtime suffixes.
167
+
168
+ Shared frontend domain helpers use `<domain>.utils.ts` in the configured services layout. Domain mode groups all runtime, utility, constants and action/query files under `services/<domain>/`; flat mode keeps all directly under `services/`. Utility functions, including private helpers, keep their domain prefix. Pure implementation does not make an application-specific helper portable: the preset enables `portableLib` in `modules/import-boundaries` for every configured web root. Files under `src/lib/` cannot import or re-export any configured app's services or app package APIs, including otherwise public backend entrypoints and type-only references. Backend library scopes retain their existing rules.
169
+
170
+ A portable module may consume its own contract using a type-only import from exactly the same web root's `types/<module>.types.ts`. The module stem removes the source extension and optional `.utils` suffix: both `lib/fade.ts` and `lib/fade.utils.ts` may consume `types/fade.types.ts`. Value imports, other-domain types, same-stem types from another app, and app-type re-exports (including imported bindings subsequently exported) fail. Relative paths, the built-in `@/` alias and configured aliases use the same ownership check. This is a filename ownership convention, not transitive semantic portability proof: the rule does not inspect imported contracts or follow module graphs. Static imports/re-exports, literal dynamic imports and TypeScript import types are checked; computed imports and arbitrary alias/data flow are not resolved. Custom aliases must be configured explicitly. An own-type match never overrides a services/backend/API ban.
171
+
172
+ The supporting rule's `portableLib` option defaults to `false` outside the preset for compatibility. Use the existing `policies.boundaries` callback, native overrides or file-specific `ruleExclusions['modules/import-boundaries']` for explicit consumer exceptions; an exclusion skips that rule's entire boundary check for the named file, so keep it narrow and documented.
173
+
174
+ The preset's imports policy enables `arch/prefer-namespace-type-import` with `{ max: 3 }` for checked TypeScript files. Up to three named type imports stay named; four or more become a type namespace (for example, `BotTypes` from `bot.types`) with qualified references. The scope-aware autofix preserves aliases and rewrites only supported type references. Imports with namespace collisions, inline comments, local re-exports or unsupported reference syntax remain reported for manual review. Domain exports keep their names. Customize `max` or the rule's source-to-namespace `names` map through the existing `policies.imports` callback or a native override; file-specific exclusions remain available.
175
+
176
+ Declare cohesive private concept roles with `modules: { customFileRoles: ['prompts'] }`. Built-in roles (`service`, `client`, `server`, `rsc`, `utils`, `action`, `query`, `types`, `constants`, `handler`, `test`, `spec`) cannot be redefined. A `route.prompts.ts` file may contain multiple builders, but every named function, including private functions, starts with the full `routePrompts` prefix. Arbitrary suffixes grant no exemption. Anti-slop checks remain enabled and comment exceptions remain explicit.
177
+
178
+ With declared file roles, private service-domain files can be imported or re-exported only within their owning domain in the same app root. Cross-domain callers use service APIs (`.service`, `.client`, `.server`, `.rsc`) or genuinely shared `.utils`, types or constants. Public service/utility surfaces cannot re-export private internals, including private barrels; this checks export-from, export-star and directly imported bindings exported by name or namespace. Operations may use private concepts internally. This is a per-file surface contract, not a transitive module graph or arbitrary data-flow/alias analysis; do not move concept logic into utilities to evade ownership.
179
+
180
+ `modules/service-functions` accepts `frontend`, `allowLocalHelpers`, `allowReturnedMethods`, `singleExport`, and `message` through the `policies.serviceStructure` callback or native overrides. The booleans default to `false` outside the preset's scoped overrides. `frontend: true` permits multiple public operations and their nested helpers; `singleExport: true` still requires exactly one operation. The preset enables frontend mode only for web runtime entries and applies the stricter single-export override to explicit actions/queries. The preset's diagnostic explains where helpers belong; consumers can replace `message` without disabling the rule.
181
+
182
+ `ruleExclusions` disables only the named rule in the selected files, including rules enabled through several scopes. `ignorePatterns` adds whole-file ignores to the generated/build/dependency defaults.
183
+
184
+ ```ts
185
+ export default preset({
186
+ ruleExclusions: {
187
+ 'arch/no-trivial-functions': ['apps/web/src/services/adapter.client.ts'],
188
+ 'modules/service-types': ['apps/server/src/services/portable-parser.ts'],
189
+ },
190
+ ignorePatterns: ['vendor/**'],
191
+ });
192
+ ```
193
+
194
+ Native composition remains available; later matching overrides can change an individual rule without a policy callback:
195
+
196
+ ```ts
197
+ import { defineConfig } from 'oxlint';
198
+ import preset from 'oxlint-plugin-arch/presets/tanstack-start-react-modules-preset';
199
+
200
+ export default defineConfig({
201
+ options: { typeAware: true },
202
+ extends: [preset({ root: import.meta.dirname })],
203
+ overrides: [{
204
+ files: ['scripts/**/*.ts'],
205
+ rules: { 'unicorn/filename-case': 'off' },
206
+ }],
207
+ });
208
+ ```
209
+
210
+ Rule-specific inline disables are allowed with a reason after `--`. The preset does not force warnings to fail or define a CI/Fallow/compiler workflow.
211
+
212
+ Oxlint reads `typeAware` from the root config only. The direct `export default preset(...)` form already sets it; when using `extends`, keep the explicit root option shown above.
213
+
214
+ ### Application conventions
215
+
216
+ - Single quotes, semicolons, two spaces, braced multiline control flow, early returns, 160-character lines and 400-line app and test files. Promise arrays and call objects expand; method chains are not forced multiline.
217
+ - Components live in one group folder with matching prefixed names. Hooks default to flat `use-*.ts` files; an explicit domain layout retains the hook filename convention. Local React types are prefixed interfaces; exported Props interfaces are allowed. Component props are never inline: every component `X` takes `interface XProps` declared directly above it, and local components carry the file prefix. Other types belong in domain `types/*.types.ts` files.
218
+ - Backend operations use `domain-action.name.ts` / `domain-query.name.ts`. Services allow one domain folder, one exported operation without private helpers, object parameters and named signature types. Explicit `.utils.ts` files can hold generic helpers, but their types still belong in domain type files. Domain type and constant files cannot contain top-level functions. Frontend services use `.client.ts`, `.server.ts` or `.rsc.{ts,tsx}`. RSC JSX entries retain `domainRscName` exports and the same helper/constants policies.
219
+ - Routes wire components, forms use a schema resolver, context creation has an owner directory, and effects cannot replace derived values or event handlers. React Compiler projects reject manual memoization. Test IDs are allowed. JSX rejects new object/function props inside render, and noninteractive elements cannot receive a tab index.
220
+ - Safety rules reject unknown/any, chained assertions, unjustified assertions, loose dictionaries, module mocks, shared mutable bindings and focused/skipped/placeholder tests. Comments are limited to supported directives, SAFETY notes and explicit exceptions. Type/constant files do not allow SAFETY comments; prompt files require explicit comment exceptions. UI-kit code retains type-safety, formatting and layout checks.
221
+ - Unbound methods and untyped mocks are rejected, including in tests. Console calls require an explicit script/CLI scope or adapter exclusion. Promise rejection callbacks must not receive implicit `any`; omitting the error parameter is allowed. App code needing an `unknown` boundary must use an explicit rule-specific exception.
222
+ - Backend owns shared schemas and exposes a public client entry point; frontend type files are runtime-free. Packages cannot import app internals, RPC handlers delegate database work, and service dependencies are injected.
223
+
224
+ Provide `orpc: { publicProcedureFiles: ['apps/server/src/rpc/api/**/*.ts'] }` for externally exposed oRPC endpoints requiring output schemas; exposure cannot be inferred from filenames or authentication. `imports.backendEntryPoints` defaults to `<backend package name>/client` read from each configured backend manifest. Configure it for another public import surface.
225
+
226
+ For custom import aliases, supply `imports: { aliases: { '@backend': 'apps/server/src' } }`. Keys are import prefixes without wildcards, and values are directories relative to `root`. Boundary checks then treat `@backend/services/chat.service` like its relative path. `imports.internalSortPatterns` controls import sorting only.
227
+
228
+ Native correctness defaults are promoted through `categories.correctness`; redundant rule entries are omitted after checking Oxlint's resolved configuration. Framework policies add the opinionated options on top. Other future presets can have their own named subpath under `/presets`; this factory does not enable any other preset.
229
+
230
+ The preset has [paired CLI fixtures for every enabled rule](tests/fixtures/tanstack-start-react-modules/README.md), including Oxlint defaults, plus architecture and consumer-override scenarios. The coverage guard detects newly enabled rules without fixtures.
231
+
232
+ The preset's supporting `modules/*` rules keep independent policies from overwriting one another: service type/factory matching, helper restrictions, import boundaries, reasoned lint directives, Shape-suffix names, empty effects, memoization and test modifiers. Dillon Mulroy's vendored [anti-slop rules](https://github.com/dmmulroy/anti-slop) live in `src/rules/dillon-anti-slop` and use the `dillon-anti-slop/*` namespace. They ship in this package; consumers do not need local plugin files. These supporting plugins are loaded by the preset, not registered by the generic plugin entry point.
233
+
14
234
  ## πŸ“¦ Install
15
235
 
16
236
  ```bash
@@ -65,7 +285,7 @@ export default defineConfig({
65
285
  | --- | --- |
66
286
  | [`minimal.oxlint.config.ts`](examples/minimal.oxlint.config.ts) | You want the smallest possible starting point. |
67
287
  | [`monorepo.oxlint.config.ts`](examples/monorepo.oxlint.config.ts) | ⭐ You are starting an `apps/server` + `apps/web` monorepo and want a strict, copy-ready setup. |
68
- | [`full.oxlint.config.ts`](examples/full.oxlint.config.ts) | You want to see every one of the 43 rules with its options. |
288
+ | [`full.oxlint.config.ts`](examples/full.oxlint.config.ts) | You want to see every one of the 44 rules with its options. |
69
289
 
70
290
  > [!TIP]
71
291
  > `monorepo.oxlint.config.ts` already loads `oxlint-plugin-arch`, so you can copy it as-is and adjust globs and names. The other two load `../src/index.ts`; change that specifier to `oxlint-plugin-arch` when you copy them.
@@ -74,7 +294,7 @@ export default defineConfig({
74
294
 
75
295
  ## 🧩 Rules
76
296
 
77
- 43 rules in 9 groups. πŸ”§ means the rule can autofix. Each rule file in [`src/rules/`](src/rules) explains its behavior in plain English, and the tests in [`src/tests/`](src/tests) show every option shape.
297
+ 44 rules in 9 groups. πŸ”§ means the rule can autofix. Each rule file in [`src/rules/`](src/rules) explains its behavior in plain English, and the tests in [`src/tests/`](src/tests) show every option shape.
78
298
 
79
299
  Options that take one regex string (`pattern`, `allowPattern`, `forbid`, `require`, and the other `*Pattern` options) also take a non-empty list; any pattern in the list may match. Options that were already lists, such as `allowPatterns` and `allowCallees`, are unchanged.
80
300
 
@@ -91,9 +311,9 @@ Options that take one regex string (`pattern`, `allowPattern`, `forbid`, `requir
91
311
  | Rule | What it enforces |
92
312
  | --- | --- |
93
313
  | `declaration-name` | Selected declarations start with a prefix taken from the filename, or match a pattern. |
94
- | `export-file-prefix` | Export names (or every function and type) start with the filename prefix. `trailingRoles` treats `onchain-utils.ts` like `onchain.utils.ts`. |
314
+ | `export-file-prefix` | Names start with the filename prefix. `allFunctions` includes private functions; `allDeclarations` includes every declaration. `trailingRoles` handles role suffixes. |
95
315
  | `export-name-pattern` | Export names (or every function and type) match a regular expression. |
96
- | `filename-export-name` | Function names follow a template built from the filename. |
316
+ | `filename-export-name` | Function names follow a template built from the filename. Set `camelCase: true` to convert lowercase placeholders such as `{domain}` from `user-profile` to `userProfile`; the default preserves captured text. |
97
317
  | `no-extra-exports` | A file exports only the names you allow. `patterns` accepts families such as `{Domain}[A-Z]\w*`. |
98
318
  | `only-export-constants` | Constant files export only local `const` values. [Details ↓](#only-export-constants) |
99
319
 
@@ -106,7 +326,7 @@ Options that take one regex string (`pattern`, `allowPattern`, `forbid`, `requir
106
326
  | `require-object-params` | Functions take object parameters instead of long positional lists. `maxParams: 2` allows `(deps, params)`. |
107
327
  | `no-file-level-helpers` | No stray helper functions at module scope. |
108
328
  | `no-top-level-functions` | No top-level functions (and optionally no re-exports) in matched files. |
109
- | `no-trivial-functions` | No empty or pass-through wrapper functions. `allowCallees` keeps intentional wrappers. |
329
+ | `no-trivial-functions` | No empty/pass-through functions. `mode: 'precise'` preserves transformations and checks forbidden helper names and renamed generic guards. |
110
330
  | `no-module-mutable-state` | No module-level `let`/`var`, which is shared across requests and tests. |
111
331
 
112
332
  ### πŸ”· Types
@@ -116,7 +336,7 @@ Options that take one regex string (`pattern`, `allowPattern`, `forbid`, `requir
116
336
  | `no-inline-types` | Function signatures use named types instead of inline `{ ... }` objects. [Details ↓](#no-inline-types) |
117
337
  | `no-type-declarations` | No type aliases or interfaces in matched files, so types live in one place. |
118
338
  | `no-runtime-in-types` | Type modules stay free of runtime code. Opt in to also ban runtime imports and re-exports. |
119
- | `no-imported-type-alias` | No exported aliases that only rename an imported type. |
339
+ | `no-imported-type-alias` | No exported aliases that only rename an imported type; generic instantiations such as `Selectable<Table>` remain allowed. |
120
340
  | `prefer-namespace-type-import` πŸ”§ | Long type-only named imports become a namespace import with qualified references. [Details ↓](#prefer-namespace-type-import) |
121
341
 
122
342
  ### πŸ§ͺ Schemas & APIs
@@ -128,7 +348,7 @@ Options that take one regex string (`pattern`, `allowPattern`, `forbid`, `requir
128
348
  | `no-rederive-schema` | No re-deriving types from schemas imported from elsewhere. |
129
349
  | `no-single-use-scalar-schema` | Scalar Zod aliases used once get inlined. |
130
350
  | `require-orpc-output` | oRPC procedures declare a named `.output()` schema. |
131
- | `no-unescaped-like` | `LIKE` / `ILIKE` values pass through your sanitizer. |
351
+ | `no-unescaped-like` | `LIKE` / `ILIKE` values pass through your sanitizer; optional `operatorMethods` covers calls such as `.where(column, 'like', value)`. |
132
352
 
133
353
  ### 🚧 Boundaries & safety
134
354
 
@@ -144,6 +364,7 @@ Options that take one regex string (`pattern`, `allowPattern`, `forbid`, `requir
144
364
 
145
365
  | Rule | What it enforces |
146
366
  | --- | --- |
367
+ | `component-props` | Components type props with `interface XProps` declared directly above them; pass-through components may use `ComponentProps<'tag'>`. [Details ↓](#component-props) |
147
368
  | `only-export-components` | Component files export only components. `denyTypePattern: 'Props$'` keeps props private. |
148
369
  | `route-surface` | Route files export the route only, with no banned hooks or raw JSX. |
149
370
 
@@ -159,7 +380,7 @@ Options that take one regex string (`pattern`, `allowPattern`, `forbid`, `requir
159
380
 
160
381
  | Rule | What it enforces |
161
382
  | --- | --- |
162
- | `padding-between-statements` πŸ”§ | Blank lines around functions and classes, around control flow, and before `return` in longer blocks. |
383
+ | `padding-between-statements` πŸ”§ | Blank lines around functions and classes, around control flow, and before `return` in longer blocks; `multilineVariables: true` also separates multiline declarations, including exports (default `false`). |
163
384
  | `object-multiline` πŸ”§ | Objects with 3+ properties passed to a call go one property per line (`scope: 'all'` for every object). |
164
385
  | `key-value-same-line` πŸ”§ | An object key and the start of its value stay on the same line. |
165
386
  | `chain-newline` πŸ”§ | Long method chains go one call per line. You pick which chains with `groups`. |
@@ -173,6 +394,56 @@ Options that take one regex string (`pattern`, `allowPattern`, `forbid`, `requir
173
394
 
174
395
  ## πŸ” Rule details
175
396
 
397
+ ### File size
398
+
399
+ `limits.maxFileLines?: number` sets the existing ESLint `max-lines` ceiling on checked safety scopes; default `400`. Blank lines and comments remain skipped. Use native Oxlint overrides or the existing `ruleExclusions` configuration for deliberate per-file exceptions. File size is a ceiling, not a cohesion proof.
400
+
401
+ ### TanStack runtime boundaries
402
+
403
+ `modules/tanstack-runtime` checks every configured web root's services and lib. Server dependencies include Node builtins (bare and `node:`), Bun/Cloudflare modules, `@orpc/server`, configured backend server/RPC APIs, `.server` files, TanStack server APIs/markers and React DOM server rendering. Known RSC renderer imports are checked by symbol; the entire mixed RSC package is not banned. Pure public backend client/schema imports remain governed by existing architecture rules.
404
+
405
+ `.client.ts` is the preset's frontend-facing, potentially SSR-used service convention. Known server runtime dependencies require inline callbacks of scope-resolved imports of `createServerFn().handler`, `createServerOnlyFn`, `createMiddleware().server` or `createIsomorphicFn().server`. Alias/namespace imports are recognized; lookalike names and shadowed parameters are not. Static isomorphic server imports are allowed only in the actual configured RPC owner, and every runtime reference must stay in its server branch. Elsewhere that branch can load a literal dynamic import. Module-level execution and re-exports do not inherit the exception.
406
+
407
+ `.server` files may statically import server implementation; dynamic loading alone proves nothing. RSC permits JSX, React and server-component definitions, but server renderer/dependency references still require a server callback. Server/RSC modules reject browser globals, local hook imports, client-only markers/APIs and React/TanStack client hooks outside recognized client branches. Global checks respect lexical shadowing and direct `globalThis.name` / literal-key access. Shared utilities/constants/lib cannot launder known server or client-only imports. Type-only imports/re-exports erase at runtime but retain all architecture restrictions.
408
+
409
+ `tanstackStart.additionalServerOnlyImports` and `additionalClientOnlyImports` add package/module prefixes. `tanstackStart.computedImportAllowedFiles` permits computed imports only in explicitly named project-relative files; review all targets before using it. Other checks still run. This is direct syntax and lexical-reference enforcement, not an import graph, interprocedural alias analysis, sandbox, or proof of SSR safety. Wrapper factories, indirect callback references, re-exported framework factories and arbitrary computed member aliases are not recognized as boundary proofs. Native rule exclusions remain explicit consumer decisions.
410
+
411
+ TanStack's [environment functions](https://tanstack.com/start/latest/docs/framework/react/guide/environment-functions) remove opposite branches, and [import protection](https://tanstack.com/start/latest/docs/framework/react/guide/import-protection) checks the resulting graph. Start's default import protection treats `.client.*` as browser-only, unlike this preset's service convention: SSR consumers must deliberately configure its server file pattern (Orbs uses `server.files: []`). Keep build-side protection enabled for server dependencies; lint does not replace it.
412
+
413
+ ### Private domain helpers and precise wrapper detection
414
+
415
+ The preset requires all named functions in `room.utils.ts`, exported or private, to start with `room`, such as `roomUserIsOwner`. Private action/query helpers use the same domain prefix; the exported operation must exactly match its filename (`room-action.send-message.ts` β†’ `roomActionSendMessage`). Ordinary local variables are unaffected. Standalone `export-file-prefix` users opt in with `allFunctions: true`.
416
+
417
+ The preset enables `no-trivial-functions` with `mode: 'precise'`; standalone defaults retain legacy behavior. Precise mode rejects empty/constant/identity functions and unchanged-argument forwarding. Transformed arguments, query chains and interpolated prompts remain allowed. Nested generic runtime guards are checked too.
418
+
419
+ Default exact banned names: `isRecord`, `isPlainObject`, `isObject`, `isString`, `isNumber`, `isBoolean`, `isArray`, `asRecord`, `asArray`. `bannedNames` replaces the list; `[]` disables name checks. `checkGenericGuards: false` disables structural checks. `allowPattern` exempts named helpers; `allowCallees` and `allowAsync` exempt wrappers only. No usage-count threshold, cross-file analysis or automatic rewrite is used.
420
+
421
+ ### `component-props`
422
+
423
+ Every top-level React component with props, exported or local, must use exactly `interface XProps`, declared directly above the component with only blank lines between. A file with `ProbeCard` and `ProbeCardInline` declares `ProbeCardProps` above `ProbeCard` and `ProbeCardInlineProps` above `ProbeCardInline`. Inline object types always fail. Components without parameters pass. `memo` and `forwardRef` are unwrapped, and `forwardRef<Ref, XProps>` type arguments count as the props type. Hooks and functions that do not return JSX are ignored.
424
+
425
+ A component that adds no props of its own may take a plain `ComponentProps<'header'>` or `ComponentProps<typeof Button>` instead of an empty `interface XProps extends ComponentProps<'header'> {}`. Once it adds, omits or intersects anything, it needs `XProps`.
426
+
427
+ | Option | Default | What it does |
428
+ | --- | --- | --- |
429
+ | `filePrefix` | `false` | Local components with props must start with the filename prefix, so `XProps` also matches prefix rules such as `declaration-name`. In `rooms-chat-tools.tsx`, rename `RoomsChatTool` to `RoomsChatToolsItem`. |
430
+
431
+ ```ts
432
+ // βœ… Pass
433
+ interface ProbeCardProps extends ComponentProps<'button'> { tone: string }
434
+
435
+ export function ProbeCard({ tone, ...rest }: ProbeCardProps) { return <button {...rest} /> }
436
+
437
+ export function ProbeCardHeader(props: ComponentProps<'header'>) { return <header {...props} /> }
438
+
439
+ // ❌ Fail: inline, wrong name, wrapped props
440
+ export function ProbeCard({ title }: { title: string }) { return <h2>{title}</h2> }
441
+ export function ProbeCard(props: ProbeCardOptions) { return <h2>{props.title}</h2> }
442
+ export function ProbeCard(props: PropsWithChildren<ProbeCardProps>) { return props.children }
443
+ ```
444
+
445
+ There is no autofix: moving an interface is a code change, not whitespace. It replaces `no-inline-types` for component files, which would also flag inline types on event handlers and callbacks inside components and cannot require the `XProps` name. The preset enables `filePrefix`.
446
+
176
447
  ### `no-inline-types`
177
448
 
178
449
  Requires named types in function signatures: local functions, callbacks, methods, constructors, and overloads. It checks explicit annotations only; inferred types, variable annotations, and generic constraints are left alone.
@@ -277,7 +548,7 @@ Keeps identifiers and member calls inside the files that own them.
277
548
  ```ts
278
549
  'arch/no-restricted-token': ['error', {
279
550
  restrictions: [
280
- { token: 'RouterClient', allowIn: ['/src/services/rpc.client.ts'] },
551
+ { token: 'RouterClient', allowIn: ['/src/services/rpc/rpc.client.ts'] },
281
552
  { member: 'process.platform', allowIn: ['/src/runtime.ts'] },
282
553
  { member: '*.insertInto', message: 'Queries are read-only; move writes to an action.' },
283
554
  ],
@@ -0,0 +1,2 @@
1
+ import type { PresetContext, PresetPolicies } from '../types/preset.types.ts';
2
+ export declare function presetBoundariesConfig(context: PresetContext): PresetPolicies;
@@ -0,0 +1,2 @@
1
+ import type { PresetContext, PresetPolicies } from '../types/preset.types.ts';
2
+ export declare function presetModulesConfig(context: PresetContext): PresetPolicies;
@@ -0,0 +1,3 @@
1
+ import type { OxlintConfig } from 'oxlint';
2
+ import type { PresetContext } from '../types/preset.types.ts';
3
+ export declare function presetPluginsConfig(context: PresetContext): OxlintConfig;
@@ -0,0 +1,2 @@
1
+ import type { PresetContext, PresetPolicies } from '../types/preset.types.ts';
2
+ export declare function presetReactConfig(context: PresetContext): PresetPolicies;
@@ -0,0 +1,2 @@
1
+ import type { PresetContext, PresetPolicies } from '../types/preset.types.ts';
2
+ export declare function presetSourceConfig(context: PresetContext): PresetPolicies;
@@ -0,0 +1,2 @@
1
+ import type { PresetContext, PresetPolicies } from '../types/preset.types.ts';
2
+ export declare function presetTestsConfig(context: PresetContext): PresetPolicies;
@@ -0,0 +1,2 @@
1
+ import type { PresetContext, PresetPolicies } from '../types/preset.types.ts';
2
+ export declare function presetTypesConfig(context: PresetContext): PresetPolicies;
@@ -0,0 +1,28 @@
1
+ import type { PresetRules, PresetPolicyName } from '../types/preset.types.ts';
2
+ export declare const presetExtensions = "*.{ts,tsx,mts,cts}";
3
+ export declare const presetPolicyOrder: PresetPolicyName[];
4
+ export declare const presetCommonRules: PresetRules;
5
+ export declare const presetFormattingRules: PresetRules;
6
+ export declare const presetReactRules: PresetRules;
7
+ export declare const presetEffectsRules: PresetRules;
8
+ export declare const presetTailwindRules: {
9
+ 'tailwindcss/enforce-canonical': "error";
10
+ 'tailwindcss/enforce-sort-order': "error";
11
+ 'tailwindcss/enforce-shorthand': "error";
12
+ 'tailwindcss/no-conflicting-classes': "error";
13
+ 'tailwindcss/no-duplicate-classes': "error";
14
+ 'tailwindcss/no-unknown-classes': "off";
15
+ 'tailwindcss/no-unnecessary-whitespace': "error";
16
+ 'tailwindcss/no-deprecated-classes': "error";
17
+ };
18
+ export declare const presetImportRules: PresetRules;
19
+ export declare const presetNamingRules: PresetRules;
20
+ export declare const presetTestRules: PresetRules;
21
+ export declare const presetExportPrefix: {
22
+ stem: string;
23
+ trailingRoles: string[];
24
+ roleSeparators: string[];
25
+ normalize: string;
26
+ allowPattern: string;
27
+ };
28
+ export declare const presetGeneratedFiles: string[];
@@ -0,0 +1 @@
1
+ export declare const testAssertionFunctions: string[];