@shivaedev/quality 0.25.0 → 0.26.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 +11 -0
- package/README.md +69 -26
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +1 -9
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/messages.d.ts +1 -1
- package/dist/cli/messages.d.ts.map +1 -1
- package/dist/cli/messages.js +5 -1
- package/dist/cli/messages.js.map +1 -1
- package/dist/config/decode.d.ts +0 -2
- package/dist/config/decode.d.ts.map +1 -1
- package/dist/config/decode.js +0 -8
- package/dist/config/decode.js.map +1 -1
- package/dist/config/resolve.d.ts +0 -2
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/testProjects.d.ts +1 -1
- package/dist/testProjects.d.ts.map +1 -1
- package/dist/testProjects.js +4 -4
- package/dist/testProjects.js.map +1 -1
- package/docs/debt-and-hooks.md +8 -37
- package/docs/north-star.md +0 -3
- package/package.json +1 -1
- package/src/cli/args.ts +1 -10
- package/src/cli/messages.ts +5 -2
- package/src/config/decode.ts +0 -11
- package/src/testProjects.ts +4 -4
- package/docs/modules.md +0 -275
- package/docs/naming.md +0 -130
- package/docs/roadmap.md +0 -37
- package/docs/rules.md +0 -299
- package/docs/tooling.md +0 -105
package/src/testProjects.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Config, ConfigProvider, Effect } from "effect";
|
|
1
2
|
import { defaultExclude, type TestUserConfig } from "vitest/config";
|
|
2
3
|
import type { Environment } from "#naming/testName.ts";
|
|
3
4
|
|
|
@@ -13,10 +14,8 @@ function excluding(...patterns: readonly string[]): string[] {
|
|
|
13
14
|
return [...defaultExclude, named("typecheck"), TYPECHECK_ALONE, ...patterns];
|
|
14
15
|
}
|
|
15
16
|
|
|
16
|
-
export function testProjects(
|
|
17
|
-
|
|
18
|
-
throw new Error("testProjects takes no options. Remove suite exclusions; every test belongs in its named project.");
|
|
19
|
-
}
|
|
17
|
+
export function testProjects(): TestUserConfig {
|
|
18
|
+
const ci = Effect.runSync(Config.String("CI").pipe(Config.withDefault("")).parse(ConfigProvider.fromEnv()));
|
|
20
19
|
return {
|
|
21
20
|
project: ["unit", "dom"],
|
|
22
21
|
projects: [
|
|
@@ -24,6 +23,7 @@ export function testProjects(...options: readonly never[]): TestUserConfig {
|
|
|
24
23
|
{ extends: true, test: { environment: "happy-dom", exclude: excluding(named("slow")), include: [named("dom")], name: "dom" } },
|
|
25
24
|
{ extends: true, test: { environment: "node", exclude: excluding(), include: [named("slow")], name: "slow" } },
|
|
26
25
|
],
|
|
26
|
+
silent: ci ? false : "passed-only",
|
|
27
27
|
// Tests that start real servers, browsers or CLIs need seconds on a busy CI runner, and Vitest's 5s default fails them for load, not behavior.
|
|
28
28
|
testTimeout: 30_000,
|
|
29
29
|
};
|
package/docs/modules.md
DELETED
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
# Module reference
|
|
2
|
-
|
|
3
|
-
The `./*.ts` export pattern maps each module below to its emitted JavaScript and declarations, with source selected under the `source` condition. Import a symbol from its defining module. The [README](../README.md#api) explains the config and extension APIs; this table also makes the implementation modules exposed by that pattern findable.
|
|
4
|
-
|
|
5
|
-
A module link opens its source. Type and value declarations with the same name appear once. `cli.ts` is the executable entry and has no exported symbols.
|
|
6
|
-
|
|
7
|
-
## Top-level modules
|
|
8
|
-
|
|
9
|
-
| Module | Exported names |
|
|
10
|
-
| --- | --- |
|
|
11
|
-
| [cli.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/cli.ts) | None; executable entry. |
|
|
12
|
-
| [config.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/config.ts) | `Level` (`"error"`), `RuleSetting`, `RuleSettings`, `BuiltInRules`, `QualityConfig`, `defineConfig` |
|
|
13
|
-
| [decoded.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/decoded.ts) | `Decoded`, `decodeWith`, `validOrFail` |
|
|
14
|
-
| [failure.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/failure.ts) | `SetupFailure`, `GateFailed` |
|
|
15
|
-
| [rule.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rule.ts) | `Finding`, `Findings`, `SourceFile`, `RuleInputs`, `RuleContext`, `Configured`, `Rule`, `defineRule` |
|
|
16
|
-
| [standardSchema.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/standardSchema.ts) | `StandardSchemaV1`, `StandardResult`, `StandardIssue`, `describeIssue` |
|
|
17
|
-
| [testProjects.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/testProjects.ts) | `testProjects` |
|
|
18
|
-
|
|
19
|
-
## baseline
|
|
20
|
-
|
|
21
|
-
| Module | Exported names |
|
|
22
|
-
| --- | --- |
|
|
23
|
-
| [baseline/compare.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/baseline/compare.ts) | `Regression`, `StaleBaselineEntry`, `BaselineCheck`, `countOf`, `applyBaseline` |
|
|
24
|
-
| [baseline/format.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/baseline/format.ts) | `BaselineEntry`, `byPathAndRule`, `linesOf`, `decodeBaseline`, `encodeEntry`, `encodeBaseline` |
|
|
25
|
-
| [baseline/legacy.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/baseline/legacy.ts) | `LEGACY_BASELINE`, `LegacyEntry`, `decodeLegacyBaseline`, `convertLegacy` |
|
|
26
|
-
| [baseline/rewrite.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/baseline/rewrite.ts) | `rewriteBaseline` |
|
|
27
|
-
| [baseline/update.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/baseline/update.ts) | `Adoption`, `Pruned`, `adopt`, `Scope`, `prune` |
|
|
28
|
-
|
|
29
|
-
## biome
|
|
30
|
-
|
|
31
|
-
| Module | Exported names |
|
|
32
|
-
| --- | --- |
|
|
33
|
-
| [biome/exceptionConfig.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/biome/exceptionConfig.ts) | `exceptionConfig`, `withExceptionConfig` |
|
|
34
|
-
| [biome/nativeEffectCall.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/biome/nativeEffectCall.ts) | `nativeEffectCall` |
|
|
35
|
-
| [biome/recognizeDiagnostics.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/biome/recognizeDiagnostics.ts) | `recognizeDiagnostics` |
|
|
36
|
-
| [biome/recommendedRules.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/biome/recommendedRules.ts) | `recommendedRules` |
|
|
37
|
-
| [biome/report.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/biome/report.ts) | `Diagnostic`, `Report`, `biomeReport` |
|
|
38
|
-
| [biome/run.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/biome/run.ts) | `BiomeRun`, `runBiome` |
|
|
39
|
-
| [biome/syntax.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/biome/syntax.ts) | `Syntax`, `syntaxOf`, `offsetOf`, `nodeAt` |
|
|
40
|
-
|
|
41
|
-
## cli
|
|
42
|
-
|
|
43
|
-
| Module | Exported names |
|
|
44
|
-
| --- | --- |
|
|
45
|
-
| [cli/args.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/cli/args.ts) | `Command`, `Parsed`, `USAGE`, `parseCommand` |
|
|
46
|
-
| [cli/baseline.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/cli/baseline.ts) | `writeBaseline`, `shrinkBaseline` |
|
|
47
|
-
| [cli/fix.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/cli/fix.ts) | `MAX_FIX_ROUNDS`, `snapshotOf`, `Pass`, `Settling`, `settle`, `fix` |
|
|
48
|
-
| [cli/lint.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/cli/lint.ts) | `lint` |
|
|
49
|
-
| [cli/messages.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/cli/messages.ts) | `USAGE`, `ADOPT_REMOVED` |
|
|
50
|
-
| [cli/migrate.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/cli/migrate.ts) | `migrateBaseline` |
|
|
51
|
-
| [cli/migrateExceptions.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/cli/migrateExceptions.ts) | `migrateExceptions` |
|
|
52
|
-
| [cli/program.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/cli/program.ts) | `Invocation`, `program` |
|
|
53
|
-
| [cli/runMain.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/cli/runMain.ts) | `exitCode`, `quietOnClosedPipe`, `services`, `explained`, `runMain` |
|
|
54
|
-
| [cli/shrink.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/cli/shrink.ts) | `pruneBaseline`, `tightenBaseline` |
|
|
55
|
-
|
|
56
|
-
## config
|
|
57
|
-
|
|
58
|
-
| Module | Exported names |
|
|
59
|
-
| --- | --- |
|
|
60
|
-
| [config/decode.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/config/decode.ts) | `ConfigInput`, `decodeConfig` |
|
|
61
|
-
| [config/file.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/config/file.ts) | `CONFIG_FILE` |
|
|
62
|
-
| [config/load.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/config/load.ts) | `ResolvedConfig`, `loadConfig` |
|
|
63
|
-
| [config/resolve.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/config/resolve.ts) | `ResolvedRules`, `resolveRules` |
|
|
64
|
-
|
|
65
|
-
## engine
|
|
66
|
-
|
|
67
|
-
| Module | Exported names |
|
|
68
|
-
| --- | --- |
|
|
69
|
-
| [engine/baselineFile.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/engine/baselineFile.ts) | `BaselineFile`, `readInput`, `readBaseline` |
|
|
70
|
-
| [engine/evaluate.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/engine/evaluate.ts) | `Outcome`, `evaluate`, `passes` |
|
|
71
|
-
| [engine/runRules.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/engine/runRules.ts) | `ActiveRule`, `runRules` |
|
|
72
|
-
| [engine/session.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/engine/session.ts) | `Session`, `scan`, `openSession` |
|
|
73
|
-
| [engine/violation.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/engine/violation.ts) | `ActiveLevel` (`"error"`), `Violation`, `keyOf`, `byLocation`, `groupBy`, `RuleIndex`, `covers`, `levelOf`, `registrable`, `unusedEntryProblem` |
|
|
74
|
-
|
|
75
|
-
## exceptions
|
|
76
|
-
|
|
77
|
-
| Module | Exported names |
|
|
78
|
-
| --- | --- |
|
|
79
|
-
| [exceptions/biomeFindings.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/exceptions/biomeFindings.ts) | `missingBiomeFiles`, `biomeExceptionHint` |
|
|
80
|
-
| [exceptions/declaration.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/exceptions/declaration.ts) | `ExceptionDeclaration`, `decodeExceptions` |
|
|
81
|
-
| [exceptions/migrateBiome.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/exceptions/migrateBiome.ts) | `migrateBiome` |
|
|
82
|
-
| [exceptions/migrateConfig.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/exceptions/migrateConfig.ts) | `migrateConfig` |
|
|
83
|
-
| [exceptions/registryEntries.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/exceptions/registryEntries.ts) | `registryEntries` |
|
|
84
|
-
| [exceptions/registry.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/exceptions/registry.ts) | `RegistryEntry`, `decodeRegistry`, `StaleRegistryEntry`, `RegistryCheck`, `applyRegistry` |
|
|
85
|
-
|
|
86
|
-
## git
|
|
87
|
-
|
|
88
|
-
| Module | Exported names |
|
|
89
|
-
| --- | --- |
|
|
90
|
-
| [git/base.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/git/base.ts) | `Base`, `resolveBase` |
|
|
91
|
-
| [git/command.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/git/command.ts) | `GitResult`, `Git`, `git`, `gitOrFail` |
|
|
92
|
-
| [git/history.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/git/history.ts) | `Changes`, `changesSince` |
|
|
93
|
-
|
|
94
|
-
## hooks
|
|
95
|
-
|
|
96
|
-
| Module | Exported names |
|
|
97
|
-
| --- | --- |
|
|
98
|
-
| [hooks/command.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/hooks/command.ts) | `Launch`, `HookCommand`, `hookCommand`, `commandWords`, `shellWords` |
|
|
99
|
-
| [hooks/install.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/hooks/install.ts) | `HookInstall`, `installHook` |
|
|
100
|
-
| [hooks/location.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/hooks/location.ts) | `HookLocation`, `hookLocation` |
|
|
101
|
-
| [hooks/preCommit.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/hooks/preCommit.ts) | `preCommitHook` |
|
|
102
|
-
| [hooks/shim.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/hooks/shim.ts) | `isHookShim`, `hookShim` |
|
|
103
|
-
| [hooks/uninstall.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/hooks/uninstall.ts) | `uninstallHook` |
|
|
104
|
-
|
|
105
|
-
## imports
|
|
106
|
-
|
|
107
|
-
| Module | Exported names |
|
|
108
|
-
| --- | --- |
|
|
109
|
-
| [imports/ambient.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/ambient.ts) | `Ambient`, `ambientModules` |
|
|
110
|
-
| [imports/browserGlobals.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/browserGlobals.ts) | `browserGlobals` |
|
|
111
|
-
| [imports/browserNames.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/browserNames.ts) | `browserNames` |
|
|
112
|
-
| [imports/components.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/components.ts) | `cyclicComponents` |
|
|
113
|
-
| [imports/departures.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/departures.ts) | `Departure`, `departures` |
|
|
114
|
-
| [imports/extract.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/extract.ts) | `ImportKind`, `ImportRequest`, `importsOf` |
|
|
115
|
-
| [imports/generated.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/generated.ts) | `withoutGenerated` |
|
|
116
|
-
| [imports/glob.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/glob.ts) | `globMatcher` |
|
|
117
|
-
| [imports/graph.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/graph.ts) | `ImportEdge`, `UnresolvedImport`, `ImportGraph`, `importGraph` |
|
|
118
|
-
| [imports/paths.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/paths.ts) | `shortestPath` |
|
|
119
|
-
| [imports/pnpmWorkspacePatterns.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/pnpmWorkspacePatterns.ts) | `pnpmWorkspacePatterns` |
|
|
120
|
-
| [imports/projects.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/projects.ts) | `Project`, `projectsFor` |
|
|
121
|
-
| [imports/resolve.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/resolve.ts) | `Endpoint`, `builtinName`, `packageNameOf`, `isDeclarationFile`, `presumedTarget`, `resolveImport` |
|
|
122
|
-
| [imports/runtime.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/runtime.ts) | `Runtime`, `runtimeOf` |
|
|
123
|
-
| [imports/specifiers.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/specifiers.ts) | `SpecifierSite`, `specifierSites` |
|
|
124
|
-
| [imports/workspace.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/workspace.ts) | `WorkspacePackage`, `workspacePackages`, `packageOf` |
|
|
125
|
-
|
|
126
|
-
## imports/fences
|
|
127
|
-
|
|
128
|
-
| Module | Exported names |
|
|
129
|
-
| --- | --- |
|
|
130
|
-
| [imports/fences/check.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/fences/check.ts) | `checkFences` |
|
|
131
|
-
| [imports/fences/declarations.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/fences/declarations.ts) | `Declarations`, `decodeDeclarations` |
|
|
132
|
-
| [imports/fences/discover.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/fences/discover.ts) | `discoverFences` |
|
|
133
|
-
| [imports/fences/dsl.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/fences/dsl.ts) | `fence` |
|
|
134
|
-
| [imports/fences/evaluate.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/fences/evaluate.ts) | `FenceGraph`, `Evaluate`, `CompiledFence`, `compileFence` |
|
|
135
|
-
| [imports/fences/match.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/fences/match.ts) | `PolicyScope`, `Matcher`, `Compiler`, `trimmed`, `holdsFiles`, `packageNamed`, `compile` |
|
|
136
|
-
| [imports/fences/model.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/fences/model.ts) | `Selector`, `Target`, `External`, `ExampleStep`, `Chain`, `Examples`, `Prohibition`, `Fence` |
|
|
137
|
-
| [imports/fences/policy.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/fences/policy.ts) | `compilePolicy` |
|
|
138
|
-
| [imports/fences/reach.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/fences/reach.ts) | `Reached`, `labelOf`, `outgoing`, `reachedFrom` |
|
|
139
|
-
| [imports/fences/selectors.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/fences/selectors.ts) | `packages`, `folders`, `files`, `modules`, `scopes`, `anyOf`, `workspace`, `anything`, `external` |
|
|
140
|
-
| [imports/fences/vocabulary.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/imports/fences/vocabulary.ts) | `Vocabulary`, `compileVocabulary` |
|
|
141
|
-
|
|
142
|
-
## inventory
|
|
143
|
-
|
|
144
|
-
| Module | Exported names |
|
|
145
|
-
| --- | --- |
|
|
146
|
-
| [inventory/collect.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/inventory/collect.ts) | `InventoryScope`, `Inventory`, `linesOf`, `collectInventory` |
|
|
147
|
-
| [inventory/filesystem.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/inventory/filesystem.ts) | `FilesystemFailure`, `orWhenAbsent`, `readOptionalText`, `readRequiredText`, `writeText` |
|
|
148
|
-
| [inventory/ignoreScope.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/inventory/ignoreScope.ts) | `Verdict`, `IgnoreScope`, `emptyScope`, `posix`, `withIgnoreFile`, `insideKept`, `verdictFor` |
|
|
149
|
-
| [inventory/trackedPaths.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/inventory/trackedPaths.ts) | `trackedPaths`, `ignoredTrackedPaths` |
|
|
150
|
-
| [inventory/walk.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/inventory/walk.ts) | `ignoreScopeAt`, `scopeAbove`, `walk` |
|
|
151
|
-
|
|
152
|
-
## manifests
|
|
153
|
-
|
|
154
|
-
| Module | Exported names |
|
|
155
|
-
| --- | --- |
|
|
156
|
-
| [manifests/sorted.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/manifests/sorted.ts) | `Sorting`, `manifestsIn`, `sortingOf`, `sortManifests` |
|
|
157
|
-
|
|
158
|
-
## naming
|
|
159
|
-
|
|
160
|
-
| Module | Exported names |
|
|
161
|
-
| --- | --- |
|
|
162
|
-
| [naming/exportFits.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/naming/exportFits.ts) | `exportFits` |
|
|
163
|
-
| [naming/mainExport.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/naming/mainExport.ts) | `mainExport` |
|
|
164
|
-
| [naming/ownExports.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/naming/ownExports.ts) | `OwnExport`, `ownExports` |
|
|
165
|
-
| [naming/packageLayout.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/naming/packageLayout.ts) | `PackageLayout`, `packageLayout` |
|
|
166
|
-
| [naming/testName.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/naming/testName.ts) | `ENVIRONMENTS`, `Environment`, `TestName`, `testName`, `isTestSupport`, `isTestCode` |
|
|
167
|
-
| [naming/words.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/naming/words.ts) | `KEBAB`, `CAMEL`, `PASCAL`, `wordsOf`, `singular`, `sameWord`, `isUpper` |
|
|
168
|
-
|
|
169
|
-
## report
|
|
170
|
-
|
|
171
|
-
| Module | Exported names |
|
|
172
|
-
| --- | --- |
|
|
173
|
-
| [report/plural.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/report/plural.ts) | `plural` |
|
|
174
|
-
| [report/render.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/report/render.ts) | `ReportContext`, `render` |
|
|
175
|
-
| [report/stale.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/report/stale.ts) | `staleSections` |
|
|
176
|
-
|
|
177
|
-
## rules
|
|
178
|
-
|
|
179
|
-
| Module | Exported names |
|
|
180
|
-
| --- | --- |
|
|
181
|
-
| [rules/biome.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/biome.ts) | `PRESET`, `rootConfig`, `biome` |
|
|
182
|
-
| [rules/builtIn.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/builtIn.ts) | `builtInRules` |
|
|
183
|
-
| [rules/manifestsSorted.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/manifestsSorted.ts) | `manifestsSorted` |
|
|
184
|
-
| [rules/manifestsSourceFirst.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/manifestsSourceFirst.ts) | `manifestsSourceFirst` |
|
|
185
|
-
| [rules/maxLines.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/maxLines.ts) | `maxLines` |
|
|
186
|
-
| [rules/maxDepth.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/maxDepth.ts) | `maxDepth` |
|
|
187
|
-
| [rules/noBarrel.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/noBarrel.ts) | `noBarrel` |
|
|
188
|
-
| [rules/syntax.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/syntax.ts) | `parse` |
|
|
189
|
-
|
|
190
|
-
## rules/comments
|
|
191
|
-
|
|
192
|
-
| Module | Exported names |
|
|
193
|
-
| --- | --- |
|
|
194
|
-
| [rules/comments/kinds.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/comments/kinds.ts) | `Pragmas`, `textOf`, `isJsdoc`, `isPragma`, `isDirective` |
|
|
195
|
-
| [rules/comments/maxPerFile.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/comments/maxPerFile.ts) | `maxPerFile` |
|
|
196
|
-
| [rules/comments/noBanner.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/comments/noBanner.ts) | `noBanner` |
|
|
197
|
-
| [rules/comments/noEnvironmentPragma.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/comments/noEnvironmentPragma.ts) | `noEnvironmentPragma` |
|
|
198
|
-
| [rules/comments/noJsdoc.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/comments/noJsdoc.ts) | `noJsdoc` |
|
|
199
|
-
| [rules/comments/noLineReference.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/comments/noLineReference.ts) | `noLineReference` |
|
|
200
|
-
| [rules/comments/noPrReference.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/comments/noPrReference.ts) | `noPrReference` |
|
|
201
|
-
| [rules/comments/noTodo.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/comments/noTodo.ts) | `noTodo` |
|
|
202
|
-
| [rules/comments/definePattern.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/comments/definePattern.ts) | `definePatternRule` |
|
|
203
|
-
| [rules/comments/scan.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/comments/scan.ts) | `SourceComment`, `bodyOf`, `scanComments`, `commentsOf` |
|
|
204
|
-
|
|
205
|
-
## rules/files
|
|
206
|
-
|
|
207
|
-
| Module | Exported names |
|
|
208
|
-
| --- | --- |
|
|
209
|
-
| [rules/files/distinctCase.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/files/distinctCase.ts) | `distinctCase` |
|
|
210
|
-
| [rules/files/folderNames.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/files/folderNames.ts) | `folderNames` |
|
|
211
|
-
| [rules/files/namedAfterExport.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/files/namedAfterExport.ts) | `namedAfterExport` |
|
|
212
|
-
| [rules/files/otherNames.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/files/otherNames.ts) | `otherNames` |
|
|
213
|
-
| [rules/files/packageImports.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/files/packageImports.ts) | `PackageImports`, `packageImports` |
|
|
214
|
-
| [rules/files/stylesheetImporters.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/files/stylesheetImporters.ts) | `stylesheetImporters` |
|
|
215
|
-
|
|
216
|
-
## rules/imports
|
|
217
|
-
|
|
218
|
-
| Module | Exported names |
|
|
219
|
-
| --- | --- |
|
|
220
|
-
| [rules/imports/aliased.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/imports/aliased.ts) | `importsAliased` |
|
|
221
|
-
| [rules/imports/cycles.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/imports/cycles.ts) | `importCycles` |
|
|
222
|
-
| [rules/imports/fences.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/imports/fences.ts) | `importFences` |
|
|
223
|
-
| [rules/imports/manifest.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/imports/manifest.ts) | `importsManifest` |
|
|
224
|
-
| [rules/imports/noTestCode.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/imports/noTestCode.ts) | `noTestCode` |
|
|
225
|
-
| [rules/imports/resolvable.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/imports/resolvable.ts) | `importsResolvable` |
|
|
226
|
-
| [rules/imports/runtime.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/imports/runtime.ts) | `importsRuntime` |
|
|
227
|
-
|
|
228
|
-
## rules/stories
|
|
229
|
-
|
|
230
|
-
| Module | Exported names |
|
|
231
|
-
| --- | --- |
|
|
232
|
-
| [rules/stories/fixtureWrites.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/stories/fixtureWrites.ts) | `FixtureWrite`, `fixtureWrites` |
|
|
233
|
-
| [rules/stories/setup.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/stories/setup.ts) | `storySetup` |
|
|
234
|
-
|
|
235
|
-
## rules/suppressions
|
|
236
|
-
|
|
237
|
-
| Module | Exported names |
|
|
238
|
-
| --- | --- |
|
|
239
|
-
| [rules/suppressions/biomeOverrides.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/biomeOverrides.ts) | `biomeOverrides` |
|
|
240
|
-
| [rules/suppressions/biomeRecommended.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/biomeRecommended.ts) | `biomeRecommendedFrom`, `biomeRecommended` |
|
|
241
|
-
| [rules/suppressions/directives.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/directives.ts) | `SUPPRESSIONS`, `suppressionIn` |
|
|
242
|
-
| [rules/suppressions/noDoubleCast.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/noDoubleCast.ts) | `noDoubleCast` |
|
|
243
|
-
| [rules/suppressions/noInline.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/noInline.ts) | `noInline` |
|
|
244
|
-
| [rules/suppressions/noIgnoreDeprecations.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/noIgnoreDeprecations.ts) | `noIgnoreDeprecations` |
|
|
245
|
-
| [rules/suppressions/stylesheetComments.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/stylesheetComments.ts) | `STYLESHEET`, `stylesheetComments` |
|
|
246
|
-
|
|
247
|
-
## rules/suppressions/biome
|
|
248
|
-
|
|
249
|
-
| Module | Exported names |
|
|
250
|
-
| --- | --- |
|
|
251
|
-
| [rules/suppressions/biome/ConsumerDeclaration.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/biome/ConsumerDeclaration.ts) | `ConsumerDeclaration` |
|
|
252
|
-
| [rules/suppressions/biome/configs.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/biome/configs.ts) | `Preset`, `Layer`, `Chain`, `BiomeConfigs`, `biomeConfigs` |
|
|
253
|
-
| [rules/suppressions/biome/declarations.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/biome/declarations.ts) | `Declaration`, `PRESET_DECLARATIONS`, `decodeShipped`, `Scoped`, `matches`, `scoped`, `scopeText` |
|
|
254
|
-
| [rules/suppressions/biome/json.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/biome/json.ts) | `Json`, `Parsed`, `parseJsonc`, `member`, `entriesOf`, `itemsOf`, `textOf`, `isFalse` |
|
|
255
|
-
| [rules/suppressions/biome/resolve.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/biome/resolve.ts) | `resolvePackage` |
|
|
256
|
-
| [rules/suppressions/biome/weakenings.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/suppressions/biome/weakenings.ts) | `Weakening`, `weakeningsOf` |
|
|
257
|
-
|
|
258
|
-
## rules/test-names
|
|
259
|
-
|
|
260
|
-
| Module | Exported names |
|
|
261
|
-
| --- | --- |
|
|
262
|
-
| [rules/test-names/colocated.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/test-names/colocated.ts) | `testsColocated` |
|
|
263
|
-
| [rules/test-names/follow.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/test-names/follow.ts) | `testsFollow` |
|
|
264
|
-
| [rules/test-names/usesDom.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/rules/test-names/usesDom.ts) | `usesDom` |
|
|
265
|
-
|
|
266
|
-
## Preset assets
|
|
267
|
-
|
|
268
|
-
| Package path | File |
|
|
269
|
-
| --- | --- |
|
|
270
|
-
| `@shivaedev/quality/biome` | `biome/preset.json` |
|
|
271
|
-
| `@shivaedev/quality/tsconfig/base.json` | `tsconfig/base.json` |
|
|
272
|
-
| `@shivaedev/quality/tsconfig/package.json` | `tsconfig/package.json` |
|
|
273
|
-
| `@shivaedev/quality/package.json` | Package metadata |
|
|
274
|
-
|
|
275
|
-
The [shared tooling guide](./tooling.md) explains how to use the presets.
|
package/docs/naming.md
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
# Naming and test layout
|
|
2
|
-
|
|
3
|
-
A name says what a thing is. The rules below give identifiers, files, folders and tests a common shape, so a reader can find the defining module and recognize test code. For the gate's workflow, see the [README](../README.md).
|
|
4
|
-
|
|
5
|
-
A name says what a thing is, and the same kind of thing is named the same way everywhere. Every naming rule is an error without an autofix: nothing renames code or adds a `_` prefix. The message says what is wrong and which shapes are valid, and the author picks the name. Unused variables and parameters stay TypeScript errors; remove them instead of prefixing them.
|
|
6
|
-
|
|
7
|
-
### Identifiers
|
|
8
|
-
|
|
9
|
-
| What | Valid shape | Checked by |
|
|
10
|
-
| --- | --- | --- |
|
|
11
|
-
| Variables, functions and parameters | camelCase: `itemCount`, `loadItem`. A component or a class is PascalCase. | `useNamingConvention` |
|
|
12
|
-
| Acronyms | Spelled as a word: `HttpClient`, `userId`, `parseUrl`. Never `HTTPClient`, `userID` or `parseURL`. | `useNamingConvention` with `strictCase` |
|
|
13
|
-
| Types, interfaces, classes and enums | PascalCase, without an `I` prefix: `Item`, not `IItem`. | `useNamingConvention` |
|
|
14
|
-
| Type parameters | `T`, or `T` followed by a PascalCase name: `TItem`, `TResult`. Effect's positional `A`, `E` and `R` are valid as they are. | `useNamingConvention` |
|
|
15
|
-
| Module-level constants | A string or number literal at module level is CONSTANT_CASE: `const MAX_ITEMS = 50`. A constant inside a function is camelCase. | `constant-names` plugin, `useNamingConvention` |
|
|
16
|
-
| Object keys and type properties | camelCase or PascalCase, after any leading `_` or `$` (`_tag`, `$transaction`), also in a `Record`. A quoted key is a [foreign name](./naming.md#foreign-names) and is not checked. | `key-names` plugin |
|
|
17
|
-
| Schemas | PascalCase and named like their type: `const Item = Schema.Struct(...)` with `type Item = typeof Item.Type`. | `schema-names` plugin |
|
|
18
|
-
| `Schema.Struct` fields | camelCase, also when quoted. Outside data keeps its keys only at the edge: `Schema.Struct({ createdAt: Schema.String }).pipe(Schema.encodeKeys({ createdAt: "created_at" }))`. | `schema-struct-keys` plugin, `key-names` plugin |
|
|
19
|
-
| `Effect.fn` spans | `"Owner.operation"`, where the owner is the service or module and the operation is the name the function is bound to: `const loadItem = Effect.fn("ItemStore.loadItem")`, and `loadItem: Effect.fn("ItemStore.loadItem")` in an object. | `effect-fn-spans` plugin |
|
|
20
|
-
| `Effect.gen` functions | A top-level function whose whole body is `Effect.gen` is an `Effect.fn`: `const loadItem = Effect.fn("ItemStore.loadItem")(function* (id: string) { … })`, or `Effect.fnUntraced` when it needs no span. | `effect-fn-functions` plugin |
|
|
21
|
-
| Effect test bodies | In test code, a test takes the generator itself: `it.effect("loads the item", function* () { … })`, never `() => Effect.gen(function* () { … })`. The test helper runs it with `Effect.gen`. | `effect-test-bodies` plugin |
|
|
22
|
-
| Service Layers | A static `layer` on the service, read as `ItemStore.layer`. No exported `ItemStoreLive` or `ItemStoreLayer` constant. A Layer that wires an application together stays unexported. | `service-layers` plugin |
|
|
23
|
-
| Private members | A `#field`. No `private`, `protected` or `public` modifier. | `useConsistentMemberAccessibility` |
|
|
24
|
-
| React | A function passed to an `onX` prop is `handleX`, an `onX` prop forwarded as it is, or a state setter passed as it is: `onOpenChange={setOpen}`. A context is `ThemeContext`, a ref `inputRef`, an id `fieldId`. A module that exports a component exports only components; a test may define the components it renders. | `handler-names` plugin, `useReactNamingConvention`, `useComponentExportOnlyModules` |
|
|
25
|
-
| Booleans | A question: `isOpen`, `hasSave`, `canRetry`, `shouldFlush`. A name the DOM or React gives, such as `open` or `disabled`, stays. This is a convention only; no rule checks it. | Review |
|
|
26
|
-
|
|
27
|
-
### Foreign names
|
|
28
|
-
|
|
29
|
-
Some names are not ours to choose: a query parameter an outside API reads, an environment variable, an operator a query builder takes. Write such a name as a quoted key, and the naming rules skip it:
|
|
30
|
-
|
|
31
|
-
```ts
|
|
32
|
-
const query = { "per_page": 50, "sort_by": "created" };
|
|
33
|
-
const env = { "DATABASE_URL": url };
|
|
34
|
-
const where = { "OR": [{ id }, { slug }] };
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
An unquoted key is our own name and is camelCase or PascalCase. The formatter keeps the quotes as written, so a quoted key stays quoted. A `Schema.Struct` field is the exception: the struct is our model of the data, so the `schema-struct-keys` plugin reports a snake_case field even when it is quoted, and points to `Schema.encodeKeys`, which maps camelCase fields to the outside names at the edge.
|
|
38
|
-
|
|
39
|
-
### Re-exports
|
|
40
|
-
|
|
41
|
-
No file re-exports, package entry files included: every module is imported from the file that defines it. `noBarrelFile` reports `export { … } from`, `noReExportAll` reports `export *`, the `type-re-exports` plugin reports `export type … from`, and `noExportedImports` reports an import that is exported again. Its message suggests `export … from`, which is a re-export as well: import the name where it is used instead.
|
|
42
|
-
|
|
43
|
-
The plugins report under the one Biome category `plugin`, so their findings share the baseline rule `biome/plugin`.
|
|
44
|
-
|
|
45
|
-
### Files
|
|
46
|
-
|
|
47
|
-
`files/named-after-export` names a code file after its main export, and the folders above it are the prefix. The export takes the words of the file name, in order, and may add words of its folders around them, in any order and in singular or plural. Folders count from the package root, without a leading `src`; the package name does not count. The file's first letter follows the export's case.
|
|
48
|
-
|
|
49
|
-
| File | Exports | Valid |
|
|
50
|
-
| --- | --- | --- |
|
|
51
|
-
| `routers/items/list.ts` | `listItems` or `itemList` | Yes |
|
|
52
|
-
| `routers/items/Create.ts` | `CreateItemRouter` | Yes |
|
|
53
|
-
| `item/Panel.tsx` or `ItemPanel.tsx` | `ItemPanel`, with `ItemPanelProps` beside it | Yes |
|
|
54
|
-
| `Panel/Panel.tsx` | `Panel`: the main file of a module folder repeats the folder | Yes |
|
|
55
|
-
| `limits.ts` | `MAX_ITEMS` and `MAX_DEPTH`: a topic file of several exports is camelCase | Yes |
|
|
56
|
-
| `ItemPanel.tsx` | `export default memo(ItemPanel)`: a default export counts under the name it resolves to | Yes |
|
|
57
|
-
| `setupTests.ts` | Nothing, so it is camelCase | Yes |
|
|
58
|
-
| `script/build-docs.ts` | Run by a `package.json` script or `bin`, or starts with `#!`, so it is kebab-case | Yes |
|
|
59
|
-
| `order.ts` | `type Order` | No: the file's case follows the export, so it is `Order.ts` |
|
|
60
|
-
| `maxItems.ts` | `MAX_ITEMS` alone | No: constants live in a topic file with related constants |
|
|
61
|
-
| `items/listItems.ts` | `listItems` | No: the folder is the prefix, so it is `items/list.ts` |
|
|
62
|
-
|
|
63
|
-
Test files are left to the test rules. The `toolOwned` option lists `.gitignore` patterns of files whose names a tool fixes, `*.config.*`, declaration files and `.railway/railway.ts` (also `.py` and `.go`) by default. The Railway paths apply at any project root; other files in `.railway/` still follow the naming rules. The shared Biome preset also permits default exports in these config paths.
|
|
64
|
-
|
|
65
|
-
### Folders
|
|
66
|
-
|
|
67
|
-
`files/folder-names` checks every folder above a checked file.
|
|
68
|
-
|
|
69
|
-
- A module folder takes the name of its main file, inside it or beside it: `Panel/` with `Panel/Panel.tsx`, or `Dialog/` beside `Dialog.tsx`. A PascalCase folder without that file is a finding.
|
|
70
|
-
- A package folder is its package name without the scope, so `@acme/ui-kit` lives in `ui-kit/`.
|
|
71
|
-
- A folder that only groups files is kebab-case: `test-support/`, `.github/`.
|
|
72
|
-
- A folder the `content` option lists is snake_case: `forest_path/`.
|
|
73
|
-
|
|
74
|
-
The `toolOwned` option lists folders a tool names, `migrations/` by default. Authored files under `generated/` follow the same naming checks as other source; ignored, untracked output stays outside discovery.
|
|
75
|
-
|
|
76
|
-
### Other files
|
|
77
|
-
|
|
78
|
-
`files/other-names` names the files that are not code.
|
|
79
|
-
|
|
80
|
-
- Markdown, JSON, GritQL, images, fonts and SVG are kebab-case, with optional dotted parts: `release-notes.md`, `icons.sprite.svg`. Conventional upper-case names stay: `README.md`, `CHANGELOG.md`, `LICENSE`, `AGENTS.md`, `CLAUDE.md`, `CONTRIBUTING.md`, `SECURITY.md` and `SKILL.md`.
|
|
81
|
-
- A stylesheet that one component imports is named after it: `ItemPanel.css` beside `ItemPanel.tsx`. A shared stylesheet is kebab-case: `form-controls.css`. An import is a static `import` in a code file, relative or through a `#` alias from the `imports` of its `package.json`, or an `@import` in a stylesheet; a stylesheet that another stylesheet imports is shared. A path in a string, such as a test that reads the file, is not an import.
|
|
82
|
-
- A Prisma schema is camelCase: `schema.prisma`.
|
|
83
|
-
- A file the `content` option lists is snake_case: `forest_path.json`. A double underscore separates the parts of an id: `forest_path__clearing.json`.
|
|
84
|
-
|
|
85
|
-
The `toolOwned` option lists files a tool names: dotfiles, `package.json`, `tsconfig*.json`, `biome.json`, `*.config.*` and `migrations/` by default.
|
|
86
|
-
|
|
87
|
-
### Case
|
|
88
|
-
|
|
89
|
-
`files/distinct-case` keeps every path apart on a case-insensitive filesystem, such as macOS or Windows. Two files or folders in one folder must differ by more than case, and so must the files a build makes of them: `ReadingHistory.tsx` and `readingHistory.ts` both build to `readingHistory.js`, so they are a finding. A folder pair is one finding, not one per file inside it.
|
|
90
|
-
|
|
91
|
-
### Tests
|
|
92
|
-
|
|
93
|
-
A test sits beside the code it covers, and its name says what it covers and where it runs.
|
|
94
|
-
|
|
95
|
-
| File | Covers | Valid |
|
|
96
|
-
| --- | --- | --- |
|
|
97
|
-
| `cart/cart.test.ts` | `cart/cart.ts` | Yes |
|
|
98
|
-
| `cart/cart.typecheck.test.ts` | The types of `cart/cart.ts`, checked by the compiler | Yes |
|
|
99
|
-
| `cart/Basket.dom.test.tsx` | `cart/Basket.tsx`, in a DOM | Yes |
|
|
100
|
-
| `cart/checkoutFlow.spec.ts` | A behaviour of the `cart/` folder as a whole, such as a flow across several files | Yes |
|
|
101
|
-
| `cart/checkoutFlow.dom.spec.tsx` | The same, in a DOM | Yes |
|
|
102
|
-
| `cart/checkoutFlow.typecheck.spec.ts` | The types of that behaviour, checked by the compiler | Yes |
|
|
103
|
-
| `cart/totals.test.ts` | No `cart/totals.ts` beside it | No: a `.test` follows a file, and a test of the folder is a `.spec` |
|
|
104
|
-
| `cart/cart.spec.ts` | | No: a `.spec` names a behaviour, so it may not share a stem with a file beside it |
|
|
105
|
-
| `cart/cart.hydration.test.ts` | | No: an aspect gets its own file in the module's folder, or a `.spec` |
|
|
106
|
-
| `cart/cart.postgres.test.ts` | | No: a database or a running app comes from the app's test fixture, not a file name |
|
|
107
|
-
| `test/cart.test.ts` | | No: a test folder mirrors the source tree; the test sits beside `cart.ts` |
|
|
108
|
-
|
|
109
|
-
`tests/follow` checks the name: `<file>[.<environment>].test.ts` beside its file, or `<behaviour>[.<environment>].spec.ts` in camelCase in the folder it covers. The environment is at most one of `dom`, `slow` and `typecheck`; [Vitest projects](./tooling.md#vitest-projects) run the runtime tests, and the compiler checks `.typecheck` files. For runtime tests, the rule requires `.dom` when it sees a static `@testing-library/*` import or dotted `document`/`window` member access. It does not track aliases, destructuring or computed access.
|
|
110
|
-
|
|
111
|
-
`tests/colocated` checks the place: a test in a `test`, `tests`, `__tests__` or `spec` folder is a finding.
|
|
112
|
-
|
|
113
|
-
Both rules take a `suites` option, `.gitignore` patterns of folders that hold tests with their own layout, such as tests across several packages or a Playwright suite, whose `.spec.ts` files mean something else. The rules skip those folders.
|
|
114
|
-
|
|
115
|
-
### Test code
|
|
116
|
-
|
|
117
|
-
Test code is a test file (`*.test.ts` or `*.spec.ts`, with any environment), or any file under a folder named `test-support/`. `test-support/` is the folder for fixtures, harnesses and generated clients that tests share. `imports/fences` never holds test code, and `structure/max-lines` gives it the test limit. `imports/no-test-code` prevents production modules from importing test code; put code they share in a production module.
|
|
118
|
-
|
|
119
|
-
Name shared helpers without a `.test` or `.spec` suffix. `tests/follow` and `tests/colocated` use those suffixes to identify test files; the folder name alone does not make them skip a test-named file. `tests/story-setup` skips every file under `test-support/`, including a test-named file there.
|
|
120
|
-
|
|
121
|
-
### Story tests
|
|
122
|
-
|
|
123
|
-
Keep recurring setup in a domain kit under `test-support/`; the [test-story README](https://github.com/ShivaeDev/platform/tree/main/packages/test-story#readme) explains traits, verbs and a kit's `it`. Quality checks the setup patterns below; it does not establish which engine a test runs.
|
|
124
|
-
|
|
125
|
-
`tests/story-setup` reports, in a test file:
|
|
126
|
-
|
|
127
|
-
- A top-level function whose name starts with the word `seed`, `make`, `build` or `setup`, declared as a function or a variable holding an arrow function or function expression. The prefix is a whole word, so `builder` and `settings` pass. Nested helpers and declarations without a body are outside this check.
|
|
128
|
-
- A call that writes fixture files through Node's `fs` or `fs/promises`: `writeFile`, `appendFile`, `mkdir`, `mkdtemp`, `copyFile`, `cp` and `symlink`, including their sync forms. Named, renamed, namespace, default and `promises` imports are checked.
|
|
129
|
-
|
|
130
|
-
Each finding names its line and uses the helper or called function as its subject. The message asks for setup as traits of the kit and links to the README's story-test guidance. The rule reports without rewriting a test. Record existing findings with `quality baseline write --rule tests/story-setup` when adopting it.
|
package/docs/roadmap.md
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# Roadmap
|
|
2
|
-
|
|
3
|
-
This page owns Quality's shared policy, tooling, CLI and hook implementation status and the policy questions below. The [framework roadmap](https://github.com/ShivaeDev/platform/blob/main/docs/framework/roadmap.md) owns adoption across packages and hosts, integration and deployment validation; it links here for quality implementation work.
|
|
4
|
-
|
|
5
|
-
## Built
|
|
6
|
-
|
|
7
|
-
- [x] Error-only engine and report, with no CLI warning-report controls; old-debt adoption stays in the baseline.
|
|
8
|
-
- [x] Optional typed and runtime-validated config with config-free defaults; built-in and local rules enforced at `error`; local-rule and Standard Schema option APIs; one checked inventory and one report grouped by rule.
|
|
9
|
-
- [x] The public config rejects `warn`, `off`, raised thresholds, inventory exclusions and custom test-file patterns. Vitest projects reject suite exclusions. Reasoned Biome declarations cover individual rules on explicit files and named directory exclusions.
|
|
10
|
-
- [x] A JSON Lines baseline with counted debt, explicit named-rule recording, lowering and pruning, tracked-move handling and preservation of unrelated lines.
|
|
11
|
-
- [x] One reasoned config exception list for Quality and Biome, generated native Biome settings at lint and fix time, legacy migration, optional Quality subjects, stale entries and rules that refuse exceptions.
|
|
12
|
-
- [x] File-size and comment rules; inline-suppression, double-cast, deprecation-setting and declared-Biome-override checks.
|
|
13
|
-
- [x] A shared Biome preset and bridge whose error findings use the gate's baseline; enforcement of the installed Biome's recommended rules; bounded fix rounds and selected fixes left to the author.
|
|
14
|
-
- [x] Static import resolution, rejection of production imports of test code, runtime-cycle checks, same-folder relative imports and direct, transitive and vocabulary fences with validated examples.
|
|
15
|
-
- [x] Manifest sorting and identifier, file, folder, content, test-layout and story-setup conventions.
|
|
16
|
-
- [x] Shared type-check and package-build TypeScript presets; Vitest unit, DOM and opt-in slow projects, excluded type tests and inherited project tags.
|
|
17
|
-
- [x] Opt-in pre-commit hooks with per-worktree config and dependencies, conventional `typecheck` and `quality:commit` scripts, and explicit installation.
|
|
18
|
-
- [x] Seeded-repository and real-command tests for the gate, import policies, Biome, baseline and git hooks, plus packed consumer checks for the CLI and presets.
|
|
19
|
-
- [x] Separate shipped Biome declarations from consumer exceptions; reject whole-check, group and blanket-scope consumer declarations.
|
|
20
|
-
- [x] Shared nesting-depth and index-module checks; Platform's catalog, manifest and Codecov checks use the local-rule API and the same inventory, report and baseline.
|
|
21
|
-
|
|
22
|
-
## Next
|
|
23
|
-
|
|
24
|
-
- [ ] Reduce policy-tuning inputs to the ones checks need about a repository. Thresholds can only be lowered; local-rule APIs remain exposed. Review the remaining extension boundary.
|
|
25
|
-
- [ ] Split Grit implementation modules by the checks they own, without making consumers select competing presets; route Platform's remaining static checks through Quality.
|
|
26
|
-
- [ ] Define the Effect-boundary rule's source and test scope before porting the repository's `try`/`async` restrictions.
|
|
27
|
-
- [ ] Define the service-parameter policy before enforcing it against public helpers that accept services or `Context`.
|
|
28
|
-
|
|
29
|
-
## Open questions
|
|
30
|
-
|
|
31
|
-
The whole-policy direction is settled: Quality selects which checks run, and enabled checks should fail on uncovered findings; repositories adopt its defaults. The questions below concern how to implement that policy and where checks apply.
|
|
32
|
-
|
|
33
|
-
- **Extension policy.** Which repository-specific local-rule APIs and Biome declarations should remain public? Consumer rule switches, raised limits and exclusions are rejected immediately with a migration fragment.
|
|
34
|
-
- **Effect boundaries in tests.** Should tests follow the same Effect-only boundaries as shipped code, use a test-specific adapter scope, or remain exempt? The repository rule and test fixture patterns do not settle this policy.
|
|
35
|
-
- **Services as parameters.** Should a rule cover only service implementation methods, allow explicit integration helpers, or require public APIs that accept services or `Context` to change? The maintainer owns those API decisions before a reusable rule can enforce them.
|
|
36
|
-
- **Strict boolean expressions.** Should the preset enable Biome's nursery `useStrictBooleanExpressions`? It reports truthiness checks whose falsy cases differ, such as `if (value)` on `string | undefined`, where an empty string reads as missing. It has 63 findings across this repository, mostly in `work-fleet` and `work-board`, and some of them rely on `||` treating `""` as absent on purpose. The open choice is whether to adopt it with the existing findings in the baseline or fix them first, and whether to wait until Biome's reworked type inference behind the rule settles.
|
|
37
|
-
- **Module exports.** The `./*.ts` export pattern makes implementation modules accessible alongside config, rules, fences and Vitest helpers. Which of those modules should consumers treat as extension APIs? Documentation lists the current exports; changing their public boundary requires a maintainer decision.
|