@geonosis/oxlint-plugin-biological-architecture 3.1.0 → 3.2.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 +44 -0
- package/README.md +48 -5
- package/RULES.md +200 -99
- package/corpus/.oxlintrc.json +5 -0
- package/corpus/data/bad-dynamic-orm.ts +5 -0
- package/corpus/data/bad-type-only-orm.ts +3 -0
- package/corpus/e2e/bad-list-response.spec.ts +5 -0
- package/corpus/e2e/bad-timeout.spec.ts +5 -0
- package/corpus/e2e/good-detail-response.spec.ts +5 -0
- package/corpus/e2e/good-state.spec.ts +5 -0
- package/corpus/manifest.json +2 -0
- package/corpus/tissues/bad-awaits-data.tsx +8 -0
- package/corpus/tissues/bad-fetches-data.tsx +7 -0
- package/corpus/tissues/good-takes-products.tsx +5 -0
- package/dist/discover-atoms.d.ts +2 -37
- package/dist/discover-atoms.js +1 -104
- package/dist/index.d.ts +3 -12
- package/dist/index.js +19 -176
- package/dist/presets.d.ts +11 -19
- package/dist/presets.js +88 -3
- package/dist/registry.d.ts +2 -0
- package/dist/registry.js +172 -0
- package/dist/rules/atom-no-deps.d.ts +1 -0
- package/dist/rules/atom-no-deps.js +10 -11
- package/dist/rules/boundary-time-is-primitive.d.ts +0 -7
- package/dist/rules/cell-must-be-stateful.d.ts +2 -2
- package/dist/rules/cell-must-be-stateful.js +24 -23
- package/dist/rules/cell-must-not-compose-cell.d.ts +1 -0
- package/dist/rules/cell-must-not-compose-cell.js +10 -3
- package/dist/rules/cell-no-cross-feature-organelles.d.ts +1 -0
- package/dist/rules/cell-no-cross-feature-organelles.js +7 -0
- package/dist/rules/cell-no-tissues.d.ts +1 -0
- package/dist/rules/cell-no-tissues.js +11 -7
- package/dist/rules/cells-folder-index-is-barrel.d.ts +12 -10
- package/dist/rules/cells-folder-index-is-barrel.js +66 -34
- package/dist/rules/compound-must-be-stateless.d.ts +2 -0
- package/dist/rules/compound-must-be-stateless.js +24 -26
- package/dist/rules/compound-no-stores.d.ts +1 -0
- package/dist/rules/compound-no-stores.js +12 -10
- package/dist/rules/constants-in-constants-file.d.ts +2 -8
- package/dist/rules/constants-in-constants-file.js +5 -6
- package/dist/rules/dialect-through-the-seam.d.ts +0 -13
- package/dist/rules/durable-body-reads-through-steps.d.ts +0 -14
- package/dist/rules/durable-body-reads-through-steps.js +8 -3
- package/dist/rules/effect-hook-naming.d.ts +9 -11
- package/dist/rules/effect-hook-naming.js +33 -31
- package/dist/rules/emit-declares-attempts.d.ts +0 -17
- package/dist/rules/emit-declares-attempts.js +5 -10
- package/dist/rules/font-roles-only.d.ts +0 -18
- package/dist/rules/font-roles-only.js +19 -22
- package/dist/rules/hermetic-e2e-no-wall-clock-waits.d.ts +53 -0
- package/dist/rules/hermetic-e2e-no-wall-clock-waits.js +100 -0
- package/dist/rules/icon-control-has-name.js +7 -1
- package/dist/rules/layer-walls.d.ts +0 -25
- package/dist/rules/layer-walls.js +7 -13
- package/dist/rules/lib/atom-map.d.ts +24 -0
- package/dist/rules/lib/atom-map.js +16 -0
- package/dist/rules/lib/cells-barrel.d.ts +0 -1
- package/dist/rules/lib/colors.d.ts +0 -19
- package/dist/rules/lib/colors.js +10 -243
- package/dist/rules/lib/comments.d.ts +19 -0
- package/dist/rules/lib/comments.js +5 -0
- package/dist/rules/lib/context.d.ts +0 -10
- package/dist/rules/lib/direction-rule.d.ts +3 -21
- package/dist/rules/lib/direction-rule.js +12 -3
- package/dist/rules/lib/doors.d.ts +2 -18
- package/dist/rules/lib/doors.js +79 -41
- package/dist/rules/lib/hooks.d.ts +2 -17
- package/dist/rules/lib/hooks.js +14 -9
- package/dist/rules/lib/imports.d.ts +2 -23
- package/dist/rules/lib/imports.js +7 -2
- package/dist/rules/lib/jsx.d.ts +31 -0
- package/dist/rules/lib/jsx.js +11 -0
- package/dist/rules/lib/landing.d.ts +0 -40
- package/dist/rules/lib/literal-call.d.ts +1 -0
- package/dist/rules/lib/literal-call.js +2 -0
- package/dist/rules/lib/module-text.d.ts +3 -27
- package/dist/rules/lib/module-text.js +19 -4
- package/dist/rules/lib/mutations.d.ts +0 -14
- package/dist/rules/lib/nodes.d.ts +1 -18
- package/dist/rules/lib/nodes.js +1 -0
- package/dist/rules/lib/objects.d.ts +2 -11
- package/dist/rules/lib/objects.js +21 -0
- package/dist/rules/lib/options.d.ts +2 -52
- package/dist/rules/lib/options.js +44 -18
- package/dist/rules/lib/package-imports.d.ts +0 -5
- package/dist/rules/lib/package-imports.js +4 -10
- package/dist/rules/lib/paths.d.ts +15 -41
- package/dist/rules/lib/paths.js +34 -1
- package/dist/rules/lib/pattern-match.d.ts +2 -12
- package/dist/rules/lib/pattern-match.js +5 -1
- package/dist/rules/lib/probe.d.ts +0 -43
- package/dist/rules/lib/reexports.d.ts +0 -18
- package/dist/rules/lib/render-tracking.d.ts +0 -8
- package/dist/rules/lib/shared-features.d.ts +0 -8
- package/dist/rules/lib/shared-features.js +2 -9
- package/dist/rules/lib/state-sources.d.ts +8 -0
- package/dist/rules/lib/state-sources.js +55 -0
- package/dist/rules/lib/steps.d.ts +3 -5
- package/dist/rules/lib/steps.js +6 -1
- package/dist/rules/lib/styling.d.ts +9 -42
- package/dist/rules/lib/styling.js +36 -10
- package/dist/rules/lib/tiers.d.ts +11 -24
- package/dist/rules/lib/tiers.js +41 -1
- package/dist/rules/lib/tissue-entrypoint.d.ts +0 -1
- package/dist/rules/lib/tissue-entrypoint.js +4 -5
- package/dist/rules/lib/tsconfig-paths.d.ts +0 -4
- package/dist/rules/lib/tsconfig-paths.js +47 -15
- package/dist/rules/lib/type-members.d.ts +6 -0
- package/dist/rules/lib/type-members.js +165 -0
- package/dist/rules/lib/visitors.d.ts +0 -22
- package/dist/rules/lib/workspace-members.d.ts +2 -0
- package/dist/rules/lib/workspace-members.js +115 -0
- package/dist/rules/list-take-without-order.js +2 -8
- package/dist/rules/max-comment-density.d.ts +3 -18
- package/dist/rules/max-comment-density.js +3 -3
- package/dist/rules/molecule-atoms-only.d.ts +1 -0
- package/dist/rules/molecule-atoms-only.js +11 -7
- package/dist/rules/molecule-must-compose.d.ts +2 -0
- package/dist/rules/molecule-must-compose.js +17 -21
- package/dist/rules/mutating-step-declares-retry.d.ts +2 -7
- package/dist/rules/mutating-step-declares-retry.js +29 -11
- package/dist/rules/named-when-block.d.ts +0 -2
- package/dist/rules/named-when-block.js +2 -8
- package/dist/rules/next-route-segment-is-thin-delegate.d.ts +4 -19
- package/dist/rules/next-route-segment-is-thin-delegate.js +47 -71
- package/dist/rules/no-brand-names.d.ts +0 -9
- package/dist/rules/no-brand-names.js +1 -1
- package/dist/rules/no-card-shaped-div.d.ts +4 -42
- package/dist/rules/no-card-shaped-div.js +12 -4
- package/dist/rules/no-cross-feature-stores.d.ts +1 -0
- package/dist/rules/no-cross-feature-stores.js +9 -5
- package/dist/rules/no-d1-transaction.d.ts +2 -5
- package/dist/rules/no-d1-transaction.js +7 -0
- package/dist/rules/no-date-string-compare.d.ts +2 -0
- package/dist/rules/no-date-string-compare.js +14 -8
- package/dist/rules/no-duplicate-jsx-patterns.d.ts +3 -1
- package/dist/rules/no-duplicate-jsx-patterns.js +16 -1
- package/dist/rules/no-generic-utility-package.d.ts +48 -2
- package/dist/rules/no-generic-utility-package.js +48 -9
- package/dist/rules/no-hook-in-component-disguise.d.ts +27 -13
- package/dist/rules/no-hook-in-component-disguise.js +38 -30
- package/dist/rules/no-index-count-as-exact.d.ts +0 -3
- package/dist/rules/no-inert-hidden-jsx.d.ts +4 -21
- package/dist/rules/no-inert-hidden-jsx.js +13 -12
- package/dist/rules/no-inline-data-in-jsx.d.ts +2 -0
- package/dist/rules/no-inline-data-in-jsx.js +17 -2
- package/dist/rules/no-invalid-feature-folders.d.ts +2 -0
- package/dist/rules/no-invalid-feature-folders.js +12 -4
- package/dist/rules/no-loader-side-effect-in-index-file.d.ts +2 -9
- package/dist/rules/no-logic-in-component-files.d.ts +6 -5
- package/dist/rules/no-logic-in-component-files.js +52 -31
- package/dist/rules/no-mock-db-in-integration.d.ts +0 -15
- package/dist/rules/no-mock-db-in-integration.js +3 -4
- package/dist/rules/no-orm-outside-db.d.ts +1 -0
- package/dist/rules/no-orm-outside-db.js +9 -7
- package/dist/rules/no-raw-html-atoms.d.ts +3 -22
- package/dist/rules/no-raw-html-atoms.js +5 -17
- package/dist/rules/no-raw-sql-outside-allowed.d.ts +2 -0
- package/dist/rules/no-raw-sql-outside-allowed.js +10 -15
- package/dist/rules/no-react-namespace.d.ts +2 -0
- package/dist/rules/no-react-namespace.js +13 -0
- package/dist/rules/no-renamed-html-props.d.ts +2 -0
- package/dist/rules/no-renamed-html-props.js +11 -2
- package/dist/rules/no-render-prop-reader.d.ts +4 -20
- package/dist/rules/no-render-prop-reader.js +13 -5
- package/dist/rules/no-runtime-dead-affordance.d.ts +3 -26
- package/dist/rules/no-runtime-dead-affordance.js +7 -20
- package/dist/rules/no-swallowed-catch.js +2 -8
- package/dist/rules/no-trivial-wrapper-component.d.ts +4 -19
- package/dist/rules/no-trivial-wrapper-component.js +24 -33
- package/dist/rules/no-ts-in-bio-folders.d.ts +2 -13
- package/dist/rules/no-ts-in-bio-folders.js +9 -7
- package/dist/rules/no-type-definitions-in-components.d.ts +2 -0
- package/dist/rules/no-type-definitions-in-components.js +12 -1
- package/dist/rules/no-unregistered-plugin-dir.d.ts +0 -41
- package/dist/rules/no-unregistered-plugin-dir.js +1 -9
- package/dist/rules/no-void-port.d.ts +2 -4
- package/dist/rules/no-void-port.js +7 -0
- package/dist/rules/organelle-dependency.d.ts +1 -0
- package/dist/rules/organelle-dependency.js +10 -8
- package/dist/rules/organelle-single-source.d.ts +2 -0
- package/dist/rules/organelle-single-source.js +58 -9
- package/dist/rules/plugin-route-namespaced.d.ts +0 -11
- package/dist/rules/plugin-route-namespaced.js +2 -2
- package/dist/rules/queries-require-org-scope.d.ts +0 -3
- package/dist/rules/queries-require-org-scope.js +3 -10
- package/dist/rules/queue-loop-is-the-library.js +3 -2
- package/dist/rules/route-no-inline-mutation.d.ts +1 -25
- package/dist/rules/route-no-inline-mutation.js +2 -7
- package/dist/rules/router-schema-parity.d.ts +0 -9
- package/dist/rules/router-schema-parity.js +5 -9
- package/dist/rules/service-name-not-reserved.d.ts +0 -3
- package/dist/rules/service-name-not-reserved.js +1 -34
- package/dist/rules/ssot-no-inline-facts.js +2 -5
- package/dist/rules/ssot-no-process-env.js +4 -12
- package/dist/rules/step-declares-compensation-or-none.d.ts +2 -1
- package/dist/rules/step-declares-compensation-or-none.js +17 -1
- package/dist/rules/step-opens-its-own-cell.d.ts +3 -26
- package/dist/rules/step-opens-its-own-cell.js +8 -13
- package/dist/rules/store-route-scopes-tenant-data.js +8 -26
- package/dist/rules/subpath-over-barrel.d.ts +2 -10
- package/dist/rules/subpath-over-barrel.js +48 -9
- package/dist/rules/subscriber-declares-id.d.ts +0 -2
- package/dist/rules/subscriber-declares-id.js +2 -8
- package/dist/rules/tables-declare-their-plane.d.ts +0 -2
- package/dist/rules/tables-declare-their-plane.js +4 -10
- package/dist/rules/tenant-tables-carry-org-id.d.ts +1 -4
- package/dist/rules/tenant-tables-carry-org-id.js +5 -12
- package/dist/rules/test-no-clock-polling-for-promise-flips.d.ts +2 -0
- package/dist/rules/test-no-clock-polling-for-promise-flips.js +18 -1
- package/dist/rules/time-through-the-door.d.ts +0 -24
- package/dist/rules/time-through-the-door.js +5 -5
- package/dist/rules/tissue-must-compose.d.ts +5 -3
- package/dist/rules/tissue-must-compose.js +25 -20
- package/dist/rules/tissue-no-data-props.d.ts +57 -1
- package/dist/rules/tissue-no-data-props.js +114 -32
- package/dist/rules/tissue-no-fetch.d.ts +26 -0
- package/dist/rules/tissue-no-fetch.js +57 -0
- package/dist/rules/tissue-no-hooks.d.ts +21 -23
- package/dist/rules/tissue-no-hooks.js +22 -4
- package/dist/rules/tissue-no-organelles.d.ts +1 -0
- package/dist/rules/tissue-no-organelles.js +9 -1
- package/dist/rules/tissue-no-stores.d.ts +1 -0
- package/dist/rules/tissue-no-stores.js +9 -1
- package/dist/rules/todo-names-its-plan.d.ts +1 -28
- package/dist/rules/todo-names-its-plan.js +2 -2
- package/dist/rules/tokens-only-colors.d.ts +2 -37
- package/dist/rules/tokens-only-colors.js +33 -18
- package/dist/rules/unique-query-step-name.d.ts +0 -7
- package/dist/rules/unique-query-step-name.js +6 -10
- package/dist/rules/worker-handles-are-scoped.d.ts +12 -9
- package/dist/rules/worker-handles-are-scoped.js +12 -5
- package/dist/rules/zustand-v5-best-practices.d.ts +8 -18
- package/dist/rules/zustand-v5-best-practices.js +32 -56
- package/package.json +2 -2
package/dist/discover-atoms.d.ts
CHANGED
|
@@ -1,50 +1,15 @@
|
|
|
1
|
+
import type { Restriction } from './rules/lib/atom-map.js';
|
|
1
2
|
interface AtomMapping {
|
|
2
3
|
atomFile: string;
|
|
3
4
|
atomName: string;
|
|
4
5
|
nativeElement: string;
|
|
5
6
|
}
|
|
6
|
-
interface AtomRestriction {
|
|
7
|
-
atom: string;
|
|
8
|
-
element: string;
|
|
9
|
-
importPath: string;
|
|
10
|
-
}
|
|
11
7
|
interface RestrictedSyntaxEntry {
|
|
12
8
|
message: string;
|
|
13
9
|
selector: string;
|
|
14
10
|
}
|
|
15
|
-
/**
|
|
16
|
-
* Build no-restricted-syntax entries that forbid raw native HTML usage
|
|
17
|
-
* for every native element wrapped by an atom. Apply these entries to
|
|
18
|
-
* molecules, compounds, cells, and tissues (NOT atoms themselves).
|
|
19
|
-
*/
|
|
20
11
|
export declare function buildAtomRestrictions(atomsDir: string, importPathPrefix?: string): RestrictedSyntaxEntry[];
|
|
21
|
-
|
|
22
|
-
* Build atom restrictions in the format expected by the no-raw-html-atoms rule.
|
|
23
|
-
* This replaces no-restricted-syntax for linters that don't support it (e.g. oxlint).
|
|
24
|
-
*/
|
|
25
|
-
export declare function buildAtomRuleRestrictions(atomsDir: string, importPathPrefix?: string): AtomRestriction[];
|
|
26
|
-
/**
|
|
27
|
-
* Scan the atoms directory and build a mapping from native HTML element
|
|
28
|
-
* to the atom that wraps it. This is used to generate no-restricted-syntax
|
|
29
|
-
* entries that forbid raw native HTML usage in higher-level components.
|
|
30
|
-
*
|
|
31
|
-
* When multiple atoms wrap the same element (e.g. `input.tsx` and
|
|
32
|
-
* `inline-input.tsx` both wrap `<input>`), the atom whose filename
|
|
33
|
-
* exactly matches the element name is preferred as the canonical one.
|
|
34
|
-
* Variants are kept as alternatives in the error message.
|
|
35
|
-
*/
|
|
12
|
+
export declare function buildAtomRuleRestrictions(atomsDir: string, importPathPrefix?: string): Restriction[];
|
|
36
13
|
export declare function scanAtomMappings(atomsDir: string): AtomMapping[];
|
|
37
|
-
/**
|
|
38
|
-
* The native element an atom wraps, read from the one place every atom says so: its props type.
|
|
39
|
-
*
|
|
40
|
-
* `ComponentProps<'button'>`, `ComponentPropsWithoutRef<'textarea'>`,
|
|
41
|
-
* `HTMLAttributes<HTMLSelectElement>` and `React.ButtonHTMLAttributes<HTMLButtonElement>` all name
|
|
42
|
-
* the element outright, and an atom that types its props any other way is an atom nobody can
|
|
43
|
-
* compose. The Radix `asChild ? Slot.Root : 'button'` form comes next, and the JSX-tag scan is
|
|
44
|
-
* only the fallback — it was the whole detector once, and on a real tree it returned `string`,
|
|
45
|
-
* `typeof` and `path` while missing every shadcn button in the repo.
|
|
46
|
-
*
|
|
47
|
-
* The name is kept because consumers import it.
|
|
48
|
-
*/
|
|
49
14
|
export declare function detectFirstNativeJsxElement(source: string): null | string;
|
|
50
15
|
export {};
|
package/dist/discover-atoms.js
CHANGED
|
@@ -3,110 +3,7 @@ import { readdirSync, readFileSync } from "node:fs";
|
|
|
3
3
|
import { basename, join } from "node:path";
|
|
4
4
|
import { stripComments } from "./rules/lib/module-text.js";
|
|
5
5
|
var GENERIC_ELEMENTS = new Set(["div", "span"]);
|
|
6
|
-
var HTML_ELEMENTS = new Set(
|
|
7
|
-
"a",
|
|
8
|
-
"abbr",
|
|
9
|
-
"address",
|
|
10
|
-
"area",
|
|
11
|
-
"article",
|
|
12
|
-
"aside",
|
|
13
|
-
"audio",
|
|
14
|
-
"b",
|
|
15
|
-
"bdi",
|
|
16
|
-
"bdo",
|
|
17
|
-
"blockquote",
|
|
18
|
-
"br",
|
|
19
|
-
"button",
|
|
20
|
-
"canvas",
|
|
21
|
-
"caption",
|
|
22
|
-
"cite",
|
|
23
|
-
"code",
|
|
24
|
-
"col",
|
|
25
|
-
"colgroup",
|
|
26
|
-
"data",
|
|
27
|
-
"datalist",
|
|
28
|
-
"dd",
|
|
29
|
-
"del",
|
|
30
|
-
"details",
|
|
31
|
-
"dfn",
|
|
32
|
-
"dialog",
|
|
33
|
-
"div",
|
|
34
|
-
"dl",
|
|
35
|
-
"dt",
|
|
36
|
-
"em",
|
|
37
|
-
"embed",
|
|
38
|
-
"fieldset",
|
|
39
|
-
"figcaption",
|
|
40
|
-
"figure",
|
|
41
|
-
"footer",
|
|
42
|
-
"form",
|
|
43
|
-
"h1",
|
|
44
|
-
"h2",
|
|
45
|
-
"h3",
|
|
46
|
-
"h4",
|
|
47
|
-
"h5",
|
|
48
|
-
"h6",
|
|
49
|
-
"header",
|
|
50
|
-
"hgroup",
|
|
51
|
-
"hr",
|
|
52
|
-
"i",
|
|
53
|
-
"iframe",
|
|
54
|
-
"img",
|
|
55
|
-
"input",
|
|
56
|
-
"ins",
|
|
57
|
-
"kbd",
|
|
58
|
-
"label",
|
|
59
|
-
"legend",
|
|
60
|
-
"li",
|
|
61
|
-
"main",
|
|
62
|
-
"map",
|
|
63
|
-
"mark",
|
|
64
|
-
"menu",
|
|
65
|
-
"meter",
|
|
66
|
-
"nav",
|
|
67
|
-
"noscript",
|
|
68
|
-
"object",
|
|
69
|
-
"ol",
|
|
70
|
-
"optgroup",
|
|
71
|
-
"option",
|
|
72
|
-
"output",
|
|
73
|
-
"p",
|
|
74
|
-
"picture",
|
|
75
|
-
"pre",
|
|
76
|
-
"progress",
|
|
77
|
-
"q",
|
|
78
|
-
"rp",
|
|
79
|
-
"rt",
|
|
80
|
-
"ruby",
|
|
81
|
-
"s",
|
|
82
|
-
"samp",
|
|
83
|
-
"search",
|
|
84
|
-
"section",
|
|
85
|
-
"select",
|
|
86
|
-
"small",
|
|
87
|
-
"source",
|
|
88
|
-
"span",
|
|
89
|
-
"strong",
|
|
90
|
-
"sub",
|
|
91
|
-
"summary",
|
|
92
|
-
"sup",
|
|
93
|
-
"table",
|
|
94
|
-
"tbody",
|
|
95
|
-
"td",
|
|
96
|
-
"template",
|
|
97
|
-
"textarea",
|
|
98
|
-
"tfoot",
|
|
99
|
-
"th",
|
|
100
|
-
"thead",
|
|
101
|
-
"time",
|
|
102
|
-
"tr",
|
|
103
|
-
"track",
|
|
104
|
-
"u",
|
|
105
|
-
"ul",
|
|
106
|
-
"var",
|
|
107
|
-
"video",
|
|
108
|
-
"wbr"
|
|
109
|
-
]);
|
|
6
|
+
var HTML_ELEMENTS = new Set("a abbr address area article aside audio b bdi bdo blockquote br button canvas caption cite code col colgroup data datalist dd del details dfn dialog div dl dt em embed fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 header hgroup hr i iframe img input ins kbd label legend li main map mark menu meter nav noscript object ol optgroup option output p picture pre progress q rp rt ruby s samp search section select small source span strong sub summary sup table tbody td template textarea tfoot th thead time tr track u ul var video wbr".split(" "));
|
|
110
7
|
var TAG_OF_DOM_INTERFACE = {
|
|
111
8
|
HTMLAnchorElement: "a",
|
|
112
9
|
HTMLAreaElement: "area",
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ProbeFn } from './rules/lib/probe.js';
|
|
2
|
+
import { type Tier } from './rules/lib/tiers.js';
|
|
2
3
|
export type Rule = {
|
|
3
4
|
create: (context: never) => Record<string, unknown>;
|
|
4
5
|
fixShape: string;
|
|
@@ -10,25 +11,15 @@ export type Rule = {
|
|
|
10
11
|
schema: unknown[];
|
|
11
12
|
type: string;
|
|
12
13
|
};
|
|
13
|
-
/**
|
|
14
|
-
* Present only on a rule whose REACH depends on an option. It answers with the smallest source
|
|
15
|
-
* that must fire the rule under the options it is handed, so a repo whose corpus carries no such
|
|
16
|
-
* file can still be shown the rule reaching something — and a rule with no probe that fires
|
|
17
|
-
* nowhere stays a failure, which is the whole point of the check that reads this.
|
|
18
|
-
*/
|
|
19
14
|
probe?: ProbeFn;
|
|
20
|
-
/**
|
|
21
|
-
* The engine this rule presumes, and the packages a workspace's manifest proves it with. Present
|
|
22
|
-
* only on a rule that reaches ONE engine: enabled where the engine is absent, it has zero
|
|
23
|
-
* possible findings and reads exactly like compliance (#159). Declared once in `presets.ts`.
|
|
24
|
-
*/
|
|
25
15
|
presumes?: {
|
|
26
16
|
engine: string;
|
|
27
17
|
packages: readonly string[];
|
|
28
18
|
};
|
|
19
|
+
tier?: Tier;
|
|
29
20
|
};
|
|
30
21
|
export declare const rules: Record<string, Rule>;
|
|
31
|
-
export { PRESETS, RENAMED_TO, rulesOfPreset } from './presets.js';
|
|
22
|
+
export { PRESETS, presetSections, RENAMED_TO, rulesOfPreset } from './presets.js';
|
|
32
23
|
export type { Preset, PresetName } from './presets.js';
|
|
33
24
|
declare const plugin: {
|
|
34
25
|
configs: {
|
package/dist/index.js
CHANGED
|
@@ -1,182 +1,24 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
|
-
import { PRESETS, PRESUMED_ENGINES } from "./presets.js";
|
|
4
|
-
import
|
|
5
|
-
import boundaryTimeIsPrimitive from "./rules/boundary-time-is-primitive.js";
|
|
6
|
-
import cellMustBeStateful from "./rules/cell-must-be-stateful.js";
|
|
7
|
-
import cellMustNotComposeCell from "./rules/cell-must-not-compose-cell.js";
|
|
8
|
-
import cellNoCrossFeatureOrganelles from "./rules/cell-no-cross-feature-organelles.js";
|
|
9
|
-
import cellNoTissues from "./rules/cell-no-tissues.js";
|
|
10
|
-
import cellsFolderIndexIsBarrel from "./rules/cells-folder-index-is-barrel.js";
|
|
11
|
-
import compoundMustBeStateless from "./rules/compound-must-be-stateless.js";
|
|
12
|
-
import compoundNoStores from "./rules/compound-no-stores.js";
|
|
13
|
-
import constantsInConstantsFile from "./rules/constants-in-constants-file.js";
|
|
14
|
-
import dialectThroughTheSeam from "./rules/dialect-through-the-seam.js";
|
|
15
|
-
import durableBodyReadsThroughSteps from "./rules/durable-body-reads-through-steps.js";
|
|
16
|
-
import effectHookNaming from "./rules/effect-hook-naming.js";
|
|
17
|
-
import emitDeclaresAttempts from "./rules/emit-declares-attempts.js";
|
|
18
|
-
import fontRolesOnly from "./rules/font-roles-only.js";
|
|
19
|
-
import iconControlHasName from "./rules/icon-control-has-name.js";
|
|
20
|
-
import layerWalls from "./rules/layer-walls.js";
|
|
3
|
+
import { PRESETS, PRESUMED_ENGINES, TIER_RULES } from "./presets.js";
|
|
4
|
+
import { registered } from "./registry.js";
|
|
21
5
|
import { reportingOncePerRun } from "./rules/lib/options.js";
|
|
22
|
-
import
|
|
23
|
-
import
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
import noInertHiddenJsx from "./rules/no-inert-hidden-jsx.js";
|
|
39
|
-
import noInlineDataInJsx from "./rules/no-inline-data-in-jsx.js";
|
|
40
|
-
import noInvalidFeatureFolders from "./rules/no-invalid-feature-folders.js";
|
|
41
|
-
import noLoaderSideEffectInIndexFile from "./rules/no-loader-side-effect-in-index-file.js";
|
|
42
|
-
import noLogicInComponentFiles from "./rules/no-logic-in-component-files.js";
|
|
43
|
-
import noMockDbInIntegration from "./rules/no-mock-db-in-integration.js";
|
|
44
|
-
import noOrmOutsideDb from "./rules/no-orm-outside-db.js";
|
|
45
|
-
import noRawHtmlAtoms from "./rules/no-raw-html-atoms.js";
|
|
46
|
-
import noRawSqlOutsideAllowed from "./rules/no-raw-sql-outside-allowed.js";
|
|
47
|
-
import noReactNamespace from "./rules/no-react-namespace.js";
|
|
48
|
-
import noRenamedHtmlProps from "./rules/no-renamed-html-props.js";
|
|
49
|
-
import noRenderPropReader from "./rules/no-render-prop-reader.js";
|
|
50
|
-
import noRuntimeDeadAffordance from "./rules/no-runtime-dead-affordance.js";
|
|
51
|
-
import noSwallowedCatch from "./rules/no-swallowed-catch.js";
|
|
52
|
-
import noTrivialWrapperComponent from "./rules/no-trivial-wrapper-component.js";
|
|
53
|
-
import noTsInBioFolders from "./rules/no-ts-in-bio-folders.js";
|
|
54
|
-
import noTypeDefinitionsInComponents from "./rules/no-type-definitions-in-components.js";
|
|
55
|
-
import noUnregisteredPluginDir from "./rules/no-unregistered-plugin-dir.js";
|
|
56
|
-
import noVoidPort from "./rules/no-void-port.js";
|
|
57
|
-
import organelleDependency from "./rules/organelle-dependency.js";
|
|
58
|
-
import organelleSingleSource from "./rules/organelle-single-source.js";
|
|
59
|
-
import pluginRouteNamespaced from "./rules/plugin-route-namespaced.js";
|
|
60
|
-
import queriesRequireOrgScope from "./rules/queries-require-org-scope.js";
|
|
61
|
-
import queueLoopIsTheLibrary from "./rules/queue-loop-is-the-library.js";
|
|
62
|
-
import routeNoInlineMutation from "./rules/route-no-inline-mutation.js";
|
|
63
|
-
import routerSchemaParity from "./rules/router-schema-parity.js";
|
|
64
|
-
import serviceNameNotReserved from "./rules/service-name-not-reserved.js";
|
|
65
|
-
import ssotNoInlineFacts from "./rules/ssot-no-inline-facts.js";
|
|
66
|
-
import ssotNoProcessEnv from "./rules/ssot-no-process-env.js";
|
|
67
|
-
import stepDeclaresCompensationOrNone from "./rules/step-declares-compensation-or-none.js";
|
|
68
|
-
import stepOpensItsOwnCell from "./rules/step-opens-its-own-cell.js";
|
|
69
|
-
import storeRouteScopesTenantData from "./rules/store-route-scopes-tenant-data.js";
|
|
70
|
-
import subpathOverBarrel from "./rules/subpath-over-barrel.js";
|
|
71
|
-
import subscriberDeclaresId from "./rules/subscriber-declares-id.js";
|
|
72
|
-
import tablesDeclareTheirPlane from "./rules/tables-declare-their-plane.js";
|
|
73
|
-
import tenantTablesCarryOrgId from "./rules/tenant-tables-carry-org-id.js";
|
|
74
|
-
import testNoClockPollingForPromiseFlips from "./rules/test-no-clock-polling-for-promise-flips.js";
|
|
75
|
-
import timeThroughTheDoor from "./rules/time-through-the-door.js";
|
|
76
|
-
import tissueMustCompose from "./rules/tissue-must-compose.js";
|
|
77
|
-
import tissueNoDataProps from "./rules/tissue-no-data-props.js";
|
|
78
|
-
import tissueNoHooks from "./rules/tissue-no-hooks.js";
|
|
79
|
-
import tissueNoOrganelles from "./rules/tissue-no-organelles.js";
|
|
80
|
-
import tissueNoStores from "./rules/tissue-no-stores.js";
|
|
81
|
-
import todoNamesItsPlan from "./rules/todo-names-its-plan.js";
|
|
82
|
-
import tokensOnlyColors from "./rules/tokens-only-colors.js";
|
|
83
|
-
import uniqueQueryStepName from "./rules/unique-query-step-name.js";
|
|
84
|
-
import workerHandlesAreScoped from "./rules/worker-handles-are-scoped.js";
|
|
85
|
-
import zustandV5BestPractices from "./rules/zustand-v5-best-practices.js";
|
|
86
|
-
import { PRESETS as PRESETS2, RENAMED_TO, rulesOfPreset } from "./presets.js";
|
|
87
|
-
var reportingOnce = (declared) => Object.fromEntries(Object.entries(declared).map(([name, rule]) => [
|
|
88
|
-
name,
|
|
89
|
-
{ ...rule, create: reportingOncePerRun(rule.create) }
|
|
90
|
-
]));
|
|
91
|
-
var withEngines = (declared) => {
|
|
92
|
-
const presumed = new Map(PRESUMED_ENGINES.flatMap((one) => one.rules.map((name) => [name, { engine: one.engine, packages: one.packages }])));
|
|
93
|
-
return Object.fromEntries(Object.entries(declared).map(([name, rule]) => {
|
|
94
|
-
const engine = presumed.get(name);
|
|
95
|
-
return [name, engine === undefined ? rule : { ...rule, presumes: engine }];
|
|
96
|
-
}));
|
|
97
|
-
};
|
|
98
|
-
var rules = reportingOnce(withEngines({
|
|
99
|
-
"atom-no-deps": atomNoDeps,
|
|
100
|
-
"boundary-time-is-primitive": boundaryTimeIsPrimitive,
|
|
101
|
-
"cell-must-be-stateful": cellMustBeStateful,
|
|
102
|
-
"cell-must-not-compose-cell": cellMustNotComposeCell,
|
|
103
|
-
"cell-no-cross-feature-organelles": cellNoCrossFeatureOrganelles,
|
|
104
|
-
"cell-no-tissues": cellNoTissues,
|
|
105
|
-
"cells-folder-index-is-barrel": cellsFolderIndexIsBarrel,
|
|
106
|
-
"compound-must-be-stateless": compoundMustBeStateless,
|
|
107
|
-
"compound-no-stores": compoundNoStores,
|
|
108
|
-
"constants-in-constants-file": constantsInConstantsFile,
|
|
109
|
-
"dialect-through-the-seam": dialectThroughTheSeam,
|
|
110
|
-
"durable-body-reads-through-steps": durableBodyReadsThroughSteps,
|
|
111
|
-
"effect-hook-naming": effectHookNaming,
|
|
112
|
-
"emit-declares-attempts": emitDeclaresAttempts,
|
|
113
|
-
"font-roles-only": fontRolesOnly,
|
|
114
|
-
"icon-control-has-name": iconControlHasName,
|
|
115
|
-
"layer-walls": layerWalls,
|
|
116
|
-
"list-take-without-order": listTakeWithoutOrder,
|
|
117
|
-
"max-comment-density": maxCommentDensity,
|
|
118
|
-
"molecule-atoms-only": moleculeAtomsOnly,
|
|
119
|
-
"molecule-must-compose": moleculeMustCompose,
|
|
120
|
-
"mutating-step-declares-retry": mutatingStepDeclaresRetry,
|
|
121
|
-
"plugin-route-namespaced": pluginRouteNamespaced,
|
|
122
|
-
"route-no-inline-mutation": routeNoInlineMutation,
|
|
123
|
-
"unique-query-step-name": uniqueQueryStepName,
|
|
124
|
-
"named-when-block": namedWhenBlock,
|
|
125
|
-
"next-route-segment-is-thin-delegate": nextRouteSegmentIsThinDelegate,
|
|
126
|
-
"no-brand-names": noBrandNames,
|
|
127
|
-
"no-card-shaped-div": noCardShapedDiv,
|
|
128
|
-
"no-cross-feature-stores": noCrossFeatureStores,
|
|
129
|
-
"no-d1-transaction": noD1Transaction,
|
|
130
|
-
"no-date-string-compare": noDateStringCompare,
|
|
131
|
-
"no-duplicate-jsx-patterns": noDuplicateJsxPatterns,
|
|
132
|
-
"no-generic-utility-package": noGenericUtilityPackage,
|
|
133
|
-
"no-hook-in-component-disguise": noHookInComponentDisguise,
|
|
134
|
-
"no-index-count-as-exact": noIndexCountAsExact,
|
|
135
|
-
"no-inert-hidden-jsx": noInertHiddenJsx,
|
|
136
|
-
"no-inline-data-in-jsx": noInlineDataInJsx,
|
|
137
|
-
"no-invalid-feature-folders": noInvalidFeatureFolders,
|
|
138
|
-
"no-loader-side-effect-in-index-file": noLoaderSideEffectInIndexFile,
|
|
139
|
-
"no-logic-in-component-files": noLogicInComponentFiles,
|
|
140
|
-
"no-mock-db-in-integration": noMockDbInIntegration,
|
|
141
|
-
"no-orm-outside-db": noOrmOutsideDb,
|
|
142
|
-
"no-raw-html-atoms": noRawHtmlAtoms,
|
|
143
|
-
"no-raw-sql-outside-allowed": noRawSqlOutsideAllowed,
|
|
144
|
-
"no-react-namespace": noReactNamespace,
|
|
145
|
-
"no-renamed-html-props": noRenamedHtmlProps,
|
|
146
|
-
"no-render-prop-reader": noRenderPropReader,
|
|
147
|
-
"no-swallowed-catch": noSwallowedCatch,
|
|
148
|
-
"no-runtime-dead-affordance": noRuntimeDeadAffordance,
|
|
149
|
-
"no-trivial-wrapper-component": noTrivialWrapperComponent,
|
|
150
|
-
"no-ts-in-bio-folders": noTsInBioFolders,
|
|
151
|
-
"no-type-definitions-in-components": noTypeDefinitionsInComponents,
|
|
152
|
-
"no-unregistered-plugin-dir": noUnregisteredPluginDir,
|
|
153
|
-
"no-void-port": noVoidPort,
|
|
154
|
-
"organelle-dependency": organelleDependency,
|
|
155
|
-
"organelle-single-source": organelleSingleSource,
|
|
156
|
-
"queries-require-org-scope": queriesRequireOrgScope,
|
|
157
|
-
"queue-loop-is-the-library": queueLoopIsTheLibrary,
|
|
158
|
-
"router-schema-parity": routerSchemaParity,
|
|
159
|
-
"service-name-not-reserved": serviceNameNotReserved,
|
|
160
|
-
"ssot-no-inline-facts": ssotNoInlineFacts,
|
|
161
|
-
"ssot-no-process-env": ssotNoProcessEnv,
|
|
162
|
-
"step-declares-compensation-or-none": stepDeclaresCompensationOrNone,
|
|
163
|
-
"step-opens-its-own-cell": stepOpensItsOwnCell,
|
|
164
|
-
"store-route-scopes-tenant-data": storeRouteScopesTenantData,
|
|
165
|
-
"subpath-over-barrel": subpathOverBarrel,
|
|
166
|
-
"subscriber-declares-id": subscriberDeclaresId,
|
|
167
|
-
"tables-declare-their-plane": tablesDeclareTheirPlane,
|
|
168
|
-
"tenant-tables-carry-org-id": tenantTablesCarryOrgId,
|
|
169
|
-
"test-no-clock-polling-for-promise-flips": testNoClockPollingForPromiseFlips,
|
|
170
|
-
"time-through-the-door": timeThroughTheDoor,
|
|
171
|
-
"tokens-only-colors": tokensOnlyColors,
|
|
172
|
-
"tissue-must-compose": tissueMustCompose,
|
|
173
|
-
"tissue-no-data-props": tissueNoDataProps,
|
|
174
|
-
"tissue-no-hooks": tissueNoHooks,
|
|
175
|
-
"tissue-no-organelles": tissueNoOrganelles,
|
|
176
|
-
"tissue-no-stores": tissueNoStores,
|
|
177
|
-
"todo-names-its-plan": todoNamesItsPlan,
|
|
178
|
-
"worker-handles-are-scoped": workerHandlesAreScoped,
|
|
179
|
-
"zustand-v5-best-practices": zustandV5BestPractices
|
|
6
|
+
import { TIERS } from "./rules/lib/tiers.js";
|
|
7
|
+
import { PRESETS as PRESETS2, presetSections, RENAMED_TO, rulesOfPreset } from "./presets.js";
|
|
8
|
+
var presumed = new Map(PRESUMED_ENGINES.flatMap((one) => one.rules.map((name) => [name, { engine: one.engine, packages: one.packages }])));
|
|
9
|
+
var reached = new Map(TIERS.flatMap((tier) => TIER_RULES[tier].map((name) => [name, tier])));
|
|
10
|
+
var rules = Object.fromEntries(Object.entries(registered).map(([name, rule]) => {
|
|
11
|
+
const presumes = presumed.get(name);
|
|
12
|
+
const tier = reached.get(name);
|
|
13
|
+
return [
|
|
14
|
+
name,
|
|
15
|
+
{
|
|
16
|
+
...rule,
|
|
17
|
+
...presumes === undefined ? {} : { presumes },
|
|
18
|
+
...tier === undefined ? {} : { tier },
|
|
19
|
+
create: reportingOncePerRun(rule.create, name)
|
|
20
|
+
}
|
|
21
|
+
];
|
|
180
22
|
}));
|
|
181
23
|
var { version } = createRequire(import.meta.url)("../package.json");
|
|
182
24
|
var plugin = {
|
|
@@ -192,6 +34,7 @@ export {
|
|
|
192
34
|
PRESETS2 as PRESETS,
|
|
193
35
|
RENAMED_TO,
|
|
194
36
|
src_default as default,
|
|
37
|
+
presetSections,
|
|
195
38
|
rules,
|
|
196
39
|
rulesOfPreset
|
|
197
40
|
};
|
package/dist/presets.d.ts
CHANGED
|
@@ -1,30 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
* #197: the preset was named after `sagaflow-js`, which `@geonosis/workflows` replaced. A config
|
|
3
|
-
* naming the old name resolves to the same rules until the next major — a rename that breaks every
|
|
4
|
-
* consumer's config the day it ships is a rename nobody adopts — and the reading says so ONCE per
|
|
5
|
-
* process, whatever door read it and however many rules it resolved.
|
|
6
|
-
*/
|
|
1
|
+
import type { Tier } from './rules/lib/tiers.js';
|
|
7
2
|
export declare const RENAMED_TO: Record<string, string>;
|
|
8
3
|
export type Preset = {
|
|
9
|
-
/** Rule ids that belong to this preset but are not ours — enabled alongside, never instead. */
|
|
10
4
|
rules: Record<string, string>;
|
|
11
5
|
};
|
|
12
|
-
/**
|
|
13
|
-
* The engine a rule PRESUMES, and the packages a manifest proves it with.
|
|
14
|
-
*
|
|
15
|
-
* A rule that presumes an engine can sit at "error" over a tree that has none, with zero possible
|
|
16
|
-
* findings, and read exactly like compliance — a Workers + D1 app ran three of these over sagaflow trees
|
|
17
|
-
* (#159). It is written down ONCE, here beside the presets that already knew it, and projected onto
|
|
18
|
-
* the rules so `geonosis-doctor` can ask a workspace's manifest without carrying a second list.
|
|
19
|
-
*
|
|
20
|
-
* The two step rules that appear in `backend-workflows` as well are deliberately NOT here: 026-W2
|
|
21
|
-
* measured them reaching both engines' spellings, and a rule that reaches both presumes neither.
|
|
22
|
-
*/
|
|
23
6
|
export declare const PRESUMED_ENGINES: readonly {
|
|
24
7
|
engine: string;
|
|
25
8
|
packages: readonly string[];
|
|
26
9
|
rules: readonly string[];
|
|
27
10
|
}[];
|
|
11
|
+
export declare const TIER_RULES: Record<Tier, readonly string[]>;
|
|
28
12
|
export declare const PRESETS: {
|
|
29
13
|
'backend-d1': {
|
|
30
14
|
rules: Record<string, "error">;
|
|
@@ -74,5 +58,13 @@ export declare const PRESETS: {
|
|
|
74
58
|
};
|
|
75
59
|
};
|
|
76
60
|
export type PresetName = keyof typeof PRESETS;
|
|
77
|
-
/** The rule names a preset carries, stripped of the plugin namespace. */
|
|
78
61
|
export declare const rulesOfPreset: (preset: PresetName) => string[];
|
|
62
|
+
export type PresetDoc = {
|
|
63
|
+
blurb: string;
|
|
64
|
+
order: number;
|
|
65
|
+
};
|
|
66
|
+
export declare const presetSections: () => {
|
|
67
|
+
blurb: string;
|
|
68
|
+
name: PresetName;
|
|
69
|
+
order: number;
|
|
70
|
+
}[];
|
package/dist/presets.js
CHANGED
|
@@ -34,6 +34,7 @@ var FRONTEND = [
|
|
|
34
34
|
"organelle-single-source",
|
|
35
35
|
"tissue-must-compose",
|
|
36
36
|
"tissue-no-data-props",
|
|
37
|
+
"tissue-no-fetch",
|
|
37
38
|
"tissue-no-hooks",
|
|
38
39
|
"tissue-no-organelles",
|
|
39
40
|
"tissue-no-stores",
|
|
@@ -84,18 +85,22 @@ var BACKEND_MEDUSA = [
|
|
|
84
85
|
"subscriber-declares-id",
|
|
85
86
|
"unique-query-step-name"
|
|
86
87
|
];
|
|
88
|
+
var WORKFLOW_RULES = new Set(BACKEND_WORKFLOWS);
|
|
87
89
|
var FAILURE_PATHS = ["no-swallowed-catch"];
|
|
88
90
|
var INTEGRATIONS = ["no-unregistered-plugin-dir"];
|
|
89
91
|
var BACKEND_TRPC = ["router-schema-parity"];
|
|
90
92
|
var TENANT_SCOPING = [
|
|
91
93
|
"queries-require-org-scope",
|
|
92
|
-
"store-route-scopes-tenant-data",
|
|
93
94
|
"tables-declare-their-plane",
|
|
94
95
|
"tenant-tables-carry-org-id"
|
|
95
96
|
];
|
|
96
97
|
var TOOLING = ["layer-walls", "no-generic-utility-package", "todo-names-its-plan"];
|
|
97
98
|
var THEMEKIT = ["font-roles-only", "tokens-only-colors"];
|
|
98
|
-
var TESTBED = [
|
|
99
|
+
var TESTBED = [
|
|
100
|
+
"hermetic-e2e-no-wall-clock-waits",
|
|
101
|
+
"no-mock-db-in-integration",
|
|
102
|
+
"test-no-clock-polling-for-promise-flips"
|
|
103
|
+
];
|
|
99
104
|
var PACKAGE_SUBPATHS = ["subpath-over-barrel"];
|
|
100
105
|
var RULE_PREFIX = "biological-architecture";
|
|
101
106
|
var asRules = (names) => Object.fromEntries(names.map((name) => [`${RULE_PREFIX}/${name}`, "error"]));
|
|
@@ -109,9 +114,30 @@ var PRESUMED_ENGINES = [
|
|
|
109
114
|
{
|
|
110
115
|
engine: "Medusa",
|
|
111
116
|
packages: ["@medusajs/framework", "@medusajs/medusa", "@medusajs/utils"],
|
|
112
|
-
rules: BACKEND_MEDUSA.filter((name) => !
|
|
117
|
+
rules: BACKEND_MEDUSA.filter((name) => !WORKFLOW_RULES.has(name))
|
|
113
118
|
}
|
|
114
119
|
];
|
|
120
|
+
var TIER_RULES = {
|
|
121
|
+
atoms: ["atom-no-deps"],
|
|
122
|
+
cells: [
|
|
123
|
+
"cell-must-be-stateful",
|
|
124
|
+
"cell-must-not-compose-cell",
|
|
125
|
+
"cell-no-cross-feature-organelles",
|
|
126
|
+
"cell-no-tissues",
|
|
127
|
+
"cells-folder-index-is-barrel"
|
|
128
|
+
],
|
|
129
|
+
compounds: ["compound-must-be-stateless", "compound-no-stores"],
|
|
130
|
+
molecules: ["molecule-atoms-only", "molecule-must-compose"],
|
|
131
|
+
organelles: ["organelle-dependency", "organelle-single-source"],
|
|
132
|
+
tissues: [
|
|
133
|
+
"tissue-must-compose",
|
|
134
|
+
"tissue-no-data-props",
|
|
135
|
+
"tissue-no-fetch",
|
|
136
|
+
"tissue-no-hooks",
|
|
137
|
+
"tissue-no-organelles",
|
|
138
|
+
"tissue-no-stores"
|
|
139
|
+
]
|
|
140
|
+
};
|
|
115
141
|
var PRESETS = {
|
|
116
142
|
"backend-d1": { rules: asRules(BACKEND_D1) },
|
|
117
143
|
"backend-medusa": { rules: asRules(BACKEND_MEDUSA) },
|
|
@@ -136,9 +162,68 @@ var PRESETS = {
|
|
|
136
162
|
tooling: { rules: asRules(TOOLING) }
|
|
137
163
|
};
|
|
138
164
|
var rulesOfPreset = (preset) => Object.keys(PRESETS[preset].rules).filter((id) => id.startsWith(`${RULE_PREFIX}/`)).map((id) => id.slice(RULE_PREFIX.length + 1));
|
|
165
|
+
var SECTIONS = {
|
|
166
|
+
frontend: {
|
|
167
|
+
blurb: "The tier rules every React repo gets. `recommended` is this preset.",
|
|
168
|
+
order: 1
|
|
169
|
+
},
|
|
170
|
+
"backend-workflows": {
|
|
171
|
+
blurb: "Workflows, the data layer, and single-source-of-truth. Storage-engine facts live in `backend-d1`.",
|
|
172
|
+
order: 2
|
|
173
|
+
},
|
|
174
|
+
"backend-d1": {
|
|
175
|
+
blurb: "Cloudflare D1 and cell-worker facts. False on any other engine — enable per repo.",
|
|
176
|
+
order: 3
|
|
177
|
+
},
|
|
178
|
+
"backend-workflows-cf": {
|
|
179
|
+
blurb: "The org workflow engine on Cloudflare Workflows. False next door — an inline run never hibernates.",
|
|
180
|
+
order: 4
|
|
181
|
+
},
|
|
182
|
+
"backend-medusa": { blurb: "Medusa's storefront route surface.", order: 5 },
|
|
183
|
+
"backend-trpc": {
|
|
184
|
+
blurb: "The router/schema mirror. A layout convention, not a framework fact — both directories are options, and in one consumer they are in different packages.",
|
|
185
|
+
order: 6
|
|
186
|
+
},
|
|
187
|
+
integrations: {
|
|
188
|
+
blurb: "The integration seam. Enforces nothing until the repo says where its plugin directories live and which file registers them.",
|
|
189
|
+
order: 7
|
|
190
|
+
},
|
|
191
|
+
"package-subpaths": {
|
|
192
|
+
blurb: "Where a package's names are imported from. The map is each of the repo's own packages' `exports`, read off disk; `packages` overrides it per package.",
|
|
193
|
+
order: 8
|
|
194
|
+
},
|
|
195
|
+
"tenant-scoping": {
|
|
196
|
+
blurb: "Every row placed, scoped and narrowed to one organisation.",
|
|
197
|
+
order: 9
|
|
198
|
+
},
|
|
199
|
+
themekit: {
|
|
200
|
+
blurb: "Conformance with a themekit: the component library never hardcodes what the theme decides. Inert until the repo says how its own tokens are spelled.",
|
|
201
|
+
order: 10
|
|
202
|
+
},
|
|
203
|
+
testbed: {
|
|
204
|
+
blurb: "The harness. Enforces nothing until the repo says where its integration suites live and what its database module is called.",
|
|
205
|
+
order: 11
|
|
206
|
+
},
|
|
207
|
+
"comment-ceiling": {
|
|
208
|
+
blurb: "The comment posture. Opt in per repo — the two source repos were defensible and opposite.",
|
|
209
|
+
order: 12
|
|
210
|
+
},
|
|
211
|
+
"failure-paths": {
|
|
212
|
+
blurb: "The modules a repo cannot afford to fail quietly on. Requires `paths` — which of them fetch and refresh; enabled without it the rule reports that once a run and judges nothing.",
|
|
213
|
+
order: 13
|
|
214
|
+
},
|
|
215
|
+
tooling: {
|
|
216
|
+
blurb: "A repo's own layers, walled. Enforces nothing until the walls are declared.",
|
|
217
|
+
order: 14
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
var isPresetName = (name) => (name in PRESETS);
|
|
221
|
+
var presetSections = () => Object.entries(SECTIONS).flatMap(([name, doc]) => isPresetName(name) ? [{ ...doc, name }] : []).toSorted((a, b) => a.order - b.order);
|
|
139
222
|
export {
|
|
140
223
|
PRESETS,
|
|
141
224
|
PRESUMED_ENGINES,
|
|
142
225
|
RENAMED_TO,
|
|
226
|
+
TIER_RULES,
|
|
227
|
+
presetSections,
|
|
143
228
|
rulesOfPreset
|
|
144
229
|
};
|