// npm package
@antv/infographic
An Infographic Generation and Rendering Framework, bring words to life!
weekly
9,093
monthly
29,422
versions
33
maintainers
51
license
MIT
first publish
2025-11-12
publisher
iaaron
tarball
8,202,595 B
AUTO-PUBLISHED·1 version indexed·latest published 2026-05-06
// publisher campaignby iaaron
9 caught packages from this accountThis is not an isolated catch. The same publisher has shipped 8 other packages that our pipeline flagged — the shape of a coordinated campaign, not a one-off. Each link below opens that sibling's analysis.
// offending code· @0.2.19· 1 file flagged
llm: benign · 0.85→ No suspicious destination, no remote-exec shape — 1 known-vendor host(s).
- @0.2.19··AUTO-PUBLISHED·publisher: iaaronheuristic 75/100static flags 1llm benign (0.85) via ollamapopularity:highmature-packageosv-flagged:MAL-2026-4028child-process-spawn
→ No suspicious destination, no remote-exec shape — 1 known-vendor host(s).
// offending code· 1 file flaggedpatterns: 1
--- install scripts --- ### prepublishOnly npm run ci --- package/src/syntax/relations.ts (excerpt) --- import type { ItemDatum, RelationEdgeDatum } from '../types'; import { mapWithSchema } from './mapper'; import { RelationSchema } from './schema'; import type { SyntaxError, SyntaxNode } from './types'; const RELATION_TOKEN = /(?:[<>o.x-]{2,}|[<>=]{2,})/; const ARROW_TOKEN = /(?:[<>o.x-]{2,}|[<>=]{2,})/g; interface ParsedNode { id: string; label?: string; } interface ParsedEdge { label?: string; direction: 'forward' | 'both' | 'none'; reverse: boolean; nextIndex: number; } function normalizeLabel(text: string) { let label = text.trim(); if (!label) return ''; const first = label[0]; const last = label[label.length - 1]; if ((first === '"' && last === '"') || (first === "'" && last === "'")) { label = label.slice(1, -1); } label = label .replace(/\\(["'])/g, '$1') .replace(/("|&#quot;|#quot;)/g, '"') .replace(/('|'|#apos;)/g, "'"); return label.trim(); } function stripEdgeLabelPrefix(text: string) { const trimmed = text .trim() .replace(/^[-=.ox]+/, '') .trim(); return normalizeLabel(trimmed); } function skipSpaces(text: string, index: number) { let cursor = index; while (cursor < text.length && /\s/.test(text[cursor])) { cursor += 1; } return cursor; } function readNode(text: string, startIndex: number) { let index = skipSpaces(text, startIndex); if (index >= text.length) return null; const idStart = index; while (index < text.length) { const char = text[index]; if (
