Ran Cheng

99 papers A* 7A 5B 1C 1Misc 1Journal 63Unranked 20
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Yu Xue, Pengcheng Jiang, Chenchen Zhu, Yong Zhang, Ran Cheng, Kaizhou Gao, Dunwei Gong
2026 J jnl
CoRR
Wei Wu, Fan Lu, Yunnan Wang, Shuai Yang, Shi Liu, Fangjing Wang, Qian Zhu, He Sun, Yong Wang, Shuailei Ma, Yiyu Ren, Kejia Zhang, Hui Yu, Jingmei Zhao, Shuai Zhou, Zhenqi Qiu, Houlong Xiong, Ziyu Wang, Zechen Wang, Ran Cheng, Yong-Lu Li, Yongtao Huang, Xing Zhu, Yujun Shen, Kecheng Zheng
2026 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Bo Li, Junfeng Tan, Can Liu, Kai Chen, Tingjie Yang, Huanning Zhang, Xueyang Bai, Wei Mao, Jiuren Zhou, Xiao Yu, Ran Cheng, Guoyong Shi, Bing Chen, Yan Liu, Genquan Han
2026 J jnl
CoRR
Ran Cheng
2026 J jnl
CoRR
Ran Cheng, Lailai Zhu
2026 J jnl
IEEE Signal Process. Lett.
Mengmeng Zhang, Zihao Yu, Hongyun Lu, Yuan Li, Ran Cheng, Huihui Bai, Hongyuan Jing, Zhi Liu
2026 J jnl
CoRR
Ziyu Wang, Chenyuan Liu, Yushun Xiang, Runhao Zhang, Qingbo Hao, Hongliang Lu, Houyu Chen, Zhizhong Feng, Kaiyue Zheng, Dehao Ye, Xianchao Zeng, Xinyu Zhou, Boran Wen, Jiaxin Li, Mingyu Zhang, Kecheng Zheng, Qian Zhu, Ran Cheng, Yong-Lu Li
2026 J jnl
CoRR
Zirui Ge, Pengxiang Ding, Baohua Yin, Qishen Wang, Zhiyong Xie, Yemin Wang, Jinbo Wang, Hengtao Li, Runze Suo, Wenxuan Song, Han Zhao, Shangke Lyu, Zhaoxin Fan, Haoang Li, Ran Cheng, Cheng Chi, Huibin Ge, Yaozhi Luo, Donglin Wang
2025 J jnl
Sci. China Inf. Sci.
Jiacheng Xu, Jiayi Zhao, Hongrui Zhang, Haoji Qian, Jiani Gu, Bowen Chen, Gaobo Lin, Rongzong Shen, Xinda Song, Huan Liu, Yian Ding, Minglei Ma, Miaomiao Zhang, Xiao Yu, Bing Chen, Ran Cheng, Gaobo Xu, Huaxiang Yin, Yan Liu, Jiajia Chen, Chengji Jin, Genquan Han
2025 A* conf
ICRA
Ran Cheng, Qi Shao, Xin-Jun Liu, Huichan Zhao
2025 J jnl
CoRR
Zhenyu Liang, Hao Li, Naiwei Yu, Kebin Sun, Ran Cheng
2025 J jnl
CoRR
Zhongyi Zhou, Yichen Zhu, Minjie Zhu, Junjie Wen, Ning Liu, Zhiyuan Xu, Weibin Meng, Ran Cheng, Yaxin Peng, Chaomin Shen, Feifei Feng
2025 J jnl
Sci. China Inf. Sci.
Xiao Yu, Ni Zhong, Yan Cheng, Tianjiao Xin, Qing Luo, Tiancheng Gong, Jiezhi Chen, Jixuan Wu, Ran Cheng, Zhiyuan Fu, Kechao Tang, Jin Luo, Tianling Ren, Fei Xue, Lin Chen, Tianyu Wang, Xueqing Li, Xiuyan Li, Ping Wang, Xinqiang Wang, Jie Sun, Anquan Jiang, Peiyuan Du, Bing Chen, Chengji Jin, Jiajia Chen, Haoji Qian, Wei Mao, Siying Zheng, Huan Liu, Haiwen Xu, Can Liu, Zhihao Shen, Xiaoxi Li, Bochang Li, Zheng-Dong Luo, Jiuren Zhou, Yan Liu, Yue Hao, Genquan Han
2025 J jnl
CoRR
Hao Li, Zhenyu Liang, Ran Cheng
2025 J jnl
CoRR
Huimin Yan, Longfei Xu, Junjie Sun, Ni Ou, Wei Luo, Xing Tan, Ran Cheng, Kaikui Liu, Xiangxiang Chu
2025 J jnl
CoRR
Zeyuan Ma, Yue-Jiao Gong, Hongshu Guo, Wenjie Qiu, Sijie Ma, Hongqiao Lian, Jiajun Zhan, Kaixu Chen, Chen Wang, Zhiyang Huang, Zechuan Huang, Guojun Peng, Ran Cheng, Yining Ma
2025 J jnl
CoRR
Minyang Chen, Chenchen Feng, Ran Cheng
2025 J jnl
CoRR
Bowen Zheng, Ran Cheng
2025 A* conf
ICRA
Minjie Zhu, Yichen Zhu, Jinming Li, Junjie Wen, Zhiyuan Xu, Ning Liu, Ran Cheng, Chaomin Shen, Yaxin Peng, Feifei Feng, Jian Tang
2025 J jnl
CoRR
Ruihao Xia, Junhong Cai, Luziwei Leng, Liuyi Wang, Chengju Liu, Ran Cheng, Yang Tang, Pan Zhou
2025 J jnl
CoRR
Lishuang Wang, Mengfei Zhao, Enyu Liu, Kebin Sun, Ran Cheng
2025 J jnl
IEEE Robotics Autom. Lett.
Junjie Wen, Yichen Zhu, Jinming Li, Minjie Zhu, Zhibin Tang, Kun Wu, Zhiyuan Xu, Ning Liu, Ran Cheng, Chaomin Shen, Yaxin Peng, Feifei Feng, Jian Tang
2024 J jnl
CoRR
Zhou Zhou, Guohang He, Zheng Zhang, Luziwei Leng, Qinghai Guo, Jianxing Liao, Xuan Song, Ran Cheng
2024 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Mengmeng Zhang, Zeliang Zhang, Yuan Li, Ran Cheng, Hongyuan Jing, Zhi Liu
2024 J jnl
CoRR
Haoming Zhang, Ran Cheng
2024 J jnl
CoRR
Zhenyu Liang, Tao Jiang, Kebin Sun, Ran Cheng
2024 J jnl
CoRR
Hui Bai, Ran Cheng
2024 J jnl
CoRR
Jinming Li, Yichen Zhu, Zhibin Tang, Junjie Wen, Minjie Zhu, Xiaoyu Liu, Chengmeng Li, Ran Cheng, Yaxin Peng, Feifei Feng
2024 conf
IRPS
Xinze Li, Yiqin Zeng, Yuxuan Wu, Ying Sun, Junru Qu, Chengji Jin, Jiani Gu, Rongzong Shen, Gaobo Lin, Dawei Gao, Xiao Yu, Bing Chen, Ran Cheng, Genquan Han
2024 conf
IRPS
Junru Qu, Dong Liu, Bing Chen, Ying Sun, Xinze Li, Chengji Jin, Jiajia Chen, Haoji Qian, Rongzong Shen, Xiao Yu, Dawei Gao, Ran Cheng, Genquan Han
2024 A conf
IROS
Jiaqi Yang, Yucong Chen, Xiangting Meng, Chenxin Yan, Min Li, Ran Cheng, Lige Liu, Tao Sun, Laurent Kneip
2024 J jnl
CoRR
Martin Lentschat, Cyril Labbé, Ran Cheng
2024 J jnl
CoRR
Zherui Zhang, Fan Yang, Ran Cheng, Yuxin Ma
2024 J jnl
CoRR
Zexuan Fan, Sunchun Zhou, Hengye Yang, Junyi Cai, Ran Cheng, Lige Liu, Tao Sun
2024 J jnl
CoRR
Minjie Zhu, Yichen Zhu, Jinming Li, Junjie Wen, Zhiyuan Xu, Ning Liu, Ran Cheng, Chaomin Shen, Yaxin Peng, Feifei Feng, Jian Tang
2024 J jnl
CoRR
Luming Yang, Tao Jiang, Ran Cheng
2024 J jnl
CoRR
Lishuang Wang, Mengfei Zhao, Enyu Liu, Kebin Sun, Ran Cheng
2024 J jnl
CoRR
Junjie Wen, Yichen Zhu, Jinming Li, Minjie Zhu, Kun Wu, Zhiyuan Xu, Ning Liu, Ran Cheng, Chaomin Shen, Yaxin Peng, Feifei Feng, Jian Tang
2024 J jnl
CoRR
Haoxi Zhang, Xinxu Zhang, Yuanxin Lin, Maiqi Wang, Yi Lai, Yu Wang, Linfeng Yu, Yufeng Xu, Ran Cheng, Edward Szczerbicki
2024 J jnl
CoRR
Yanchen Li, Jiachun Li, Kebin Sun, Luziwei Leng, Ran Cheng
2024 J jnl
CoRR
Yang Cheng, Qingyuan Shu, Albert Lee, Haoran He, Ivy Zhu, Haris Suhail, Minzhang Chen, Renhe Chen, Zirui Wang, Hantao Zhang, Chih-Yao Wang, Shan-Yi Yang, Yu-Chen Hsin, Cheng-Yi Shih, Hsin-Han Lee, Ran Cheng, Sudhakar Pamarti, Xufeng Kou, Kang L. Wang
2023 J jnl
CoRR
Yansong Huang, Zherui Zhang, Ao Jiao, Yuxin Ma, Ran Cheng
2023 J jnl
CoRR
Rui Zhang, Luziwei Leng, Kaiwei Che, Hu Zhang, Jie Cheng, Qinghai Guo, Jiangxing Liao, Ran Cheng
2023 J jnl
CoRR
Hu Zhang, Luziwei Leng, Kaiwei Che, Qian Liu, Jie Cheng, Qinghai Guo, Jiangxing Liao, Ran Cheng
2023 conf
ESSDERC
Yiqin Zeng, Zhetao Ding, Xueyang Li, Minglei Ma, Yue Peng, Rongzong Shen, Gaobo Lin, Chengji Jin, Xiao Yu, Bing Chen, Ran Cheng, Genquan Han
2023 J jnl
IEEE Access
Qian Li, Cong Zhao, Ran Cheng
2023 conf
ICICDT
Ran Cheng
2023 conf
ICICDT
Xinze Li, Yuxuan Wu, Qiao Teng, Ying Sun, Xiao Gong, Guillaume Besnard, Christophe Maleville, Olivier Weber, Rui Zhang, Bing Chen, Dawei Gao, Ran Cheng
2023 J jnl
IEEE Trans. Intell. Veh.
Yuan Ren, Bingbing Liu, Ran Cheng, Christopher Agia
2023 J jnl
CoRR
Bowen Zheng, Ran Cheng
2023 A conf
IROS
Runze Yuan, Ran Cheng, Lige Liu, Tao Sun, Laurent Kneip
2023 J jnl
CoRR
Runze Yuan, Ran Cheng, Lige Liu, Tao Sun, Laurent Kneip
2023 J jnl
Sci. China Inf. Sci.
Haoran Yu, Tiancheng Gong, Peng Yuan, Yuan Wang, Zhaomeng Gao, Xiaoxin Xu, Ying Sun, Ran Cheng, Jianfeng Gao, Junfeng Li, Bing Chen, Qing Luo
2022 J jnl
J. Sensors
Wenxiu He, Ran Cheng, Keji Mao, Ke Yan, Jianliang Wei, Yingying Xu
2022 conf
ICICDT
Xinze Li, Ying Sun, Jing Wan, Bing Chen, Ran Cheng, Genquan Han
2022 J jnl
Integr.
Ke Hu, Wenhao Sun, Zhongbo Nie, Ran Cheng, Song Chen, Yi Kang
2022 J jnl
CoRR
Ran Cheng, Xinyu Jiang, Yuan Chen, Lige Liu, Tao Sun
2022 conf
ACCV (1)
Jiaxin Wei, Lige Liu, Ran Cheng, Wenqing Jiang, Minghao Xu, Xinyu Jiang, Tao Sun, Sören Schwertfeger, Laurent Kneip
2022 J jnl
CoRR
Jiaxin Wei, Lige Liu, Ran Cheng, Wenqing Jiang, Minghao Xu, Xinyu Jiang, Tao Sun, Sören Schwertfeger, Laurent Kneip
2022 conf
EMBC
Pinyuan Zhong, Ran Cheng, Xiaoying Tang
2021 A* conf
CVPR
Ran Cheng, Ryan Razani, Ehsan Taghavi, Enxu Li, Bingbing Liu
2021 J jnl
CoRR
Ran Cheng, Ryan Razani, Ehsan Taghavi, Enxu Li, Bingbing Liu
2021 conf
ICICDT
Ying Sun, Yuchen Gu, Bing Chen, Xiao Yu, Ran Cheng
2021 A* conf
ICCV
Ryan Razani, Ran Cheng, Enxu Li, Ehsan Taghavi, Yuan Ren, Bingbing Liu
2021 J jnl
CoRR
Ryan Razani, Ran Cheng, Enxu Li, Ehsan Taghavi, Yuan Ren, Bingbing Liu
2021 A conf
IROS
Ran Cheng, Christopher Agia, Florian Shkurti, David Meger, Gregory Dudek
2021 A* conf
ICRA
Ryan Razani, Ran Cheng, Ehsan Taghavi, Bingbing Liu
2021 J jnl
CoRR
Ryan Razani, Ran Cheng, Ehsan Taghavi, Bingbing Liu
2021 J jnl
Sci. China Inf. Sci.
Ran Cheng, Ying Sun, Yiming Qu, Wei Liu, Fanyu Liu, Jianfeng Gao, Nuo Xu, Bing Chen
2021 J jnl
CoRR
Ran Cheng, Chao Chen, Longfei Xu, Shen Li, Lei Wang, Hengbin Cui, Kaikui Liu, Xiaolong Li
2021 J jnl
CoRR
Yiming Chen, Yan Zhang, Chen Zhang, Grandee Lee, Ran Cheng, Haizhou Li
2021 conf
EMNLP (1)
Yiming Chen, Yan Zhang, Chen Zhang, Grandee Lee, Ran Cheng, Haizhou Li
2021 A* conf
ICRA
Ran Cheng, Ryan Razani, Yuan Ren, Bingbing Liu
2021 J jnl
CoRR
Ran Cheng, Ryan Razani, Yuan Ren, Bingbing Liu
2020 conf
CRV
Ran Cheng, Christopher Agia, David Meger, Gregory Dudek
2020 Misc conf
CoRL
Ran Cheng, Christopher Agia, Yuan Ren, Xinhai Li, Bingbing Liu
2020 J jnl
CoRR
Ran Cheng, Christopher Agia, Yuan Ren, Xinhai Li, Bingbing Liu
2019 C conf
IGARSS
Jie Li, Ran Cheng, Yesheng Gao, Xue Jiang, Bin Yuan, Ye Zhang, Xingzhao Liu
2019 conf
ASICON
Ran Cheng, Ming Tian, Changfeng Wang, Zhimei Cai, Jie Zhang, Yan-Yan Zhang, Yi Zhao
2019 conf
ASICON
Zhimei Cai, Zhiyong Han, Ming Tian, Changfeng Wang, Xiaoming Hu, Ran Cheng, Yi Zhao
2018 conf
IRPS
Yiming Qu, Ran Cheng, Wei Liu, Junkang Li, Bich-Yen Nguyen, Olivier Faynot, Nuo Xu, Bing Chen, Yi Zhao
2018 conf
ISER
Travis Manderson, Ran Cheng, David Meger, Gregory Dudek
2018 J jnl
CoRR
Ran Cheng, Uday S. Goteti, Michael C. Hamilton
2018 A conf
IROS
Travis Manderson, Juan Camilo Gamboa Higuera, Ran Cheng, Gregory Dudek
2017 conf
ChinaCom (2)
Ran Cheng, Yueming Lu, Jiefu Gan
2017 J jnl
IEEE Trans. Ind. Electron.
Liang Xu, Guohai Liu, Wenxiang Zhao, Xinyu Yang, Ran Cheng
2017 J jnl
IEEE Trans. Ind. Electron.
Huawei Zhou, Wenxiang Zhao, Guohai Liu, Ran Cheng, Ying Xie
2016 conf
DSC
Sheng Zhang, Danling Zhao, Ran Cheng, Jiajun Cheng, Hui Wang
2016
Ran Cheng
2016 J jnl
IEICE Trans. Electron.
Haiyan Jin, Xinlin Xue, Ran Cheng, Hailu Jin
2015 B conf
ASONAM
Ran Cheng, Jun Pang, Yang Zhang
2015 J jnl
IEICE Electron. Express
Haiyan Jin, Zheng Zhu, Ran Cheng
2012 J jnl
NeuroImage
Ran Cheng, Yu Shang, Don Hayes Jr., Sibu P. Saha, Guoqiang Yu
2011 conf
BIS
Ran Cheng, Shazia Sadiq, Marta Indulska
2009 A* conf
ACM Multimedia
Ran Cheng, Zi Huang, Heng Tao Shen, Xiaofang Zhou
2006 J jnl
User Model. User Adapt. Interact.
Ran Cheng, Julita Vassileva
2005 A conf
AIED
Ran Cheng, Julita Vassileva
2005 conf
HICSS
Ran Cheng, Julita Vassileva
2005 conf
User Modeling
Ran Cheng, Julita Vassileva
redb/extractors/js_extractors/js_patterns.py
← Index redb/extractors/js_extractors/js_patterns.py python
"""Canonical, compiled JavaScript regex patterns shared across JS extractors.

All suspicious-API patterns and the few feature-only patterns live here so each
expression is compiled exactly once per Python process and so any pattern that
was previously duplicated across `js_features.py` and `js_suspicious_apis.py`
now resolves to a single shared compiled object.

JavaScript is case-sensitive at runtime, but every suspicious-API pattern matches
either a literal-case identifier (`\\beval\\s*\\(`, `String\\.fromCharCode`, etc.)
or a string-quoted token (`"powershell"`). Compiling them with `re.IGNORECASE`
matches the historical behaviour of `JSSuspiciousAPIsExtractor` and is safe for
the patterns that historically came from `JSFeaturesExtractor` — those literals
are spelled in real-world JS exactly as written.

`scan_source()` is the entry point used by extractors: it walks the source once
per pattern using the pre-compiled regexes and returns a flat
`{name: {"count": N, "lines": [unique_line_numbers_sorted]}}` dict. Both
`JSFeaturesExtractor` and `JSSuspiciousAPIsExtractor` consume the same dict so
the per-pattern × per-line loops they used to run independently collapse to a
single shared scan.
"""

import bisect
import re
from typing import Dict, Iterable, List, Mapping

_FLAGS = re.IGNORECASE

# Canonical compiled patterns, keyed by their human-readable name. The name is
# also the value emitted into `redb_js_suspicious_apis.api_name`.
PATTERNS = {
    # ---- code execution ----
    "eval": re.compile(r"\beval\s*\(", _FLAGS),
    "Function constructor": re.compile(r"\bnew\s+Function\s*\(", _FLAGS),
    "execScript": re.compile(r"\bexecScript\s*\(", _FLAGS),
    "document.write": re.compile(r"\bdocument\.write(?:ln)?\s*\(", _FLAGS),
    "innerHTML assignment": re.compile(r"\.innerHTML\s*=", _FLAGS),
    "outerHTML assignment": re.compile(r"\.outerHTML\s*=", _FLAGS),
    "insertAdjacentHTML": re.compile(r"\.insertAdjacentHTML\s*\(", _FLAGS),
    # ---- network ----
    "XMLHttpRequest": re.compile(r"\bnew\s+XMLHttpRequest\b", _FLAGS),
    "fetch": re.compile(r"\bfetch\s*\(", _FLAGS),
    "WebSocket": re.compile(r"\bnew\s+WebSocket\s*\(", _FLAGS),
    "navigator.sendBeacon": re.compile(r"\bnavigator\.sendBeacon\s*\(", _FLAGS),
    "ActiveXObject XMLHTTP": re.compile(
        r"ActiveXObject\s*\(\s*[\"\'](?:MSXML2\.XMLHTTP|Microsoft\.XMLHTTP)", _FLAGS
    ),
    "require network module": re.compile(
        r"require\s*\(\s*[\"\'](?:http|https|net|dgram)[\"\']", _FLAGS
    ),
    "axios": re.compile(r"\baxios\b", _FLAGS),
    # ---- filesystem ----
    "require fs": re.compile(r"require\s*\(\s*[\"\']fs[\"\']", _FLAGS),
    "require path": re.compile(r"require\s*\(\s*[\"\']path[\"\']", _FLAGS),
    "FileSystemObject": re.compile(r"Scripting\.FileSystemObject", _FLAGS),
    "ADODB.Stream": re.compile(r"ADODB\.Stream", _FLAGS),
    "Shell.Application": re.compile(r"Shell\.Application", _FLAGS),
    "WScript.CreateObject": re.compile(r"WScript\.CreateObject", _FLAGS),
    # ---- process ----
    "require child_process": re.compile(r"require\s*\(\s*[\"\']child_process[\"\']", _FLAGS),
    "child_process exec": re.compile(r"child_process\.(?:exec|spawn|execFile|fork)\s*\(", _FLAGS),
    "WScript.Shell": re.compile(r"WScript\.Shell", _FLAGS),
    "WScript.Shell.Run": re.compile(r"\.Run\s*\(", _FLAGS),
    "WScript.Shell.Exec": re.compile(r"\.Exec\s*\(", _FLAGS),
    "ShellExecute": re.compile(r"\bShellExecute\b", _FLAGS),
    "PowerShell reference": re.compile(r"[\"\']powershell[\"\']", _FLAGS),
    "cmd.exe reference": re.compile(r"[\"\']cmd\.exe[\"\']", _FLAGS),
    "require os": re.compile(r"require\s*\(\s*[\"\']os[\"\']", _FLAGS),
    # ---- registry ----
    "RegRead": re.compile(r"\.RegRead\s*\(", _FLAGS),
    "RegWrite": re.compile(r"\.RegWrite\s*\(", _FLAGS),
    "RegDelete": re.compile(r"\.RegDelete\s*\(", _FLAGS),
    "StdRegProv": re.compile(r"StdRegProv", _FLAGS),
    # ---- crypto / encoding ----
    "atob": re.compile(r"\batob\s*\(", _FLAGS),
    "btoa": re.compile(r"\bbtoa\s*\(", _FLAGS),
    "String.fromCharCode": re.compile(r"String\.fromCharCode\s*\(", _FLAGS),
    "unescape": re.compile(r"\bunescape\s*\(", _FLAGS),
    "decodeURIComponent": re.compile(r"\bdecodeURIComponent\s*\(", _FLAGS),
    "Buffer.from": re.compile(r"Buffer\.from\s*\(", _FLAGS),
    "crypto module": re.compile(r"crypto\.create(?:Cipher|Decipher|Hash|Hmac)", _FLAGS),
    # ---- DOM manipulation ----
    "document.forms": re.compile(r"document\.forms", _FLAGS),
    "document.cookie": re.compile(r"document\.cookie", _FLAGS),
    "querySelector sensitive input": re.compile(
        r"document\.querySelector\s*\([^)]*(?:password|credit|card|cvv|ssn)", _FLAGS
    ),
    "submit event listener": re.compile(r"addEventListener\s*\(\s*[\"\']submit", _FLAGS),
    "createElement script/iframe": re.compile(
        r"\.createElement\s*\(\s*[\"\'](?:script|iframe)", _FLAGS
    ),
    "dynamic script src": re.compile(r"\.src\s*=\s*[\"\'](?:https?://|//)", _FLAGS),
}

# Pattern name -> category (one of code_execution / network / filesystem /
# process / registry / crypto_encoding / dom_manipulation).
CATEGORIES = {
    "eval": "code_execution",
    "Function constructor": "code_execution",
    "execScript": "code_execution",
    "document.write": "code_execution",
    "innerHTML assignment": "code_execution",
    "outerHTML assignment": "code_execution",
    "insertAdjacentHTML": "code_execution",
    "XMLHttpRequest": "network",
    "fetch": "network",
    "WebSocket": "network",
    "navigator.sendBeacon": "network",
    "ActiveXObject XMLHTTP": "network",
    "require network module": "network",
    "axios": "network",
    "require fs": "filesystem",
    "require path": "filesystem",
    "FileSystemObject": "filesystem",
    "ADODB.Stream": "filesystem",
    "Shell.Application": "filesystem",
    "WScript.CreateObject": "filesystem",
    "require child_process": "process",
    "child_process exec": "process",
    "WScript.Shell": "process",
    "WScript.Shell.Run": "process",
    "WScript.Shell.Exec": "process",
    "ShellExecute": "process",
    "PowerShell reference": "process",
    "cmd.exe reference": "process",
    "require os": "process",
    "RegRead": "registry",
    "RegWrite": "registry",
    "RegDelete": "registry",
    "StdRegProv": "registry",
    "atob": "crypto_encoding",
    "btoa": "crypto_encoding",
    "String.fromCharCode": "crypto_encoding",
    "unescape": "crypto_encoding",
    "decodeURIComponent": "crypto_encoding",
    "Buffer.from": "crypto_encoding",
    "crypto module": "crypto_encoding",
    "document.forms": "dom_manipulation",
    "document.cookie": "dom_manipulation",
    "querySelector sensitive input": "dom_manipulation",
    "submit event listener": "dom_manipulation",
    "createElement script/iframe": "dom_manipulation",
    "dynamic script src": "dom_manipulation",
}

# Patterns consumed only by JSFeaturesExtractor (no category, never surfaced as
# a suspicious-API row). Kept here so every JS regex is compiled in one place.
FEATURE_PATTERNS = {
    "hex_escape": re.compile(r"\\x[0-9a-fA-F]{2}"),
    "unicode_escape": re.compile(r"\\u[0-9a-fA-F]{4}"),
    "base64_string": re.compile(r"[A-Za-z0-9+/]{40,}={0,2}"),
    # decodeURI matches BOTH decodeURI and decodeURIComponent. The latter is also
    # a suspicious-API pattern in PATTERNS; this broader form is what the
    # `decodeuri_count` feature column has historically counted.
    "decodeURI": re.compile(r"\b(?:decodeURI|decodeURIComponent)\s*\(", _FLAGS),
    "settimeout_setinterval": re.compile(r"\b(?:setTimeout|setInterval)\s*\(", _FLAGS),
    "function_decl": re.compile(r"\bfunction\s+\w+\s*\(|\bfunction\s*\("),
    "var_decl": re.compile(r"\b(?:var|let|const)\s+"),
    "string_concat": re.compile(r"[\"\'][\s]*\+[\s]*[\"\']"),
    "comment": re.compile(r"//.*?$|/\*[\s\S]*?\*/", re.MULTILINE),
    "long_string": re.compile(r"[\"\']([^\"\']{256,})[\"\']"),
    "array_function_call": re.compile(r"\[(?:0x[0-9a-f]+|[\d]+)\]\s*\(", _FLAGS),
}

# Patterns consumed only by JSStringsExtractor for encoded-string discovery.
# Scoped to *hidden* strings only — patterns whose decoded form is not visible
# to a substring search over the raw text. Plain long literals are not
# extracted here because they're already preserved in code_text_content and
# scraped by the IOC pipeline over text_raw / text_normalized.
#
# Distinct from FEATURE_PATTERNS even where the names rhyme:
#   FEATURE_PATTERNS["hex_escape"] / ["unicode_escape"]   -> single escape
#   STRING_PATTERNS["hex_escape_seq"] / ["unicode_escape_seq"] -> 4+ / 3+ in a row
#   FEATURE_PATTERNS["base64_string"]                     -> bare base64 token
#   STRING_PATTERNS["base64_quoted"]                      -> base64 inside JS quotes
# These do not share match objects with the suspicious-API or feature scans, so
# they are not folded into JSContext.scan; the strings extractor walks them
# itself (one finditer per pattern, with shared line-offset bisect in #4b).
STRING_PATTERNS = {
    "hex_escape_seq": re.compile(r"(?:\\x[0-9a-fA-F]{2}){4,}"),
    "unicode_escape_seq": re.compile(r"(?:\\u[0-9a-fA-F]{4}){3,}"),
    "charcode_call": re.compile(r"String\.fromCharCode\s*\(\s*([\d,\s]+)\s*\)"),
    "base64_quoted": re.compile(r"[\"\']([A-Za-z0-9+/]{40,}={0,2})[\"\']"),
    "concat_chain": re.compile(r"(?:[\"\'][^\"\']+[\"\']\s*\+\s*){3,}[\"\'][^\"\']+[\"\']"),
}


def line_offsets(source: str) -> List[int]:
    """Sorted list of byte offsets for every newline in `source`, plus a final
    sentinel of len(source). Used to translate match offsets into 1-indexed
    line numbers via bisect.
    """
    offsets = [-1]  # so that bisect_right of offset 0 returns line 1
    push = offsets.append
    idx = source.find("\n")
    while idx != -1:
        push(idx)
        idx = source.find("\n", idx + 1)
    return offsets


def _scan_one(
    pattern: "re.Pattern[str]", source: str, offsets: List[int]
) -> Dict[str, object]:
    """Run a single compiled pattern over `source` and return count + unique lines."""
    count = 0
    seen_lines: "set[int]" = set()
    for m in pattern.finditer(source):
        count += 1
        seen_lines.add(bisect.bisect_right(offsets, m.start()))
    if not count:
        return None  # type: ignore[return-value]
    return {"count": count, "lines": sorted(seen_lines)}


def scan_source(
    source: str,
    patterns: Iterable[Mapping[str, "re.Pattern[str]"]] = (PATTERNS, FEATURE_PATTERNS),
) -> Dict[str, Dict[str, object]]:
    """Scan `source` against every compiled pattern in `patterns`.

    Returns a dict keyed by pattern name. Each entry has:
        "count": total number of matches in the source
        "lines": sorted list of unique 1-indexed line numbers where the pattern
                 matched (deduplicated — multiple matches on the same line
                 collapse to one entry, preserving the historical
                 line-set semantics of JSSuspiciousAPIsExtractor)
    Patterns with zero matches are absent from the dict; callers should default
    to {"count": 0, "lines": []}.
    """
    if not source:
        return {}
    offsets = line_offsets(source)
    results: Dict[str, Dict[str, object]] = {}
    for table in patterns:
        for name, pat in table.items():
            entry = _scan_one(pat, source, offsets)
            if entry is not None:
                results[name] = entry
    return results