@kernlang/review 3.4.5 → 3.4.6-canary.38.1.c552219e
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/dist/concept-rules/cross-stack-utils.d.ts +17 -0
- package/dist/concept-rules/cross-stack-utils.js +37 -0
- package/dist/concept-rules/cross-stack-utils.js.map +1 -1
- package/dist/concept-rules/index.js +4 -0
- package/dist/concept-rules/index.js.map +1 -1
- package/dist/concept-rules/pagination-key-drift.d.ts +44 -0
- package/dist/concept-rules/pagination-key-drift.js +128 -0
- package/dist/concept-rules/pagination-key-drift.js.map +1 -0
- package/dist/concept-rules/status-code-drift.d.ts +42 -0
- package/dist/concept-rules/status-code-drift.js +128 -0
- package/dist/concept-rules/status-code-drift.js.map +1 -0
- package/dist/mappers/ts-concepts.js +276 -1
- package/dist/mappers/ts-concepts.js.map +1 -1
- package/dist/reporter.js +2 -0
- package/dist/reporter.js.map +1 -1
- package/dist/rules/index.js +45 -1
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/nextjs-app-router.js +233 -2
- package/dist/rules/nextjs-app-router.js.map +1 -1
- package/dist/rules/test-quality.d.ts +13 -0
- package/dist/rules/test-quality.js +138 -0
- package/dist/rules/test-quality.js.map +1 -0
- package/package.json +2 -2
|
@@ -27,6 +27,23 @@ export declare const CROSS_STACK_HEURISTIC_CONFIDENCE = 0.7;
|
|
|
27
27
|
export declare const CROSS_STACK_EXACT_CONFIDENCE = 0.9;
|
|
28
28
|
/** Client URLs we consider "internal" to the reviewed project. */
|
|
29
29
|
export declare const API_PATH_RE: RegExp;
|
|
30
|
+
/** Pagination anchor sets — exposed for both the mapper (server-side handler
|
|
31
|
+
* inspection) and `pagination-key-drift` (client-side query inspection).
|
|
32
|
+
* Size keys (`limit`, `take`, `pageSize`, `perPage`) are intentionally NOT
|
|
33
|
+
* anchors — `limit` works with offset OR cursor pagination; classifying it
|
|
34
|
+
* as offset-anchor would produce false positives against cursor-paginated
|
|
35
|
+
* servers that also accept a limit. */
|
|
36
|
+
export declare const PAGE_ANCHORS: ReadonlySet<string>;
|
|
37
|
+
export declare const OFFSET_ANCHORS: ReadonlySet<string>;
|
|
38
|
+
export declare const CURSOR_ANCHORS: ReadonlySet<string>;
|
|
39
|
+
/** Classifies a single query-key string against the anchor sets. Returns
|
|
40
|
+
* `undefined` when the key is not a pagination anchor (size keys, filters,
|
|
41
|
+
* sort keys, etc.). */
|
|
42
|
+
export declare function classifyPaginationAnchor(key: string): 'page' | 'offset' | 'cursor' | undefined;
|
|
43
|
+
/** Aggregates a list of query-key strings into a single strategy. Mirrors the
|
|
44
|
+
* server-side classification done in the Express mapper so client and server
|
|
45
|
+
* can be compared on equal terms. */
|
|
46
|
+
export declare function aggregatePaginationStrategy(keys: readonly string[]): 'page' | 'offset' | 'cursor' | 'mixed' | 'none';
|
|
30
47
|
export interface ServerRoute {
|
|
31
48
|
path: string;
|
|
32
49
|
method: string | undefined;
|
|
@@ -26,6 +26,43 @@ export const CROSS_STACK_HEURISTIC_CONFIDENCE = 0.7;
|
|
|
26
26
|
export const CROSS_STACK_EXACT_CONFIDENCE = 0.9;
|
|
27
27
|
/** Client URLs we consider "internal" to the reviewed project. */
|
|
28
28
|
export const API_PATH_RE = /^\/api\//;
|
|
29
|
+
/** Pagination anchor sets — exposed for both the mapper (server-side handler
|
|
30
|
+
* inspection) and `pagination-key-drift` (client-side query inspection).
|
|
31
|
+
* Size keys (`limit`, `take`, `pageSize`, `perPage`) are intentionally NOT
|
|
32
|
+
* anchors — `limit` works with offset OR cursor pagination; classifying it
|
|
33
|
+
* as offset-anchor would produce false positives against cursor-paginated
|
|
34
|
+
* servers that also accept a limit. */
|
|
35
|
+
export const PAGE_ANCHORS = new Set(['page', 'pageNumber', 'page_number']);
|
|
36
|
+
export const OFFSET_ANCHORS = new Set(['offset', 'skip']);
|
|
37
|
+
export const CURSOR_ANCHORS = new Set(['cursor', 'after', 'before', 'next', 'previous']);
|
|
38
|
+
/** Classifies a single query-key string against the anchor sets. Returns
|
|
39
|
+
* `undefined` when the key is not a pagination anchor (size keys, filters,
|
|
40
|
+
* sort keys, etc.). */
|
|
41
|
+
export function classifyPaginationAnchor(key) {
|
|
42
|
+
if (PAGE_ANCHORS.has(key))
|
|
43
|
+
return 'page';
|
|
44
|
+
if (OFFSET_ANCHORS.has(key))
|
|
45
|
+
return 'offset';
|
|
46
|
+
if (CURSOR_ANCHORS.has(key))
|
|
47
|
+
return 'cursor';
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
/** Aggregates a list of query-key strings into a single strategy. Mirrors the
|
|
51
|
+
* server-side classification done in the Express mapper so client and server
|
|
52
|
+
* can be compared on equal terms. */
|
|
53
|
+
export function aggregatePaginationStrategy(keys) {
|
|
54
|
+
const families = new Set();
|
|
55
|
+
for (const key of keys) {
|
|
56
|
+
const family = classifyPaginationAnchor(key);
|
|
57
|
+
if (family)
|
|
58
|
+
families.add(family);
|
|
59
|
+
}
|
|
60
|
+
if (families.size === 0)
|
|
61
|
+
return 'none';
|
|
62
|
+
if (families.size > 1)
|
|
63
|
+
return 'mixed';
|
|
64
|
+
return families.values().next().value;
|
|
65
|
+
}
|
|
29
66
|
export function hasFastApiEvidence(map) {
|
|
30
67
|
if (map.language !== 'py')
|
|
31
68
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-stack-utils.js","sourceRoot":"","sources":["../../src/concept-rules/cross-stack-utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cross-stack-utils.js","sourceRoot":"","sources":["../../src/concept-rules/cross-stack-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,8 +18,10 @@ import { missingResponseModel } from './missing-response-model.js';
|
|
|
18
18
|
import { mixedHostSameEndpoint } from './mixed-host-same-endpoint.js';
|
|
19
19
|
import { mutationWithoutIdempotency } from './mutation-without-idempotency.js';
|
|
20
20
|
import { orphanRoute } from './orphan-route.js';
|
|
21
|
+
import { paginationKeyDrift } from './pagination-key-drift.js';
|
|
21
22
|
import { paramNameSwap } from './param-name-swap.js';
|
|
22
23
|
import { requestValidationDrift } from './request-validation-drift.js';
|
|
24
|
+
import { statusCodeDrift } from './status-code-drift.js';
|
|
23
25
|
import { syncHandlerDoesIo } from './sync-handler-does-io.js';
|
|
24
26
|
import { taintedAcrossWire } from './tainted-across-wire.js';
|
|
25
27
|
import { trailingSlashDrift } from './trailing-slash-drift.js';
|
|
@@ -43,8 +45,10 @@ export const conceptRules = [
|
|
|
43
45
|
mixedHostSameEndpoint,
|
|
44
46
|
mutationWithoutIdempotency,
|
|
45
47
|
orphanRoute,
|
|
48
|
+
paginationKeyDrift,
|
|
46
49
|
paramNameSwap,
|
|
47
50
|
requestValidationDrift,
|
|
51
|
+
statusCodeDrift,
|
|
48
52
|
syncHandlerDoesIo,
|
|
49
53
|
taintedAcrossWire,
|
|
50
54
|
trailingSlashDrift,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/concept-rules/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAe1E,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,SAAS;IACT,oBAAoB;IACpB,cAAc;IACd,gBAAgB;IAChB,aAAa;IACb,mBAAmB;IACnB,cAAc;IACd,kBAAkB;IAClB,YAAY;IACZ,oBAAoB;IACpB,qBAAqB;IACrB,0BAA0B;IAC1B,WAAW;IACX,aAAa;IACb,sBAAsB;IACtB,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,wBAAwB;IACxB,eAAe;IACf,sBAAsB;IACtB,iBAAiB;IACjB,kBAAkB;IAClB,uBAAuB;CACxB,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,QAAoB,EACpB,QAAgB,EAChB,WAAqC,EACrC,YAAoC,EACpC,MAA6C;IAE7C,MAAM,GAAG,GAAuB;QAC9B,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,YAAY;QACZ,cAAc,EAAE,MAAM,EAAE,cAAc;KACvC,CAAC;IACF,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/concept-rules/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAe1E,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,SAAS;IACT,oBAAoB;IACpB,cAAc;IACd,gBAAgB;IAChB,aAAa;IACb,mBAAmB;IACnB,cAAc;IACd,kBAAkB;IAClB,YAAY;IACZ,oBAAoB;IACpB,qBAAqB;IACrB,0BAA0B;IAC1B,WAAW;IACX,kBAAkB;IAClB,aAAa;IACb,sBAAsB;IACtB,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,wBAAwB;IACxB,eAAe;IACf,sBAAsB;IACtB,iBAAiB;IACjB,kBAAkB;IAClB,uBAAuB;CACxB,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,QAAoB,EACpB,QAAgB,EAChB,WAAqC,EACrC,YAAoC,EACpC,MAA6C;IAE7C,MAAM,GAAG,GAAuB;QAC9B,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,YAAY;QACZ,cAAc,EAAE,MAAM,EAAE,cAAc;KACvC,CAAC;IACF,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: pagination-key-drift
|
|
3
|
+
*
|
|
4
|
+
* Cross-stack rule — fires when the client uses one pagination anchor family
|
|
5
|
+
* (e.g. `?page=1`) against a server route whose handler reads a different
|
|
6
|
+
* anchor family (e.g. `req.query.offset`). Common production foot-gun:
|
|
7
|
+
*
|
|
8
|
+
* - Client: `fetch('/api/users?page=2')`
|
|
9
|
+
* - Server: `(req, res) => { const offset = req.query.offset ?? 0; ... }`
|
|
10
|
+
* The server ignores `?page=` entirely and always serves the first page.
|
|
11
|
+
*
|
|
12
|
+
* Confidence multiplier: `CROSS_STACK_EXACT_CONFIDENCE` (0.9) — once both
|
|
13
|
+
* sides have a resolved single-family strategy and the families differ, the
|
|
14
|
+
* mismatch is unambiguous.
|
|
15
|
+
*
|
|
16
|
+
* Gates:
|
|
17
|
+
* 1. Path + method match (`findHighConfidenceRouteForMethod`).
|
|
18
|
+
* 2. Server `paginationStrategyResolved === true` AND strategy ∈
|
|
19
|
+
* `{page, offset, cursor}` (NOT `mixed`/`none` — `mixed` means the server
|
|
20
|
+
* tolerates either family, so the rule MUST stay silent there).
|
|
21
|
+
* 3. Client `queryParamsResolved === true` AND derived strategy ∈
|
|
22
|
+
* `{page, offset, cursor}`.
|
|
23
|
+
* 4. Client and server strategies are different anchor families.
|
|
24
|
+
*
|
|
25
|
+
* Size keys (`limit`, `take`, `pageSize`, `perPage`) are intentionally not
|
|
26
|
+
* anchors. A handler that reads only `limit` has strategy `'none'` and the
|
|
27
|
+
* rule will not fire — `limit` is compatible with either offset OR cursor
|
|
28
|
+
* pagination, so flagging it would produce false positives.
|
|
29
|
+
*
|
|
30
|
+
* Requires graph mode; silent in single-file review.
|
|
31
|
+
*
|
|
32
|
+
* Documented coverage gaps (intentional v1 limits):
|
|
33
|
+
* - FastAPI server routes are skipped (Python mapper doesn't populate
|
|
34
|
+
* `paginationStrategyResolved`). Phase 2 work.
|
|
35
|
+
* - Servers that alias `req.query` to a local variable, pass it as an
|
|
36
|
+
* argument, or otherwise leak the reference are marked unresolved by the
|
|
37
|
+
* mapper — the rule stays silent rather than risk a false positive.
|
|
38
|
+
* - axios/ky-style fetch wrappers that pass query params via a config
|
|
39
|
+
* object (not the URL) are not extracted by the client-side mapper, so
|
|
40
|
+
* the rule doesn't fire on those calls.
|
|
41
|
+
*/
|
|
42
|
+
import type { ReviewFinding } from '../types.js';
|
|
43
|
+
import type { ConceptRuleContext } from './index.js';
|
|
44
|
+
export declare function paginationKeyDrift(ctx: ConceptRuleContext): ReviewFinding[];
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: pagination-key-drift
|
|
3
|
+
*
|
|
4
|
+
* Cross-stack rule — fires when the client uses one pagination anchor family
|
|
5
|
+
* (e.g. `?page=1`) against a server route whose handler reads a different
|
|
6
|
+
* anchor family (e.g. `req.query.offset`). Common production foot-gun:
|
|
7
|
+
*
|
|
8
|
+
* - Client: `fetch('/api/users?page=2')`
|
|
9
|
+
* - Server: `(req, res) => { const offset = req.query.offset ?? 0; ... }`
|
|
10
|
+
* The server ignores `?page=` entirely and always serves the first page.
|
|
11
|
+
*
|
|
12
|
+
* Confidence multiplier: `CROSS_STACK_EXACT_CONFIDENCE` (0.9) — once both
|
|
13
|
+
* sides have a resolved single-family strategy and the families differ, the
|
|
14
|
+
* mismatch is unambiguous.
|
|
15
|
+
*
|
|
16
|
+
* Gates:
|
|
17
|
+
* 1. Path + method match (`findHighConfidenceRouteForMethod`).
|
|
18
|
+
* 2. Server `paginationStrategyResolved === true` AND strategy ∈
|
|
19
|
+
* `{page, offset, cursor}` (NOT `mixed`/`none` — `mixed` means the server
|
|
20
|
+
* tolerates either family, so the rule MUST stay silent there).
|
|
21
|
+
* 3. Client `queryParamsResolved === true` AND derived strategy ∈
|
|
22
|
+
* `{page, offset, cursor}`.
|
|
23
|
+
* 4. Client and server strategies are different anchor families.
|
|
24
|
+
*
|
|
25
|
+
* Size keys (`limit`, `take`, `pageSize`, `perPage`) are intentionally not
|
|
26
|
+
* anchors. A handler that reads only `limit` has strategy `'none'` and the
|
|
27
|
+
* rule will not fire — `limit` is compatible with either offset OR cursor
|
|
28
|
+
* pagination, so flagging it would produce false positives.
|
|
29
|
+
*
|
|
30
|
+
* Requires graph mode; silent in single-file review.
|
|
31
|
+
*
|
|
32
|
+
* Documented coverage gaps (intentional v1 limits):
|
|
33
|
+
* - FastAPI server routes are skipped (Python mapper doesn't populate
|
|
34
|
+
* `paginationStrategyResolved`). Phase 2 work.
|
|
35
|
+
* - Servers that alias `req.query` to a local variable, pass it as an
|
|
36
|
+
* argument, or otherwise leak the reference are marked unresolved by the
|
|
37
|
+
* mapper — the rule stays silent rather than risk a false positive.
|
|
38
|
+
* - axios/ky-style fetch wrappers that pass query params via a config
|
|
39
|
+
* object (not the URL) are not extracted by the client-side mapper, so
|
|
40
|
+
* the rule doesn't fire on those calls.
|
|
41
|
+
*/
|
|
42
|
+
import { createFingerprint } from '../types.js';
|
|
43
|
+
import { API_PATH_RE, aggregatePaginationStrategy, CROSS_STACK_EXACT_CONFIDENCE, collectRoutesAcrossGraph, findHighConfidenceRouteForMethod, normalizeClientUrl, } from './cross-stack-utils.js';
|
|
44
|
+
import { apiCallRootCause } from './root-cause.js';
|
|
45
|
+
export function paginationKeyDrift(ctx) {
|
|
46
|
+
if (!ctx.allConcepts || ctx.allConcepts.size === 0)
|
|
47
|
+
return [];
|
|
48
|
+
const serverRoutes = collectRoutesAcrossGraph(ctx.allConcepts);
|
|
49
|
+
if (serverRoutes.length === 0)
|
|
50
|
+
return [];
|
|
51
|
+
const clientCalls = collectClientPaginationCalls(ctx);
|
|
52
|
+
if (clientCalls.length === 0)
|
|
53
|
+
return [];
|
|
54
|
+
const findings = [];
|
|
55
|
+
for (const call of clientCalls) {
|
|
56
|
+
if (call.node.primarySpan.file !== ctx.filePath)
|
|
57
|
+
continue;
|
|
58
|
+
const route = findHighConfidenceRouteForMethod(call.normalizedPath, call.method, serverRoutes);
|
|
59
|
+
if (!route?.node)
|
|
60
|
+
continue;
|
|
61
|
+
if (route.node.payload.kind !== 'entrypoint')
|
|
62
|
+
continue;
|
|
63
|
+
if (route.node.payload.paginationStrategyResolved !== true)
|
|
64
|
+
continue;
|
|
65
|
+
const serverStrategy = route.node.payload.paginationStrategy;
|
|
66
|
+
// Skip when the server tolerates either family or doesn't paginate at all.
|
|
67
|
+
if (serverStrategy !== 'page' && serverStrategy !== 'offset' && serverStrategy !== 'cursor')
|
|
68
|
+
continue;
|
|
69
|
+
if (serverStrategy === call.clientStrategy)
|
|
70
|
+
continue;
|
|
71
|
+
const clientKeyExample = call.queryParams.find((k) => isAnchorKey(k));
|
|
72
|
+
findings.push({
|
|
73
|
+
source: 'kern',
|
|
74
|
+
ruleId: 'pagination-key-drift',
|
|
75
|
+
severity: 'warning',
|
|
76
|
+
category: 'bug',
|
|
77
|
+
message: `Client paginates with \`${call.clientStrategy}\` family (e.g. \`?${clientKeyExample}=...\`) but server route ` +
|
|
78
|
+
`\`${call.method} ${route.path}\` reads only \`${serverStrategy}\` family keys. ` +
|
|
79
|
+
`The server will ignore the client's pagination parameter and always return the same page.`,
|
|
80
|
+
primarySpan: call.node.primarySpan,
|
|
81
|
+
fingerprint: createFingerprint('pagination-key-drift', call.node.primarySpan.startLine, call.node.primarySpan.startCol),
|
|
82
|
+
confidence: call.node.confidence * CROSS_STACK_EXACT_CONFIDENCE,
|
|
83
|
+
rootCause: apiCallRootCause(call.node, call.normalizedPath, call.method, route.node),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return findings;
|
|
87
|
+
}
|
|
88
|
+
function isAnchorKey(key) {
|
|
89
|
+
return aggregatePaginationStrategy([key]) !== 'none';
|
|
90
|
+
}
|
|
91
|
+
function collectClientPaginationCalls(ctx) {
|
|
92
|
+
const calls = [];
|
|
93
|
+
if (!ctx.allConcepts)
|
|
94
|
+
return calls;
|
|
95
|
+
for (const [, conceptMap] of ctx.allConcepts) {
|
|
96
|
+
for (const node of conceptMap.nodes) {
|
|
97
|
+
if (node.kind !== 'effect')
|
|
98
|
+
continue;
|
|
99
|
+
if (node.payload.kind !== 'effect')
|
|
100
|
+
continue;
|
|
101
|
+
if (node.payload.subtype !== 'network')
|
|
102
|
+
continue;
|
|
103
|
+
const target = node.payload.target;
|
|
104
|
+
const method = node.payload.method;
|
|
105
|
+
if (typeof target !== 'string')
|
|
106
|
+
continue;
|
|
107
|
+
if (typeof method !== 'string')
|
|
108
|
+
continue;
|
|
109
|
+
// Client must have a fully-resolved query param list to classify.
|
|
110
|
+
if (node.payload.queryParamsResolved !== true)
|
|
111
|
+
continue;
|
|
112
|
+
const queryParams = node.payload.queryParams;
|
|
113
|
+
if (!queryParams || queryParams.length === 0)
|
|
114
|
+
continue;
|
|
115
|
+
const clientStrategy = aggregatePaginationStrategy(queryParams);
|
|
116
|
+
// Skip when client uses no anchor or mixes families — the rule fires
|
|
117
|
+
// only when client commits to one family.
|
|
118
|
+
if (clientStrategy !== 'page' && clientStrategy !== 'offset' && clientStrategy !== 'cursor')
|
|
119
|
+
continue;
|
|
120
|
+
const normalized = normalizeClientUrl(target);
|
|
121
|
+
if (!normalized || !API_PATH_RE.test(normalized))
|
|
122
|
+
continue;
|
|
123
|
+
calls.push({ target, normalizedPath: normalized, method, queryParams, clientStrategy, node });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return calls;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=pagination-key-drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination-key-drift.js","sourceRoot":"","sources":["../../src/concept-rules/pagination-key-drift.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: status-code-drift
|
|
3
|
+
*
|
|
4
|
+
* Cross-stack rule — fires when a frontend network call branches on a 2xx
|
|
5
|
+
* status code that the matched server route does not actually emit. Sibling
|
|
6
|
+
* to `error-contract-drift` (which handles 4xx/5xx), but with a different
|
|
7
|
+
* gate design because success codes don't have the "client already handles
|
|
8
|
+
* one other server code" overlap to lean on (most routes emit a single 2xx).
|
|
9
|
+
*
|
|
10
|
+
* Common production foot-gun:
|
|
11
|
+
* - Client: `if (res.status === 201) showCreatedToast()`
|
|
12
|
+
* - Server: `res.status(200).json(created)` — the 201 branch never fires.
|
|
13
|
+
*
|
|
14
|
+
* Confidence multiplier: `CROSS_STACK_EXACT_CONFIDENCE` (0.9).
|
|
15
|
+
*
|
|
16
|
+
* V1 gate design (tight, may evolve as signal data lands):
|
|
17
|
+
* 1. Path + method match (`findHighConfidenceRouteForMethod`).
|
|
18
|
+
* 2. Server has resolved success-status evidence with EXACTLY ONE 2xx code.
|
|
19
|
+
* Multi-2xx routes are skipped — the rule can't yet distinguish "server
|
|
20
|
+
* returns 200 OR 201 depending on body" from genuine drift.
|
|
21
|
+
* 3. Client branches on EXACTLY ONE 2xx code (200/201/202). When the client
|
|
22
|
+
* checks multiple 2xx codes, the call-site has dispatch logic that's
|
|
23
|
+
* probably wired to the actual contract; skip to avoid double-counting
|
|
24
|
+
* with `error-contract-drift`-style designs.
|
|
25
|
+
* 4. The client's checked 2xx must NOT match the server's emitted 2xx.
|
|
26
|
+
* 5. Skip the 200/204 pair entirely — DELETE/PATCH routes commonly return
|
|
27
|
+
* 204 and clients commonly check 200; the semantics overlap enough that
|
|
28
|
+
* the rule needs more signal data before firing on it.
|
|
29
|
+
*
|
|
30
|
+
* Requires graph mode; silent in single-file review.
|
|
31
|
+
*
|
|
32
|
+
* Documented coverage gaps (intentional v1 limits — buddy review consensus):
|
|
33
|
+
* - Multi-2xx server routes are skipped (gate 2) — false negatives accepted.
|
|
34
|
+
* - FastAPI server routes are skipped because the Python mapper doesn't yet
|
|
35
|
+
* populate `successStatusCodesResolved`. Phase 2 work.
|
|
36
|
+
* - `.then(res => res.status === 201)` callback form isn't call-bound — the
|
|
37
|
+
* mapper falls back to function-wide attribution there, which only fires
|
|
38
|
+
* when the function has a single network call. Phase 2 work.
|
|
39
|
+
*/
|
|
40
|
+
import type { ReviewFinding } from '../types.js';
|
|
41
|
+
import type { ConceptRuleContext } from './index.js';
|
|
42
|
+
export declare function statusCodeDrift(ctx: ConceptRuleContext): ReviewFinding[];
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: status-code-drift
|
|
3
|
+
*
|
|
4
|
+
* Cross-stack rule — fires when a frontend network call branches on a 2xx
|
|
5
|
+
* status code that the matched server route does not actually emit. Sibling
|
|
6
|
+
* to `error-contract-drift` (which handles 4xx/5xx), but with a different
|
|
7
|
+
* gate design because success codes don't have the "client already handles
|
|
8
|
+
* one other server code" overlap to lean on (most routes emit a single 2xx).
|
|
9
|
+
*
|
|
10
|
+
* Common production foot-gun:
|
|
11
|
+
* - Client: `if (res.status === 201) showCreatedToast()`
|
|
12
|
+
* - Server: `res.status(200).json(created)` — the 201 branch never fires.
|
|
13
|
+
*
|
|
14
|
+
* Confidence multiplier: `CROSS_STACK_EXACT_CONFIDENCE` (0.9).
|
|
15
|
+
*
|
|
16
|
+
* V1 gate design (tight, may evolve as signal data lands):
|
|
17
|
+
* 1. Path + method match (`findHighConfidenceRouteForMethod`).
|
|
18
|
+
* 2. Server has resolved success-status evidence with EXACTLY ONE 2xx code.
|
|
19
|
+
* Multi-2xx routes are skipped — the rule can't yet distinguish "server
|
|
20
|
+
* returns 200 OR 201 depending on body" from genuine drift.
|
|
21
|
+
* 3. Client branches on EXACTLY ONE 2xx code (200/201/202). When the client
|
|
22
|
+
* checks multiple 2xx codes, the call-site has dispatch logic that's
|
|
23
|
+
* probably wired to the actual contract; skip to avoid double-counting
|
|
24
|
+
* with `error-contract-drift`-style designs.
|
|
25
|
+
* 4. The client's checked 2xx must NOT match the server's emitted 2xx.
|
|
26
|
+
* 5. Skip the 200/204 pair entirely — DELETE/PATCH routes commonly return
|
|
27
|
+
* 204 and clients commonly check 200; the semantics overlap enough that
|
|
28
|
+
* the rule needs more signal data before firing on it.
|
|
29
|
+
*
|
|
30
|
+
* Requires graph mode; silent in single-file review.
|
|
31
|
+
*
|
|
32
|
+
* Documented coverage gaps (intentional v1 limits — buddy review consensus):
|
|
33
|
+
* - Multi-2xx server routes are skipped (gate 2) — false negatives accepted.
|
|
34
|
+
* - FastAPI server routes are skipped because the Python mapper doesn't yet
|
|
35
|
+
* populate `successStatusCodesResolved`. Phase 2 work.
|
|
36
|
+
* - `.then(res => res.status === 201)` callback form isn't call-bound — the
|
|
37
|
+
* mapper falls back to function-wide attribution there, which only fires
|
|
38
|
+
* when the function has a single network call. Phase 2 work.
|
|
39
|
+
*/
|
|
40
|
+
import { createFingerprint } from '../types.js';
|
|
41
|
+
import { API_PATH_RE, CROSS_STACK_EXACT_CONFIDENCE, collectRoutesAcrossGraph, findHighConfidenceRouteForMethod, normalizeClientUrl, } from './cross-stack-utils.js';
|
|
42
|
+
import { apiCallRootCause } from './root-cause.js';
|
|
43
|
+
/** Success status codes the client commonly branches on explicitly. 204
|
|
44
|
+
* intentionally omitted — DELETE/PATCH overlap creates more noise than
|
|
45
|
+
* signal at this rule's current precision target. */
|
|
46
|
+
const CLIENT_DISPATCHED_SUCCESS_STATUSES = new Set([200, 201, 202]);
|
|
47
|
+
export function statusCodeDrift(ctx) {
|
|
48
|
+
if (!ctx.allConcepts || ctx.allConcepts.size === 0)
|
|
49
|
+
return [];
|
|
50
|
+
const serverRoutes = collectRoutesAcrossGraph(ctx.allConcepts);
|
|
51
|
+
if (serverRoutes.length === 0)
|
|
52
|
+
return [];
|
|
53
|
+
const clientCalls = collectClientCalls(ctx);
|
|
54
|
+
if (clientCalls.length === 0)
|
|
55
|
+
return [];
|
|
56
|
+
const findings = [];
|
|
57
|
+
for (const call of clientCalls) {
|
|
58
|
+
if (call.node.primarySpan.file !== ctx.filePath)
|
|
59
|
+
continue;
|
|
60
|
+
// Gate 3: client must dispatch on EXACTLY ONE 2xx code.
|
|
61
|
+
const checkedSuccess = call.handled.filter((c) => CLIENT_DISPATCHED_SUCCESS_STATUSES.has(c));
|
|
62
|
+
if (checkedSuccess.length !== 1)
|
|
63
|
+
continue;
|
|
64
|
+
const clientCode = checkedSuccess[0];
|
|
65
|
+
const route = findHighConfidenceRouteForMethod(call.normalizedPath, call.method, serverRoutes);
|
|
66
|
+
if (!route?.node)
|
|
67
|
+
continue;
|
|
68
|
+
if (route.node.payload.kind !== 'entrypoint')
|
|
69
|
+
continue;
|
|
70
|
+
// Gate 2: server must have resolved success-status evidence with EXACTLY ONE 2xx code.
|
|
71
|
+
if (route.node.payload.successStatusCodesResolved !== true)
|
|
72
|
+
continue;
|
|
73
|
+
const serverCodes = route.node.payload.successStatusCodes;
|
|
74
|
+
if (!serverCodes || serverCodes.length !== 1)
|
|
75
|
+
continue;
|
|
76
|
+
const serverCode = serverCodes[0];
|
|
77
|
+
// Gate 4: drift exists only when the codes differ.
|
|
78
|
+
if (clientCode === serverCode)
|
|
79
|
+
continue;
|
|
80
|
+
// Gate 5: skip 200/204 pair — too much legitimate ambiguity.
|
|
81
|
+
if ((clientCode === 200 && serverCode === 204) || (clientCode === 204 && serverCode === 200))
|
|
82
|
+
continue;
|
|
83
|
+
findings.push({
|
|
84
|
+
source: 'kern',
|
|
85
|
+
ruleId: 'status-code-drift',
|
|
86
|
+
severity: 'warning',
|
|
87
|
+
category: 'bug',
|
|
88
|
+
message: `Client branches on status \`${clientCode}\` but server route \`${call.method} ${route.path}\` returns \`${serverCode}\`. ` +
|
|
89
|
+
`The \`if (res.status === ${clientCode})\` branch will never run — either change the client check to \`${serverCode}\` ` +
|
|
90
|
+
`or change the server to return \`${clientCode}\`.`,
|
|
91
|
+
primarySpan: call.node.primarySpan,
|
|
92
|
+
fingerprint: createFingerprint('status-code-drift', call.node.primarySpan.startLine, call.node.primarySpan.startCol),
|
|
93
|
+
confidence: call.node.confidence * CROSS_STACK_EXACT_CONFIDENCE,
|
|
94
|
+
rootCause: apiCallRootCause(call.node, call.normalizedPath, call.method, route.node),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return findings;
|
|
98
|
+
}
|
|
99
|
+
function collectClientCalls(ctx) {
|
|
100
|
+
const calls = [];
|
|
101
|
+
if (!ctx.allConcepts)
|
|
102
|
+
return calls;
|
|
103
|
+
for (const [, conceptMap] of ctx.allConcepts) {
|
|
104
|
+
for (const node of conceptMap.nodes) {
|
|
105
|
+
if (node.kind !== 'effect')
|
|
106
|
+
continue;
|
|
107
|
+
if (node.payload.kind !== 'effect')
|
|
108
|
+
continue;
|
|
109
|
+
if (node.payload.subtype !== 'network')
|
|
110
|
+
continue;
|
|
111
|
+
const target = node.payload.target;
|
|
112
|
+
const method = node.payload.method;
|
|
113
|
+
const handled = node.payload.handledErrorStatusCodes;
|
|
114
|
+
if (typeof target !== 'string')
|
|
115
|
+
continue;
|
|
116
|
+
if (typeof method !== 'string')
|
|
117
|
+
continue;
|
|
118
|
+
if (!handled || handled.length === 0)
|
|
119
|
+
continue;
|
|
120
|
+
const normalized = normalizeClientUrl(target);
|
|
121
|
+
if (!normalized || !API_PATH_RE.test(normalized))
|
|
122
|
+
continue;
|
|
123
|
+
calls.push({ target, normalizedPath: normalized, method, handled, node });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return calls;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=status-code-drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-code-drift.js","sourceRoot":"","sources":["../../src/concept-rules/status-code-drift.ts"],"names":[],"mappings":"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"}
|