{"status":"ok","message-type":"work","message-version":"1.0.0","message":{"indexed":{"date-parts":[[2026,7,1]],"date-time":"2026-07-01T04:01:56Z","timestamp":1782878516109,"version":"3.54.5"},"reference-count":47,"publisher":"Association for Computing Machinery (ACM)","issue":"ISSTA","content-domain":{"domain":[],"crossmark-restriction":false},"short-container-title":["Proc. ACM Softw. Eng."],"published-print":{"date-parts":[[2025,6,22]]},"abstract":"<jats:p>JavaScript libraries are characterized by their widespread use, frequent code changes, and a high tolerance for backward incompatible changes. Awareness of such breaking changes can help developers adapt to version updates and avoid negative impacts. Several tools have been targeted to or can be used to detect breaking change detection in the JavaScript community. However, these tools detect breaking changes using different ways, and there are currently no systematic reviews of these approaches. From a preliminary study on popular JavaScript libraries, we find that existing approaches, including simple regression testing, model-based testing and type differencing cannot detect many breaking changes but can produce plenty of false positives. We discuss the reasons for missing breaking changes and producing false positives.<\/jats:p>\n          <jats:p>Based on the insights from our findings, we propose a new approach named Diagnose that iteratively constructs an object relation graph based on API exploration and forced execution-based type analysis. Diagnose then refine the graphs and reconstruct the graphs in the newer versions of the libraries to detect breaking changes. By evaluating approach on the same set of libraries used in the empirical study, we find that Diagnose can detect much more breaking changes (60.2%) and produce fewer false positives. Therefore, Diagnose is suitable for practical use.<\/jats:p>","DOI":"10.1145\/3728980","type":"journal-article","created":{"date-parts":[[2025,6,22]],"date-time":"2025-06-22T10:52:56Z","timestamp":1750589576000},"page":"2340-2361","source":"Crossref","is-referenced-by-count":1,"title":["More Effective JavaScript Breaking Change Detection via Dynamic Object Relation Graph"],"prefix":"10.1145","volume":"2","author":[{"ORCID":"https:\/\/orcid.org\/0000-0001-7627-1294","authenticated-orcid":false,"given":"Dezhen","family":"Kong","sequence":"first","affiliation":[{"name":"Zhejiang University, Hangzhou, China"}],"role":[{"vocabulary":"crossref","role":"author"}]},{"ORCID":"https:\/\/orcid.org\/0000-0002-7273-6709","authenticated-orcid":false,"given":"Jiakun","family":"Liu","sequence":"additional","affiliation":[{"name":"Singapore Management University, Singapore, Singapore"}],"role":[{"vocabulary":"crossref","role":"author"}]},{"ORCID":"https:\/\/orcid.org\/0000-0002-2906-0598","authenticated-orcid":false,"given":"Chao","family":"Ni","sequence":"additional","affiliation":[{"name":"Zhejiang University, Ningbo, China"}],"role":[{"vocabulary":"crossref","role":"author"}]},{"ORCID":"https:\/\/orcid.org\/0000-0002-4367-7201","authenticated-orcid":false,"given":"David","family":"Lo","sequence":"additional","affiliation":[{"name":"Singapore Management University, Singapore, Singapore"}],"role":[{"vocabulary":"crossref","role":"author"}]},{"ORCID":"https:\/\/orcid.org\/0000-0003-1846-0921","authenticated-orcid":false,"given":"Lingfeng","family":"Bao","sequence":"additional","affiliation":[{"name":"Zhejiang University, Hangzhou, China"}],"role":[{"vocabulary":"crossref","role":"author"}]}],"member":"320","published-online":{"date-parts":[[2025,6,22]]},"reference":[{"key":"e_1_2_1_1_1","doi-asserted-by":"publisher","DOI":"10.1145\/2950290.2950325"},{"key":"e_1_2_1_2_1","doi-asserted-by":"publisher","DOI":"10.1145\/3447245"},{"key":"e_1_2_1_3_1","doi-asserted-by":"publisher","DOI":"10.1109\/SANER.2018.8330249"},{"key":"e_1_2_1_4_1","doi-asserted-by":"publisher","DOI":"10.4230\/DARTS.8.2.7"},{"key":"e_1_2_1_5_1","unstructured":"Clirr. 2024. Clirr. https:\/\/clirr.sourceforge.net"},{"key":"e_1_2_1_6_1","doi-asserted-by":"publisher","DOI":"10.1145\/3475738.3480941"},{"key":"e_1_2_1_7_1","doi-asserted-by":"publisher","DOI":"10.1109\/ESEM.2011.36"},{"key":"e_1_2_1_8_1","doi-asserted-by":"publisher","DOI":"10.1109\/TSE.2019.2918315"},{"key":"e_1_2_1_9_1","unstructured":"DefinitelyTyped. 2025. DefinitelyTyped. https:\/\/github.com\/definitelytyped\/definitelytyped"},{"key":"e_1_2_1_10_1","unstructured":"Dont-break. 2024. Dont-break. https:\/\/github.com\/bahmutov\/dont-break"},{"key":"e_1_2_1_11_1","unstructured":"Dts-gen. 2025. Dts-gen. https:\/\/www.npmjs.com\/package\/dts-gen"},{"key":"e_1_2_1_12_1","doi-asserted-by":"publisher","DOI":"10.1109\/ISSRE55969.2022.00052"},{"key":"e_1_2_1_13_1","unstructured":"ESLint. 2025. ESLint. https:\/\/eslint.org"},{"key":"e_1_2_1_14_1","doi-asserted-by":"publisher","DOI":"10.1145\/2660193.2660215"},{"key":"e_1_2_1_15_1","doi-asserted-by":"publisher","DOI":"10.1145\/2786805.2786831"},{"key":"e_1_2_1_16_1","doi-asserted-by":"publisher","DOI":"10.1007\/978-3-319-78813-5_37"},{"key":"e_1_2_1_17_1","doi-asserted-by":"publisher","DOI":"10.1145\/2025113.2025125"},{"key":"e_1_2_1_18_1","unstructured":"JSHint. 2024. JSHint. https:\/\/jshint.com"},{"key":"e_1_2_1_19_1","doi-asserted-by":"publisher","DOI":"10.1145\/2635868.2635904"},{"key":"e_1_2_1_20_1","doi-asserted-by":"publisher","unstructured":"Jeremy Katz. 2020. Libraries.io Open Source Repository and Dependency Metadata. https:\/\/doi.org\/10.5281\/zenodo.3626071 10.5281\/zenodo.3626071","DOI":"10.5281\/zenodo.3626071"},{"key":"e_1_2_1_21_1","doi-asserted-by":"publisher","DOI":"10.1145\/3038912.3052674"},{"key":"e_1_2_1_22_1","doi-asserted-by":"publisher","unstructured":"Dezhen Kong Jiakun Liu Lingfeng Bao and David Lo. 2024. Towards Better Comprehension of Breaking Changes in the NPM Ecosystem. ACM Transactions on Software Engineering and Methodology https:\/\/doi.org\/10.1145\/3702991 10.1145\/3702991","DOI":"10.1145\/3702991"},{"key":"e_1_2_1_23_1","unstructured":"Dezhen Kong Jiakun Liu Chao Ni David Lo and Lingfeng Bao. 2025. Diagnose Website. https:\/\/github.com\/cstimkong\/diagnose"},{"key":"e_1_2_1_24_1","doi-asserted-by":"publisher","DOI":"10.1007\/978-3-662-54494-5_6"},{"key":"e_1_2_1_25_1","doi-asserted-by":"publisher","DOI":"10.1145\/3656424"},{"key":"e_1_2_1_26_1","doi-asserted-by":"publisher","DOI":"10.1145\/2858965.2814272"},{"key":"e_1_2_1_27_1","doi-asserted-by":"publisher","DOI":"10.4230\/DARTS.4.3.8"},{"key":"e_1_2_1_28_1","doi-asserted-by":"publisher","DOI":"10.1145\/3428255"},{"key":"e_1_2_1_29_1","doi-asserted-by":"publisher","DOI":"10.1145\/3338906.3338940"},{"key":"e_1_2_1_30_1","unstructured":"Mozilla. 2025. JavaScript Instanceof Operator. https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Operators\/instanceof"},{"key":"e_1_2_1_31_1","unstructured":"Mozilla. 2025. JavaScript Symbol. https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Symbol"},{"key":"e_1_2_1_32_1","unstructured":"Mozilla. 2025. JavaScript Symbol.iterator. https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Symbol\/iterator"},{"key":"e_1_2_1_33_1","unstructured":"Mozilla. 2025. JavaScript Symbol.toPrimitive. https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Symbol\/toPrimitive"},{"key":"e_1_2_1_34_1","unstructured":"Mozilla. 2025. JavaScript Symbol.toStringTag. https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Symbol\/toStringTag"},{"key":"e_1_2_1_35_1","doi-asserted-by":"publisher","DOI":"10.1145\/3460319.3464836"},{"key":"e_1_2_1_36_1","unstructured":"NodeJS. 2025. Node.js Event. https:\/\/nodejs.org\/api\/events.html"},{"key":"e_1_2_1_37_1","doi-asserted-by":"publisher","DOI":"10.1109\/ASE.2015.27"},{"key":"e_1_2_1_38_1","unstructured":"Pidiff. 2024. Pidiff. https:\/\/github.com\/rohanpm\/pidiff"},{"key":"e_1_2_1_39_1","doi-asserted-by":"publisher","DOI":"10.5555\/2818754.2818795"},{"key":"e_1_2_1_40_1","doi-asserted-by":"publisher","DOI":"10.1016\/J.JSS.2016.04.008"},{"key":"e_1_2_1_41_1","unstructured":"RevAPI. 2024. RevAPI. https:\/\/revapi.org"},{"key":"e_1_2_1_42_1","unstructured":"SemVer. 2025. Semantic Versioning. http:\/\/semver.org"},{"key":"e_1_2_1_43_1","doi-asserted-by":"publisher","DOI":"10.1109\/MSR.2017.14"},{"key":"e_1_2_1_44_1","doi-asserted-by":"publisher","DOI":"10.1145\/2950290.2950292"},{"key":"e_1_2_1_45_1","doi-asserted-by":"publisher","DOI":"10.1145\/3576037"},{"key":"e_1_2_1_46_1","doi-asserted-by":"publisher","DOI":"10.1145\/3551349.3556956"},{"key":"e_1_2_1_47_1","doi-asserted-by":"publisher","unstructured":"Zhaoxu Zhang Hengcheng Zhu Ming Wen Yida Tao Yepang Liu and Yingfei Xiong. 2020. How do python framework apis evolve? an exploratory study. In 2020 ieee 27th international conference on software analysis evolution and reengineering (saner). 81\u201392. https:\/\/doi.org\/10.1109\/SANER48275.2020.9054800 10.1109\/SANER48275.2020.9054800","DOI":"10.1109\/SANER48275.2020.9054800"}],"container-title":["Proceedings of the ACM on Software Engineering"],"original-title":[],"language":"en","link":[{"URL":"https:\/\/dl.acm.org\/doi\/pdf\/10.1145\/3728980","content-type":"unspecified","content-version":"vor","intended-application":"similarity-checking"}],"deposited":{"date-parts":[[2025,7,16]],"date-time":"2025-07-16T16:56:20Z","timestamp":1752684980000},"score":1,"resource":{"primary":{"URL":"https:\/\/dl.acm.org\/doi\/10.1145\/3728980"}},"subtitle":[],"short-title":[],"issued":{"date-parts":[[2025,6,22]]},"references-count":47,"journal-issue":{"issue":"ISSTA","published-print":{"date-parts":[[2025,6,22]]}},"alternative-id":["10.1145\/3728980"],"URL":"https:\/\/doi.org\/10.1145\/3728980","relation":{},"ISSN":["2994-970X"],"issn-type":[{"value":"2994-970X","type":"electronic"}],"subject":[],"published":{"date-parts":[[2025,6,22]]}}}