pasika 0.5.15 → 0.5.17
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/README.md +3 -3
- package/dist/eslint/pasika/index.js +53 -50
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,10 +9,10 @@ Documentation, the lint rules derived from it, and the checks that apply and dia
|
|
|
9
9
|
```text
|
|
10
10
|
docs/
|
|
11
11
|
repository-policy.md # repo-wide code and documentation requirements (Policy)
|
|
12
|
-
|
|
12
|
+
next-codebase-guide/ # placement, extraction, module conventions
|
|
13
13
|
documentation-guide/ # how documents themselves are written
|
|
14
14
|
pasika-adoption-guide/ # adopting and updating the framework
|
|
15
|
-
|
|
15
|
+
next-tailwind-guide/ # Tailwind theme, composition, variants, states
|
|
16
16
|
scripts/
|
|
17
17
|
registry.json # requirement → enforcement, keyed by content hash
|
|
18
18
|
coverage.ts # reconciles the docs against the registry
|
|
@@ -39,7 +39,7 @@ Requirements are identified by a hash of their canonical text, not by a hand-wri
|
|
|
39
39
|
|
|
40
40
|
```jsonc
|
|
41
41
|
{
|
|
42
|
-
"doc": "
|
|
42
|
+
"doc": "next-codebase-guide/rules/no-mixed-concerns-rule.md",
|
|
43
43
|
"text": "A .tsx file that defines a component MUST contain exactly one component.",
|
|
44
44
|
"hash": "b19fe3bd34",
|
|
45
45
|
"ref": "pasika/no-mixed-concerns",
|
|
@@ -395,7 +395,7 @@ var noMixedConcernsRule = {
|
|
|
395
395
|
for (const extra of components.slice(1)) {
|
|
396
396
|
context.report({
|
|
397
397
|
loc: { line: 1, column: 0 },
|
|
398
|
-
message: `File defines multiple components. "${extra.name}" is an extra component. Move it to its own file. Each component file MUST define exactly one component. See docs/
|
|
398
|
+
message: `File defines multiple components. "${extra.name}" is an extra component. Move it to its own file. Each component file MUST define exactly one component. See docs/next-codebase-guide/rules/no-mixed-concerns-rule.md`
|
|
399
399
|
});
|
|
400
400
|
}
|
|
401
401
|
}
|
|
@@ -421,7 +421,7 @@ var noArbitraryTailwindRule = {
|
|
|
421
421
|
if (!match) return;
|
|
422
422
|
context.report({
|
|
423
423
|
node,
|
|
424
|
-
message: `Tailwind arbitrary-value class "${match[0]}" is not allowed. Use a named token or custom utility. See docs/
|
|
424
|
+
message: `Tailwind arbitrary-value class "${match[0]}" is not allowed. Use a named token or custom utility. See docs/next-tailwind-guide/rules/arbitrary-value-rule.md`
|
|
425
425
|
});
|
|
426
426
|
}
|
|
427
427
|
function checkExpression(node, expression) {
|
|
@@ -1178,7 +1178,7 @@ var enforceCnMergeRule = {
|
|
|
1178
1178
|
if (isComponentProp && attributeName !== "className" && attributeName.endsWith("ClassName")) {
|
|
1179
1179
|
context.report({
|
|
1180
1180
|
node,
|
|
1181
|
-
message: "Expose appearance through typed variant props instead of separate internal class-name props. See docs/
|
|
1181
|
+
message: "Expose appearance through typed variant props instead of separate internal class-name props. See docs/next-tailwind-guide/rules/class-composition-rule.md"
|
|
1182
1182
|
});
|
|
1183
1183
|
return;
|
|
1184
1184
|
}
|
|
@@ -1192,7 +1192,7 @@ var enforceCnMergeRule = {
|
|
|
1192
1192
|
if (invalidClass) {
|
|
1193
1193
|
context.report({
|
|
1194
1194
|
node,
|
|
1195
|
-
message: `Passed className contains non-layout utility "${invalidClass}". Expose appearance through typed variant props. See docs/
|
|
1195
|
+
message: `Passed className contains non-layout utility "${invalidClass}". Expose appearance through typed variant props. See docs/next-tailwind-guide/rules/class-composition-rule.md`
|
|
1196
1196
|
});
|
|
1197
1197
|
}
|
|
1198
1198
|
return;
|
|
@@ -1201,7 +1201,7 @@ var enforceCnMergeRule = {
|
|
|
1201
1201
|
if (classCount(valueNode.value) > 5) {
|
|
1202
1202
|
context.report({
|
|
1203
1203
|
node,
|
|
1204
|
-
message: "Static className with more than 5 classes must use cn() with grouped string literals. See docs/
|
|
1204
|
+
message: "Static className with more than 5 classes must use cn() with grouped string literals. See docs/next-tailwind-guide/rules/class-composition-rule.md"
|
|
1205
1205
|
});
|
|
1206
1206
|
}
|
|
1207
1207
|
return;
|
|
@@ -1211,28 +1211,28 @@ var enforceCnMergeRule = {
|
|
|
1211
1211
|
if (expr.type === "BinaryExpression" && expr.operator === "+") {
|
|
1212
1212
|
context.report({
|
|
1213
1213
|
node,
|
|
1214
|
-
message: "Use cn() instead of + operator for className. See docs/
|
|
1214
|
+
message: "Use cn() instead of + operator for className. See docs/next-tailwind-guide/rules/class-composition-rule.md"
|
|
1215
1215
|
});
|
|
1216
1216
|
return;
|
|
1217
1217
|
}
|
|
1218
1218
|
if (expr.type === "TemplateLiteral" && expr.expressions.length > 0) {
|
|
1219
1219
|
context.report({
|
|
1220
1220
|
node,
|
|
1221
|
-
message: "Use cn() instead of template literals with conditionals for className. See docs/
|
|
1221
|
+
message: "Use cn() instead of template literals with conditionals for className. See docs/next-tailwind-guide/rules/class-composition-rule.md"
|
|
1222
1222
|
});
|
|
1223
1223
|
return;
|
|
1224
1224
|
}
|
|
1225
1225
|
if (expr.type === "LogicalExpression" || expr.type === "ConditionalExpression") {
|
|
1226
1226
|
context.report({
|
|
1227
1227
|
node,
|
|
1228
|
-
message: "Use cn() for conditional classes in className. See docs/
|
|
1228
|
+
message: "Use cn() for conditional classes in className. See docs/next-tailwind-guide/rules/class-composition-rule.md"
|
|
1229
1229
|
});
|
|
1230
1230
|
return;
|
|
1231
1231
|
}
|
|
1232
1232
|
if (expr.type === "Literal" && typeof expr.value === "string" && classCount(expr.value) > 5) {
|
|
1233
1233
|
context.report({
|
|
1234
1234
|
node,
|
|
1235
|
-
message: "Static className with more than 5 classes must use cn() with grouped string literals. See docs/
|
|
1235
|
+
message: "Static className with more than 5 classes must use cn() with grouped string literals. See docs/next-tailwind-guide/rules/class-composition-rule.md"
|
|
1236
1236
|
});
|
|
1237
1237
|
return;
|
|
1238
1238
|
}
|
|
@@ -1241,7 +1241,7 @@ var enforceCnMergeRule = {
|
|
|
1241
1241
|
if (arg.type === "Literal" && typeof arg.value === "string" && classCount(arg.value) > 5) {
|
|
1242
1242
|
context.report({
|
|
1243
1243
|
node: arg,
|
|
1244
|
-
message: "Each cn() string argument must contain at most 5 class names. Group by styling concern. See docs/
|
|
1244
|
+
message: "Each cn() string argument must contain at most 5 class names. Group by styling concern. See docs/next-tailwind-guide/rules/class-composition-rule.md"
|
|
1245
1245
|
});
|
|
1246
1246
|
}
|
|
1247
1247
|
}
|
|
@@ -1339,7 +1339,7 @@ var enforceCvaVariantPropsRule = {
|
|
|
1339
1339
|
if (variantNames.includes(keyName2)) {
|
|
1340
1340
|
context.report({
|
|
1341
1341
|
node,
|
|
1342
|
-
message: `Variant prop "${keyName2}" duplicates CVA variant values. Use VariantProps<typeof variants> instead of manually writing union types. See docs/
|
|
1342
|
+
message: `Variant prop "${keyName2}" duplicates CVA variant values. Use VariantProps<typeof variants> instead of manually writing union types. See docs/next-tailwind-guide/rules/component-variant-rule.md`
|
|
1343
1343
|
});
|
|
1344
1344
|
return;
|
|
1345
1345
|
}
|
|
@@ -1407,7 +1407,7 @@ var enforceBarrelExportsRule = {
|
|
|
1407
1407
|
if (!reExportedNames.has(parentName)) {
|
|
1408
1408
|
context.report({
|
|
1409
1409
|
loc: { line: 1, column: 0 },
|
|
1410
|
-
message: `index.ts in "${folderName}/" must re-export "${parentName}". See docs/
|
|
1410
|
+
message: `index.ts in "${folderName}/" must re-export "${parentName}". See docs/next-codebase-guide/rules/folder-nesting-rule.md`
|
|
1411
1411
|
});
|
|
1412
1412
|
return;
|
|
1413
1413
|
}
|
|
@@ -1415,7 +1415,7 @@ var enforceBarrelExportsRule = {
|
|
|
1415
1415
|
if (nonParentExports.length > 0) {
|
|
1416
1416
|
context.report({
|
|
1417
1417
|
loc: { line: 1, column: 0 },
|
|
1418
|
-
message: `index.ts must not re-export exclusive children: ${nonParentExports.join(", ")}. Only "${parentName}" may be re-exported. See docs/
|
|
1418
|
+
message: `index.ts must not re-export exclusive children: ${nonParentExports.join(", ")}. Only "${parentName}" may be re-exported. See docs/next-codebase-guide/rules/folder-nesting-rule.md`
|
|
1419
1419
|
});
|
|
1420
1420
|
}
|
|
1421
1421
|
}
|
|
@@ -1559,7 +1559,7 @@ var componentPlacementRule = {
|
|
|
1559
1559
|
context.report({
|
|
1560
1560
|
node,
|
|
1561
1561
|
loc: { line: 1, column: 0 },
|
|
1562
|
-
message: `This component has no consumer outside src/app/ or a configuration module, so it belongs in the feature folder it represents, not in ${formatFolder(currentFolder)}. See docs/
|
|
1562
|
+
message: `This component has no consumer outside src/app/ or a configuration module, so it belongs in the feature folder it represents, not in ${formatFolder(currentFolder)}. See docs/next-codebase-guide/rules/component-placement-rule.md`
|
|
1563
1563
|
});
|
|
1564
1564
|
}
|
|
1565
1565
|
return;
|
|
@@ -1570,7 +1570,7 @@ var componentPlacementRule = {
|
|
|
1570
1570
|
context.report({
|
|
1571
1571
|
node,
|
|
1572
1572
|
loc: { line: 1, column: 0 },
|
|
1573
|
-
message: `Move this component to ${formatFolder(placement.expectedFolder)} \u2014 ${explanation}. Imported by ${describeConsumers(placement.countedConsumers, sourceRoot)}. See docs/
|
|
1573
|
+
message: `Move this component to ${formatFolder(placement.expectedFolder)} \u2014 ${explanation}. Imported by ${describeConsumers(placement.countedConsumers, sourceRoot)}. See docs/next-codebase-guide/rules/component-placement-rule.md`
|
|
1574
1574
|
});
|
|
1575
1575
|
}
|
|
1576
1576
|
};
|
|
@@ -1857,7 +1857,7 @@ var namedExportsRule = {
|
|
|
1857
1857
|
ExportDefaultDeclaration(node) {
|
|
1858
1858
|
context.report({
|
|
1859
1859
|
node,
|
|
1860
|
-
message: "Files that export values must use named exports unless a framework or third-party package requires a different export style for that file. See docs/
|
|
1860
|
+
message: "Files that export values must use named exports unless a framework or third-party package requires a different export style for that file. See docs/next-codebase-guide/rules/exports-and-imports-rule.md"
|
|
1861
1861
|
});
|
|
1862
1862
|
}
|
|
1863
1863
|
};
|
|
@@ -1928,7 +1928,7 @@ var dataTestIdCaseRule = {
|
|
|
1928
1928
|
} else if (component.smart) {
|
|
1929
1929
|
context.report({
|
|
1930
1930
|
node,
|
|
1931
|
-
message: `Smart component "${component.name}" has no single outer element; wrap its content in one outer element with data-testid="${component.name}" instead of rendering multiple roots. See docs/
|
|
1931
|
+
message: `Smart component "${component.name}" has no single outer element; wrap its content in one outer element with data-testid="${component.name}" instead of rendering multiple roots. See docs/next-codebase-guide/rules/smart-vs-dumb-component-rule.md`
|
|
1932
1932
|
});
|
|
1933
1933
|
}
|
|
1934
1934
|
}
|
|
@@ -1986,7 +1986,7 @@ var supportFolderShapeRule = {
|
|
|
1986
1986
|
if (missing.length === 0) return;
|
|
1987
1987
|
context.report({
|
|
1988
1988
|
node,
|
|
1989
|
-
message: `${folder}/index.ts must named-re-export every support file: ${missing.join(", ")}. See docs/
|
|
1989
|
+
message: `${folder}/index.ts must named-re-export every support file: ${missing.join(", ")}. See docs/next-codebase-guide/rules/${folder === "constants" ? "constants" : "types-and-schemas"}-rule.md`
|
|
1990
1990
|
});
|
|
1991
1991
|
}
|
|
1992
1992
|
};
|
|
@@ -2021,7 +2021,7 @@ var importThroughIndexRule = {
|
|
|
2021
2021
|
const expected = `@/${folderIndex.join("/")}`;
|
|
2022
2022
|
context.report({
|
|
2023
2023
|
node,
|
|
2024
|
-
message: `Import support files through ${expected} instead of "${specifier}". See the
|
|
2024
|
+
message: `Import support files through ${expected} instead of "${specifier}". See the next-codebase-guide exports and imports rules.`
|
|
2025
2025
|
});
|
|
2026
2026
|
}
|
|
2027
2027
|
}
|
|
@@ -2108,7 +2108,7 @@ var noUtilBarrelRule = {
|
|
|
2108
2108
|
if (utilsIndex < 0 || !path19.basename(target).startsWith("index.")) continue;
|
|
2109
2109
|
context.report({
|
|
2110
2110
|
node,
|
|
2111
|
-
message: `Import utilities directly instead of through "${specifier}". See docs/
|
|
2111
|
+
message: `Import utilities directly instead of through "${specifier}". See docs/next-codebase-guide/rules/utilities-rule.md`
|
|
2112
2112
|
});
|
|
2113
2113
|
}
|
|
2114
2114
|
}
|
|
@@ -2207,7 +2207,7 @@ var jsxHygieneRule = {
|
|
|
2207
2207
|
if (!violation) return;
|
|
2208
2208
|
context.report({
|
|
2209
2209
|
node,
|
|
2210
|
-
message: `Extract ${violation} from JSX before return. See docs/
|
|
2210
|
+
message: `Extract ${violation} from JSX before return. See docs/next-codebase-guide/rules/jsx-hygiene-rule.md`
|
|
2211
2211
|
});
|
|
2212
2212
|
}
|
|
2213
2213
|
return {
|
|
@@ -2389,7 +2389,7 @@ var interactiveComponentRule = {
|
|
|
2389
2389
|
if (name === void 0) return;
|
|
2390
2390
|
context.report({
|
|
2391
2391
|
node,
|
|
2392
|
-
message: `Extract the interactive <${name}> into a descriptive component. See docs/
|
|
2392
|
+
message: `Extract the interactive <${name}> into a descriptive component. See docs/next-codebase-guide/rules/interactive-component-rule.md`
|
|
2393
2393
|
});
|
|
2394
2394
|
}
|
|
2395
2395
|
};
|
|
@@ -2453,7 +2453,7 @@ var uiStateRule = {
|
|
|
2453
2453
|
if (!hasNativeState) {
|
|
2454
2454
|
context.report({
|
|
2455
2455
|
node: attribute,
|
|
2456
|
-
message: `UI state prop "${name}" should be expressed with a native or ARIA state attribute. See docs/
|
|
2456
|
+
message: `UI state prop "${name}" should be expressed with a native or ARIA state attribute. See docs/next-tailwind-guide/rules/component-ui-state-rule.md`
|
|
2457
2457
|
});
|
|
2458
2458
|
}
|
|
2459
2459
|
}
|
|
@@ -2470,7 +2470,7 @@ var uiStateRule = {
|
|
|
2470
2470
|
if (classes.length > 0 && !classes.some((className) => STATE_CLASS_RE.test(className))) {
|
|
2471
2471
|
context.report({
|
|
2472
2472
|
node: attribute,
|
|
2473
|
-
message: "Use a Tailwind state variant for a UI state instead of conditional replacement classes. See docs/
|
|
2473
|
+
message: "Use a Tailwind state variant for a UI state instead of conditional replacement classes. See docs/next-tailwind-guide/rules/component-ui-state-rule.md"
|
|
2474
2474
|
});
|
|
2475
2475
|
}
|
|
2476
2476
|
}
|
|
@@ -2532,7 +2532,7 @@ var cvaAppearancePropsRule = {
|
|
|
2532
2532
|
if (typeAnnotation.type === "TSUnionType" || typeAnnotation.type === "TSTypeLiteral") {
|
|
2533
2533
|
context.report({
|
|
2534
2534
|
node,
|
|
2535
|
-
message: `Visual option prop "${keyName2}" must be defined through a cva() call rather than a manual union type. See docs/
|
|
2535
|
+
message: `Visual option prop "${keyName2}" must be defined through a cva() call rather than a manual union type. See docs/next-tailwind-guide/rules/component-variant-rule.md`
|
|
2536
2536
|
});
|
|
2537
2537
|
}
|
|
2538
2538
|
}
|
|
@@ -2606,7 +2606,7 @@ var cvaBooleanVariantsRule = {
|
|
|
2606
2606
|
if (info.variantNames.has(propName)) {
|
|
2607
2607
|
context.report({
|
|
2608
2608
|
node,
|
|
2609
|
-
message: `Boolean prop "${propName}" is used as a standalone conditional in cn() but is also defined as a CVA variant. Move it to one place: either CVA (with both true/false treatments) or cn() (standalone). See docs/
|
|
2609
|
+
message: `Boolean prop "${propName}" is used as a standalone conditional in cn() but is also defined as a CVA variant. Move it to one place: either CVA (with both true/false treatments) or cn() (standalone). See docs/next-tailwind-guide/rules/component-variant-rule.md`
|
|
2610
2610
|
});
|
|
2611
2611
|
}
|
|
2612
2612
|
}
|
|
@@ -2665,7 +2665,7 @@ var crossFeatureImportRule = {
|
|
|
2665
2665
|
const names = [...importedFeatures].sort().join(", ");
|
|
2666
2666
|
context.report({
|
|
2667
2667
|
node,
|
|
2668
|
-
message: `This component imports from two or more feature folders (${names}) and must live in src/compositions/. See docs/
|
|
2668
|
+
message: `This component imports from two or more feature folders (${names}) and must live in src/compositions/. See docs/next-codebase-guide/rules/component-placement-rule.md`
|
|
2669
2669
|
});
|
|
2670
2670
|
}
|
|
2671
2671
|
}
|
|
@@ -2713,7 +2713,7 @@ var pureFunctionExtractRule = {
|
|
|
2713
2713
|
function report3(node, name) {
|
|
2714
2714
|
context.report({
|
|
2715
2715
|
node,
|
|
2716
|
-
message: `Extract pure function "${name}" to utils/. See docs/
|
|
2716
|
+
message: `Extract pure function "${name}" to utils/. See docs/next-codebase-guide/rules/utilities-rule.md`
|
|
2717
2717
|
});
|
|
2718
2718
|
}
|
|
2719
2719
|
return {
|
|
@@ -2812,12 +2812,12 @@ var hookComplexityRule = {
|
|
|
2812
2812
|
if (imperativeCount >= 2 && !inSupportFolder) {
|
|
2813
2813
|
context.report({
|
|
2814
2814
|
node,
|
|
2815
|
-
message: `Hook "${name}" has ${String(imperativeCount)} imperative categories and must be extracted to a hooks/ folder. See docs/
|
|
2815
|
+
message: `Hook "${name}" has ${String(imperativeCount)} imperative categories and must be extracted to a hooks/ folder. See docs/next-codebase-guide/rules/hook-extraction-rule.md`
|
|
2816
2816
|
});
|
|
2817
2817
|
} else if (imperativeCount < 2 && inSupportFolder) {
|
|
2818
2818
|
context.report({
|
|
2819
2819
|
node,
|
|
2820
|
-
message: `Hook "${name}" has fewer than two imperative categories and must stay inline in its consumer file. See docs/
|
|
2820
|
+
message: `Hook "${name}" has fewer than two imperative categories and must stay inline in its consumer file. See docs/next-codebase-guide/rules/hook-extraction-rule.md`
|
|
2821
2821
|
});
|
|
2822
2822
|
}
|
|
2823
2823
|
}
|
|
@@ -2964,7 +2964,7 @@ var hookExtractionRule = {
|
|
|
2964
2964
|
context.report({
|
|
2965
2965
|
node,
|
|
2966
2966
|
loc: { line: exp.line, column: 0 },
|
|
2967
|
-
message: `Hook "${exp.name}" has ${String(consumers?.size ?? 0)} consumers; extract it to its own file in a hooks/ folder. See docs/
|
|
2967
|
+
message: `Hook "${exp.name}" has ${String(consumers?.size ?? 0)} consumers; extract it to its own file in a hooks/ folder. See docs/next-codebase-guide/rules/hook-extraction-rule.md`
|
|
2968
2968
|
});
|
|
2969
2969
|
}
|
|
2970
2970
|
}
|
|
@@ -2997,7 +2997,7 @@ var valueExtractionRule = {
|
|
|
2997
2997
|
context.report({
|
|
2998
2998
|
node,
|
|
2999
2999
|
loc: { line: 1, column: 0 },
|
|
3000
|
-
message: `This file in src/app/ is imported by ${describeConsumers(outsideApp, sourceRoot)} outside src/app/. Extract the value to a shared or feature folder so it can be imported independently. See docs/
|
|
3000
|
+
message: `This file in src/app/ is imported by ${describeConsumers(outsideApp, sourceRoot)} outside src/app/. Extract the value to a shared or feature folder so it can be imported independently. See docs/next-codebase-guide/rules/constants-rule.md`
|
|
3001
3001
|
});
|
|
3002
3002
|
}
|
|
3003
3003
|
};
|
|
@@ -3033,12 +3033,12 @@ var configExtractionRule = {
|
|
|
3033
3033
|
if (outsideConfig.length > 0) {
|
|
3034
3034
|
findings.push({
|
|
3035
3035
|
line: exp.line,
|
|
3036
|
-
message: `${exp.kind} "${exp.name}" in a configuration module is imported by ${describeConsumers(outsideConfig, sourceRoot)} outside src/config/. Move it to the matching root support folder. See docs/
|
|
3036
|
+
message: `${exp.kind} "${exp.name}" in a configuration module is imported by ${describeConsumers(outsideConfig, sourceRoot)} outside src/config/. Move it to the matching root support folder. See docs/next-codebase-guide/rules/configuration-rule.md`
|
|
3037
3037
|
});
|
|
3038
3038
|
} else if (consumers.length > 0) {
|
|
3039
3039
|
findings.push({
|
|
3040
3040
|
line: exp.line,
|
|
3041
|
-
message: `${exp.kind} "${exp.name}" is used only to implement this configuration module; extract it to the module's ${exp.kind === "schema" ? "schemas/" : "types/"} folder even with one consumer. See docs/
|
|
3041
|
+
message: `${exp.kind} "${exp.name}" is used only to implement this configuration module; extract it to the module's ${exp.kind === "schema" ? "schemas/" : "types/"} folder even with one consumer. See docs/next-codebase-guide/rules/configuration-rule.md`
|
|
3042
3042
|
});
|
|
3043
3043
|
}
|
|
3044
3044
|
}
|
|
@@ -3090,7 +3090,7 @@ var componentNestingRule = {
|
|
|
3090
3090
|
context.report({
|
|
3091
3091
|
node,
|
|
3092
3092
|
loc: { line: 1, column: 0 },
|
|
3093
|
-
message: `This component is nested in src/${folder.join("/")}/ but its folder has no exclusive child components \u2014 only support files. Flatten it back into src/${flatFolder}/. See docs/
|
|
3093
|
+
message: `This component is nested in src/${folder.join("/")}/ but its folder has no exclusive child components \u2014 only support files. Flatten it back into src/${flatFolder}/. See docs/next-codebase-guide/rules/folder-nesting-rule.md`
|
|
3094
3094
|
});
|
|
3095
3095
|
}
|
|
3096
3096
|
};
|
|
@@ -3141,7 +3141,7 @@ var stayFlatRule = {
|
|
|
3141
3141
|
context.report({
|
|
3142
3142
|
node,
|
|
3143
3143
|
loc: { line: 1, column: 0 },
|
|
3144
|
-
message: `This component has exclusive child component(s) ${childNames.join(", ")}; nest it in a folder named after it inside src/features/${featureName}/. See docs/
|
|
3144
|
+
message: `This component has exclusive child component(s) ${childNames.join(", ")}; nest it in a folder named after it inside src/features/${featureName}/. See docs/next-codebase-guide/rules/folder-nesting-rule.md`
|
|
3145
3145
|
});
|
|
3146
3146
|
}
|
|
3147
3147
|
};
|
|
@@ -3180,7 +3180,7 @@ var typeExtractionRule = {
|
|
|
3180
3180
|
if (independent2.length === 0) continue;
|
|
3181
3181
|
findings.push({
|
|
3182
3182
|
line: exp.line,
|
|
3183
|
-
message: `${exp.kind} "${exp.name}" is imported by ${describeConsumers(independent2, sourceRoot)} without the component "${componentExport.name}" that defines it. Extract it to a types/ or schemas/ folder. See docs/
|
|
3183
|
+
message: `${exp.kind} "${exp.name}" is imported by ${describeConsumers(independent2, sourceRoot)} without the component "${componentExport.name}" that defines it. Extract it to a types/ or schemas/ folder. See docs/next-codebase-guide/rules/types-and-schemas-rule.md`
|
|
3184
3184
|
});
|
|
3185
3185
|
continue;
|
|
3186
3186
|
}
|
|
@@ -3191,7 +3191,7 @@ var typeExtractionRule = {
|
|
|
3191
3191
|
if (independent.length === 0) continue;
|
|
3192
3192
|
findings.push({
|
|
3193
3193
|
line: exp.line,
|
|
3194
|
-
message: `${exp.kind} "${exp.name}" is imported by ${describeConsumers(independent, sourceRoot)} without using the code in this file. Extract it to a types/ or schemas/ folder. See docs/
|
|
3194
|
+
message: `${exp.kind} "${exp.name}" is imported by ${describeConsumers(independent, sourceRoot)} without using the code in this file. Extract it to a types/ or schemas/ folder. See docs/next-codebase-guide/rules/types-and-schemas-rule.md`
|
|
3195
3195
|
});
|
|
3196
3196
|
}
|
|
3197
3197
|
if (findings.length === 0) return {};
|
|
@@ -3300,7 +3300,7 @@ var localePlacementRule = {
|
|
|
3300
3300
|
if (current?.kind === "nested") {
|
|
3301
3301
|
findings.push({
|
|
3302
3302
|
line: current.line,
|
|
3303
|
-
message: `Locale "${key}" is read by ${describeConsumers([...readers], sourceRoot)} and must live at the top level of locales. See docs/
|
|
3303
|
+
message: `Locale "${key}" is read by ${describeConsumers([...readers], sourceRoot)} and must live at the top level of locales. See docs/next-codebase-guide/rules/locales-rule.md`
|
|
3304
3304
|
});
|
|
3305
3305
|
}
|
|
3306
3306
|
continue;
|
|
@@ -3311,12 +3311,12 @@ var localePlacementRule = {
|
|
|
3311
3311
|
if (current?.kind === "top") {
|
|
3312
3312
|
findings.push({
|
|
3313
3313
|
line: current.line,
|
|
3314
|
-
message: `Locale "${key}" is read only by the ${featureName} feature; it must live in an object named "${expected}". See docs/
|
|
3314
|
+
message: `Locale "${key}" is read only by the ${featureName} feature; it must live in an object named "${expected}". See docs/next-codebase-guide/rules/locales-rule.md`
|
|
3315
3315
|
});
|
|
3316
3316
|
} else if (current?.kind === "nested" && key !== expected) {
|
|
3317
3317
|
findings.push({
|
|
3318
3318
|
line: current.line,
|
|
3319
|
-
message: `Locale "${key}" is read only by the ${featureName} feature; it must live in an object named "${expected}", not "${key}". See docs/
|
|
3319
|
+
message: `Locale "${key}" is read only by the ${featureName} feature; it must live in an object named "${expected}", not "${key}". See docs/next-codebase-guide/rules/locales-rule.md`
|
|
3320
3320
|
});
|
|
3321
3321
|
}
|
|
3322
3322
|
}
|
|
@@ -3428,7 +3428,7 @@ var soleStateOwnerRule = {
|
|
|
3428
3428
|
context.report({
|
|
3429
3429
|
node,
|
|
3430
3430
|
loc: { line: 1, column: 0 },
|
|
3431
|
-
message: `Component "${component.name}" uses state "${hook.value}" in ${String(run)} contiguous top-level JSX part${run === 1 ? "" : "s"}; extract that part into a named component that owns useState instead of reading it in the parent. See docs/
|
|
3431
|
+
message: `Component "${component.name}" uses state "${hook.value}" in ${String(run)} contiguous top-level JSX part${run === 1 ? "" : "s"}; extract that part into a named component that owns useState instead of reading it in the parent. See docs/next-codebase-guide/rules/sole-state-owner-rule.md`
|
|
3432
3432
|
});
|
|
3433
3433
|
}
|
|
3434
3434
|
}
|
|
@@ -3558,7 +3558,7 @@ function checkKey(context, node, name) {
|
|
|
3558
3558
|
reportFor(
|
|
3559
3559
|
context,
|
|
3560
3560
|
node,
|
|
3561
|
-
`Locale key "${name}" must be English; write it in the Latin alphabet. See docs/
|
|
3561
|
+
`Locale key "${name}" must be English; write it in the Latin alphabet. See docs/next-codebase-guide/rules/locales-rule.md`
|
|
3562
3562
|
);
|
|
3563
3563
|
return;
|
|
3564
3564
|
}
|
|
@@ -3566,7 +3566,7 @@ function checkKey(context, node, name) {
|
|
|
3566
3566
|
reportFor(
|
|
3567
3567
|
context,
|
|
3568
3568
|
node,
|
|
3569
|
-
`Locale key "${name}" must be camelCase English based on the text. See docs/
|
|
3569
|
+
`Locale key "${name}" must be camelCase English based on the text. See docs/next-codebase-guide/rules/locales-rule.md`
|
|
3570
3570
|
);
|
|
3571
3571
|
return;
|
|
3572
3572
|
}
|
|
@@ -3576,7 +3576,7 @@ function checkKey(context, node, name) {
|
|
|
3576
3576
|
reportFor(
|
|
3577
3577
|
context,
|
|
3578
3578
|
node,
|
|
3579
|
-
`Locale key "${name}" is longer than ${String(MAX_KEY_LENGTH)} characters, so it must describe the message's purpose instead of the text; end it with an element role such as "Button", "Link", or "Dialog" (see WAI-ARIA roles). See docs/
|
|
3579
|
+
`Locale key "${name}" is longer than ${String(MAX_KEY_LENGTH)} characters, so it must describe the message's purpose instead of the text; end it with an element role such as "Button", "Link", or "Dialog" (see WAI-ARIA roles). See docs/next-codebase-guide/rules/locales-rule.md`
|
|
3580
3580
|
);
|
|
3581
3581
|
}
|
|
3582
3582
|
var localeKeyShapeRule = {
|
|
@@ -3668,7 +3668,7 @@ var sharedStyleDedupRule = {
|
|
|
3668
3668
|
context.report({
|
|
3669
3669
|
node,
|
|
3670
3670
|
loc: { line: 1, column: 0 },
|
|
3671
|
-
message: `Class combination "${combo}" is used by ${String(users.size)} components and should change together; create a named custom Tailwind utility for it. See docs/
|
|
3671
|
+
message: `Class combination "${combo}" is used by ${String(users.size)} components and should change together; create a named custom Tailwind utility for it. See docs/next-tailwind-guide/rules/theme-and-utility-definition-rule.md`
|
|
3672
3672
|
});
|
|
3673
3673
|
}
|
|
3674
3674
|
}
|
|
@@ -3777,7 +3777,7 @@ var repeatedStructureRule = {
|
|
|
3777
3777
|
if (!first || !isSubstantial(first)) continue;
|
|
3778
3778
|
context.report({
|
|
3779
3779
|
node: first,
|
|
3780
|
-
message: `The same arrangement of elements appears ${String(group.length)} times here; extract it as a named component. Different data or labels do not prevent extraction. See docs/
|
|
3780
|
+
message: `The same arrangement of elements appears ${String(group.length)} times here; extract it as a named component. Different data or labels do not prevent extraction. See docs/next-codebase-guide/rules/repeated-structure-rule.md`
|
|
3781
3781
|
});
|
|
3782
3782
|
}
|
|
3783
3783
|
}
|
|
@@ -5911,8 +5911,8 @@ var BASE_REQUIRED_DOCS = [
|
|
|
5911
5911
|
{ name: "repository-policy", path: "docs/repository-policy.md" }
|
|
5912
5912
|
];
|
|
5913
5913
|
var NEXTJS_REQUIRED_DOCS = [
|
|
5914
|
-
{ name: "
|
|
5915
|
-
{ name: "
|
|
5914
|
+
{ name: "next-codebase-guide", path: "docs/next-codebase-guide" },
|
|
5915
|
+
{ name: "next-tailwind-guide", path: "docs/next-tailwind-guide" }
|
|
5916
5916
|
];
|
|
5917
5917
|
function memberName5(member) {
|
|
5918
5918
|
return member.name.type === "String" ? member.name.value : member.name.name;
|
|
@@ -6122,7 +6122,10 @@ var zirkaConfig = {
|
|
|
6122
6122
|
};
|
|
6123
6123
|
var documentationConfig = {
|
|
6124
6124
|
files: ["docs/**/*.md"],
|
|
6125
|
-
|
|
6125
|
+
// vulyk-generated agent files are not authored docs: with per-directory
|
|
6126
|
+
// targets they can land under docs/ (e.g. docs/AGENTS.md) and must not be
|
|
6127
|
+
// held to the documentation guide.
|
|
6128
|
+
ignores: ["**/_*/**", "**/AGENTS.md", "**/CLAUDE.md"],
|
|
6126
6129
|
plugins: {
|
|
6127
6130
|
markdown,
|
|
6128
6131
|
pasika: pasikaPlugin
|