no-ad-hoc-jsonl-parser: isLineSource doesn't traverse ConditionalExpression, missing live ad-hoc parse in conclusion_admission.c
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 75/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- eslint, github-actions, typescript
- Ambito
- tooling
Direzione di ricerca
Inizia da eslint-factory/src/rules/no-ad-hoc-jsonl-parser.ts e dai relativi test in no-ad-hoc-jsonl-parser.test.ts; segui come isLineSource() e fromLine() risolvono le espressioni condizionali. Aggiungi i casi sintetici validi e non validi descritti nell’issue, quindi esegui i test della regola e controlla actions/setup/js/conclusion_admission.cjs con la regola. Il risultato atteso è che il caso di divisione tramite ternario venga segnalato, mentre gli array di documenti non correlati non vengano segnalati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
no-ad-hoc-jsonl-parser's isLineSource() helper (eslint-factory/src/rules/no-ad-hoc-jsonl-parser.ts:76-98) only resolves a variable's "line-ness" through one hop of identifier-to-initializer resolution (Identifier → initializer()) and through a small whitelist of chained CallExpression methods (split, filter, slice, reverse, toReversed). It never unwraps a ConditionalExpression (ternary) to check whether either branch is itself a line source. Any line array built behind a ternary — a very ordinary "empty vs. split" guard — escapes detection entirely, including when it is subsequently JSON.parse'd per-element, which is exactly the ad-hoc-parsing idiom this rule exists to catch.
Live, grounded false negative
actions/setup/js/conclusion_admission.cjs:50-54:
const lines = compact.session === "" ? [] : compact.session.split("\n");
if (lines.at(-1) === "") lines.pop();
if ((!compact.session.endsWith("\n") && compact.session !== "") || lines.length !== compact.included_events) throw new AdmissionError();
try {
const projected = compactUnifiedSession(lines.map(line => JSON.parse(line)));
This is a manual split-by-newline followed by .map(line => JSON.parse(line)) — the canonical pattern the rule is designed to flag (compare to the rule's own invalid test case const lines = text.split((r/redacted)?\n/); ... JSON.parse(line)). It is not wrapped by iterateJsonl/iterateJsonlEvents/JsonlParser from jsonl_helpers.cjs, yet the rule produces zero diagnostic here.
Root cause
Tracing lines in isLineSource():
linesis anIdentifier→initializer(node)returns itsVariableDeclaratorinit, which is theConditionalExpressioncompact.session === "" ? [] : compact.session.split("\n").isLineSource(conditionalExpr)hitsif (node.type !== "CallExpression") return false;(line 83) immediately, sinceConditionalExpressionis neitherIdentifiernorCallExpression.- Because
isLineSource(lines)isfalse, theCallExpressionvisitor'slineArraycheck forlines.map(...)(arrayCallbacks.has("map") && isLineSource(node.callee.object)) never markslineas a line binding, so the laterJSON.parse(line)inside the map callback is never reported.
The same gap applies to fromLine() (used for the Program:exit cross-call propagation pass), which also only descends through Identifier/ArrayExpression/MemberExpression(computed)/a small CallExpression method whitelist — no ConditionalExpression handling there either.
Proposed fix
In isLineSource() (and ideally the equivalent place in fromLine()), add a branch: if (node.type === "ConditionalExpression") return isLineSource(node.consequent, seen) || isLineSource(node.alternate, seen);. This directly fixes the cond ? [] : x.split("\n") idiom; an empty-array consequent is harmless since an empty array can't ever actually be the source of a flagged JSON.parse call.
Acceptance criteria
-
isLineSource()recognizes aConditionalExpressionas a line source when at least one branch resolves to a line source (via recursiveisLineSourceonconsequent/alternate). - New invalid test case reproducing the live shape:
const lines = cond ? [] : text.split("\n"); lines.map(line => JSON.parse(line));must reportadHoc. - A valid-case test confirms a
ConditionalExpressionwhere neither branch is a line source (e.g.cond ? documents : otherDocuments) is still not flagged. -
conclusion_admission.cjs:54is verified to now be caught after the fix (run against the real file, not just the synthetic test). - No existing passing test in
no-ad-hoc-jsonl-parser.test.tsregresses.
Scope note
Out of scope for this issue: fixing conclusion_admission.cjs itself (app code, not rule code) — this is purely about closing the detection gap in the ESLint rule so a future regression or similar idiom elsewhere is caught.
Generated by 🤖 ESLint Refiner · claude · agent · 99.9 AIC · ⌖ 0.868 AIC · ⊞ 6K · ◷
Work6b99120dce1d760d9b16b2c32e2b3939143961ca50ff5820849e9da583d8e97f· Claimc_2d1370e23519794ff88ba3c5ce7e17ee202e9a6904e679f8ad827e073d503dae_3
- expires on Oct 28, 2026, 8:03 PM UTC-08:00
- Lingua principale
- Go
- Stelle
- 5.4k
- Fork
- 596
- Merge medio
- 3h 40m
- PR unite (30g)
- 830
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Include un Dockerfile o un file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di github/gh-aw
-
automation models
Difficoltà 1/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
automated-analysis code-quality cookie testing
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
I maintainer di solito rispondono entro 1 giorno
-
automated conformance safe-outputs
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
automated conformance safe-outputs
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
wgdonenotdeferred: parenthesized Done() statement escapes non-deferred detection (paren_unwrap_gap)Apertacookie sergo
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di github/gh-aw
Issue simili
-
[Bug]: ap gateway image build cannot find local policies on WindowsForse già presa @Jayzilva l’ha presa oggi. ApertaAspect/Configuration Severity/Major
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
wso2/api-platform#3912 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
keyxmakerx/Chronicle#1721 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
Gentleman-Programming/gentle-ai#5720 ·
I maintainer di solito rispondono entro 1 giorno
-
compress: block buffers get re-zeroed on every call, and the zeroing is immediately overwrittenAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
ClickHouse/ch-go#1218 ·
I maintainer di solito rispondono entro 13 giorni