diff --git a/config/versions.history.json b/config/versions.history.json new file mode 100644 index 0000000000..7ce2b5265e --- /dev/null +++ b/config/versions.history.json @@ -0,0 +1,3675 @@ +{ + "csharp": { + "1.1.0.0": { + "releaseDate": "2013-08-04" + }, + "1.4.0": { + "releaseDate": "2013-11-08" + }, + "1.5.0": { + "releaseDate": "2013-11-08" + }, + "1.6.0": { + "releaseDate": "2013-12-06" + }, + "1.7.0": { + "releaseDate": "2014-01-02" + }, + "1.9.0": { + "releaseDate": "2014-02-24" + }, + "1.10.0": { + "releaseDate": "2014-03-27" + }, + "1.11.0": { + "releaseDate": "2014-05-02" + }, + "1.12.0": { + "releaseDate": "2014-06-10" + }, + "1.13.0": { + "releaseDate": "2014-07-17" + }, + "1.14.0": { + "releaseDate": "2014-07-24" + }, + "1.15.0": { + "releaseDate": "2014-07-24" + }, + "1.16.0": { + "releaseDate": "2014-08-04" + }, + "2.0.0": { + "releaseDate": "2014-08-13" + }, + "2.2.0": { + "releaseDate": "2014-09-14" + }, + "2.3.0": { + "releaseDate": "2014-10-14" + }, + "2.3.1": { + "releaseDate": "2014-10-22" + }, + "2.3.2": { + "releaseDate": "2014-11-24" + }, + "2.3.3": { + "releaseDate": "2014-11-25" + }, + "2.4.0": { + "releaseDate": "2014-11-30" + }, + "2.4.1": { + "releaseDate": "2014-12-04" + }, + "2.5.1": { + "releaseDate": "2015-01-02" + }, + "3.0.0": { + "releaseDate": "2015-01-02" + }, + "3.0.1": { + "releaseDate": "2015-01-03" + }, + "3.0.2": { + "releaseDate": "2015-01-04" + }, + "3.0.3": { + "releaseDate": "2015-01-09" + }, + "3.0.4": { + "releaseDate": "2015-01-21" + }, + "3.0.5": { + "releaseDate": "2015-02-18" + }, + "3.1.0": { + "releaseDate": "2015-04-10" + }, + "3.1.1": { + "releaseDate": "2015-05-04" + }, + "3.1.2": { + "releaseDate": "2015-06-03" + }, + "3.1.4": { + "releaseDate": "2015-06-30" + }, + "3.1.5": { + "releaseDate": "2015-08-30" + }, + "3.1.6": { + "releaseDate": "2015-08-30" + }, + "3.1.7": { + "releaseDate": "2015-08-31" + }, + "3.2.0": { + "releaseDate": "2015-09-08" + }, + "3.3.0": { + "releaseDate": "2015-09-08" + }, + "3.3.1": { + "releaseDate": "2015-10-09" + }, + "3.3.2": { + "releaseDate": "2015-10-12" + }, + "3.3.3": { + "releaseDate": "2015-10-13" + }, + "3.4.0": { + "releaseDate": "2015-10-16" + }, + "3.4.1": { + "releaseDate": "2015-11-11" + }, + "3.4.2": { + "releaseDate": "2015-11-11" + }, + "3.4.3": { + "releaseDate": "2016-02-05" + }, + "3.4.4": { + "releaseDate": "2016-02-11" + }, + "3.5.0": { + "releaseDate": "2016-03-25" + }, + "3.6.0": { + "releaseDate": "2016-04-12" + }, + "3.6.1": { + "releaseDate": "2016-04-14" + }, + "3.6.10": { + "releaseDate": "2016-11-17" + }, + "3.7.0": { + "releaseDate": "2016-12-12" + }, + "3.7.1": { + "releaseDate": "2017-01-03" + }, + "3.7.2": { + "releaseDate": "2017-01-30" + }, + "3.7.3": { + "releaseDate": "2017-02-07" + }, + "4.0.0": { + "releaseDate": "2017-05-23" + }, + "5.0.0": { + "releaseDate": "2018-06-14" + }, + "5.1.0": { + "releaseDate": "2018-06-25" + }, + "5.2.0": { + "releaseDate": "2018-10-10" + }, + "5.2.1": { + "releaseDate": "2018-12-03" + }, + "5.3.0": { + "releaseDate": "2018-12-17" + }, + "5.3.1": { + "releaseDate": "2018-12-18" + }, + "6.0.0": { + "releaseDate": "2019-02-07" + }, + "6.0.1": { + "releaseDate": "2019-02-11" + }, + "6.0.2": { + "releaseDate": "2019-02-13" + }, + "6.1.0": { + "releaseDate": "2019-02-26" + }, + "6.1.1": { + "releaseDate": "2019-02-27" + }, + "6.1.2": { + "releaseDate": "2019-03-14" + }, + "6.1.3": { + "releaseDate": "2019-04-03" + }, + "6.2.0": { + "releaseDate": "2019-06-25" + }, + "6.3.0": { + "releaseDate": "2019-08-22" + }, + "6.4.0": { + "releaseDate": "2019-08-30" + }, + "6.4.1": { + "releaseDate": "2019-10-03" + }, + "6.5.0": { + "releaseDate": "2019-11-06" + }, + "6.5.1": { + "releaseDate": "2019-11-26" + }, + "6.6.0": { + "releaseDate": "2020-04-01" + }, + "6.7.0": { + "releaseDate": "2020-07-20" + }, + "6.8.0": { + "releaseDate": "2020-08-17" + }, + "6.9.0": { + "releaseDate": "2020-12-07" + }, + "6.9.1": { + "releaseDate": "2021-01-28" + }, + "6.10.0": { + "releaseDate": "2021-05-07" + }, + "6.10.1": { + "releaseDate": "2021-06-02" + }, + "6.10.2": { + "releaseDate": "2021-09-23" + }, + "6.11.0": { + "releaseDate": "2021-10-19" + }, + "6.12.0": { + "releaseDate": "2021-11-05" + }, + "6.12.1": { + "releaseDate": "2022-02-14" + }, + "6.13.0": { + "releaseDate": "2022-08-31" + }, + "6.14.0": { + "releaseDate": "2022-11-08" + }, + "6.15.0": { + "releaseDate": "2023-08-08" + }, + "6.16.0": { + "releaseDate": "2023-11-20" + }, + "6.17.0": { + "releaseDate": "2024-02-26" + }, + "7.0.0": { + "releaseDate": "2024-08-14" + }, + "7.0.1": { + "releaseDate": "2024-08-14" + }, + "7.0.2": { + "releaseDate": "2024-08-19" + }, + "7.1.0": { + "releaseDate": "2024-08-20" + }, + "7.1.1": { + "releaseDate": "2024-08-21" + }, + "7.2.0": { + "releaseDate": "2024-08-27" + }, + "7.2.1": { + "releaseDate": "2024-08-28" + }, + "7.2.2": { + "releaseDate": "2024-08-29" + }, + "7.2.3": { + "releaseDate": "2024-09-02" + }, + "7.2.4": { + "releaseDate": "2024-09-03" + }, + "7.3.0": { + "releaseDate": "2024-09-06" + }, + "7.3.1": { + "releaseDate": "2024-09-12" + }, + "7.3.2": { + "releaseDate": "2024-09-17" + }, + "7.4.0": { + "releaseDate": "2024-09-18" + }, + "7.4.1": { + "releaseDate": "2024-09-19" + }, + "7.4.2": { + "releaseDate": "2024-09-24" + }, + "7.4.3": { + "releaseDate": "2024-09-25" + } + }, + "ruby": { + "1.1.6": { + "releaseDate": "2013-11-08" + }, + "1.1.5": { + "releaseDate": "2013-11-08" + }, + "1.1.4": { + "releaseDate": "2013-11-08" + }, + "1.1.3": { + "releaseDate": "2013-11-08" + }, + "1.1.7": { + "releaseDate": "2013-11-08" + }, + "1.1.8": { + "releaseDate": "2013-11-26" + }, + "1.1.10": { + "releaseDate": "2013-11-29" + }, + "1.1.11": { + "releaseDate": "2013-11-29" + }, + "1.1.14": { + "releaseDate": "2013-12-11" + }, + "1.1.15": { + "releaseDate": "2013-12-16" + }, + "1.1.16": { + "releaseDate": "2013-12-20" + }, + "1.1.17": { + "releaseDate": "2014-01-02" + }, + "1.2.0": { + "releaseDate": "2014-01-07" + }, + "1.2.1": { + "releaseDate": "2014-01-07" + }, + "1.2.2": { + "releaseDate": "2014-01-11" + }, + "1.2.3": { + "releaseDate": "2014-02-10" + }, + "1.2.6": { + "releaseDate": "2014-03-19" + }, + "1.2.7": { + "releaseDate": "2014-03-25" + }, + "1.2.8": { + "releaseDate": "2014-03-28" + }, + "1.2.9": { + "releaseDate": "2014-07-10" + }, + "1.2.10": { + "releaseDate": "2014-08-22" + }, + "1.2.11": { + "releaseDate": "2014-09-14" + }, + "1.2.12": { + "releaseDate": "2014-10-08" + }, + "1.2.13": { + "releaseDate": "2014-10-22" + }, + "1.2.14": { + "releaseDate": "2014-11-10" + }, + "1.3.0": { + "releaseDate": "2014-11-29" + }, + "1.3.1": { + "releaseDate": "2014-11-29" + }, + "1.4.0": { + "releaseDate": "2015-03-17" + }, + "1.4.1": { + "releaseDate": "2015-04-10" + }, + "1.4.2": { + "releaseDate": "2015-05-04" + }, + "1.4.3": { + "releaseDate": "2015-05-27" + }, + "1.5.0": { + "releaseDate": "2015-06-05" + }, + "1.5.1": { + "releaseDate": "2015-07-14" + }, + "1.6.0": { + "releaseDate": "2015-07-20" + }, + "1.6.1": { + "releaseDate": "2015-08-01" + }, + "1.7.0": { + "releaseDate": "2016-01-09" + }, + "1.8.1": { + "releaseDate": "2016-04-14" + }, + "1.9.0": { + "releaseDate": "2016-06-17" + }, + "1.10.0": { + "releaseDate": "2016-07-11" + }, + "1.11.0": { + "releaseDate": "2016-08-21" + }, + "1.12.0": { + "releaseDate": "2016-10-31" + }, + "1.12.1": { + "releaseDate": "2016-11-25" + }, + "1.12.2": { + "releaseDate": "2016-12-05" + }, + "1.12.3": { + "releaseDate": "2016-12-06" + }, + "1.12.4": { + "releaseDate": "2016-12-07" + }, + "1.12.5": { + "releaseDate": "2017-01-11" + }, + "1.12.6": { + "releaseDate": "2017-01-25" + }, + "1.12.7": { + "releaseDate": "2017-03-01" + }, + "1.13.0": { + "releaseDate": "2017-03-17" + }, + "1.14.0": { + "releaseDate": "2017-07-31" + }, + "1.15.0": { + "releaseDate": "2017-08-17" + }, + "1.15.1": { + "releaseDate": "2017-08-17" + }, + "1.16.0": { + "releaseDate": "2017-09-14" + }, + "1.17.0": { + "releaseDate": "2017-10-10" + }, + "1.18.0": { + "releaseDate": "2017-11-02" + }, + "1.18.1": { + "releaseDate": "2017-11-15" + }, + "1.18.2": { + "releaseDate": "2017-11-28" + }, + "1.18.3": { + "releaseDate": "2017-12-04" + }, + "1.18.4": { + "releaseDate": "2017-12-06" + }, + "1.18.5": { + "releaseDate": "2017-12-07" + }, + "1.19.0": { + "releaseDate": "2017-12-15" + }, + "1.19.1": { + "releaseDate": "2017-12-18" + }, + "1.19.2": { + "releaseDate": "2018-04-03" + }, + "1.20.0": { + "releaseDate": "2018-05-07" + }, + "1.20.1": { + "releaseDate": "2018-05-15" + }, + "1.21.0": { + "releaseDate": "2018-05-24" + }, + "1.22.0": { + "releaseDate": "2018-05-30" + }, + "1.23.0": { + "releaseDate": "2018-06-19" + }, + "1.24.0": { + "releaseDate": "2018-11-28" + }, + "1.25.0": { + "releaseDate": "2018-12-19" + }, + "1.25.1": { + "releaseDate": "2018-12-19" + }, + "1.25.2": { + "releaseDate": "2018-12-19" + }, + "1.26.0": { + "releaseDate": "2019-02-12" + }, + "1.26.1": { + "releaseDate": "2019-07-31" + }, + "1.27.0": { + "releaseDate": "2019-09-16" + }, + "1.27.1": { + "releaseDate": "2019-09-26" + }, + "1.27.2": { + "releaseDate": "2020-04-28" + }, + "1.27.3": { + "releaseDate": "2020-06-03" + }, + "1.27.4": { + "releaseDate": "2020-09-16" + }, + "2.0.0": { + "releaseDate": "2020-10-27" + }, + "1.27.5": { + "releaseDate": "2020-10-28" + }, + "2.0.1": { + "releaseDate": "2020-11-02" + }, + "2.0.2": { + "releaseDate": "2020-11-09" + }, + "2.0.3": { + "releaseDate": "2020-11-24" + }, + "2.0.4": { + "releaseDate": "2021-01-05" + }, + "2.1.0": { + "releaseDate": "2021-03-31" + }, + "2.1.1": { + "releaseDate": "2021-05-27" + }, + "2.2.0": { + "releaseDate": "2021-11-08" + }, + "2.2.1": { + "releaseDate": "2021-11-12" + }, + "2.2.2": { + "releaseDate": "2021-12-08" + }, + "2.2.3": { + "releaseDate": "2022-04-21" + }, + "2.2.4": { + "releaseDate": "2022-05-24" + }, + "2.2.5": { + "releaseDate": "2022-05-24" + }, + "2.3.0": { + "releaseDate": "2022-09-26" + }, + "2.3.1": { + "releaseDate": "2022-10-21" + }, + "2.3.2": { + "releaseDate": "2023-06-07" + }, + "2.3.3": { + "releaseDate": "2023-11-14" + }, + "2.3.4": { + "releaseDate": "2023-11-27" + }, + "3.0.0": { + "releaseDate": "2024-08-14" + }, + "3.0.2": { + "releaseDate": "2024-08-19" + }, + "3.1.0": { + "releaseDate": "2024-08-20" + }, + "3.1.1": { + "releaseDate": "2024-08-21" + }, + "3.2.0": { + "releaseDate": "2024-08-27" + }, + "3.2.1": { + "releaseDate": "2024-08-28" + }, + "3.2.2": { + "releaseDate": "2024-08-29" + }, + "3.2.3": { + "releaseDate": "2024-09-02" + }, + "3.2.4": { + "releaseDate": "2024-09-03" + }, + "3.3.0": { + "releaseDate": "2024-09-06" + }, + "3.3.1": { + "releaseDate": "2024-09-12" + }, + "3.3.2": { + "releaseDate": "2024-09-17" + }, + "3.3.3": { + "releaseDate": "2024-09-19" + }, + "3.3.4": { + "releaseDate": "2024-09-25" + } + }, + "scala": { + "1.0.0": { + "releaseDate": "2015-12-22" + }, + "1.1.0": { + "releaseDate": "2016-01-25" + }, + "1.2.0": { + "releaseDate": "2016-02-02" + }, + "1.3.0": { + "releaseDate": "2016-02-18" + }, + "1.4.0": { + "releaseDate": "2016-02-18" + }, + "1.5": { + "releaseDate": "2016-03-09" + }, + "1.6.0": { + "releaseDate": "2016-03-23" + }, + "1.6.1": { + "releaseDate": "2016-05-17" + }, + "1.6.2": { + "releaseDate": "2016-05-18" + }, + "1.7.0": { + "releaseDate": "2016-06-01" + }, + "1.7.1": { + "releaseDate": "2016-06-06" + }, + "1.7.2": { + "releaseDate": "2016-06-06" + }, + "1.8.0": { + "releaseDate": "2016-06-06" + }, + "1.9.0": { + "releaseDate": "2016-06-09" + }, + "1.10.0": { + "releaseDate": "2016-06-21" + }, + "1.11.0": { + "releaseDate": "2016-07-12" + }, + "1.12": { + "releaseDate": "2016-07-13" + }, + "1.12.0": { + "releaseDate": "2016-07-13" + }, + "1.13.0": { + "releaseDate": "2016-07-26" + }, + "1.13.1": { + "releaseDate": "2016-08-03" + }, + "1.14.0": { + "releaseDate": "2016-08-19" + }, + "1.15.0": { + "releaseDate": "2016-10-06" + }, + "1.16.0": { + "releaseDate": "2016-12-09" + }, + "1.17.0": { + "releaseDate": "2016-12-20" + }, + "1.18.0": { + "releaseDate": "2017-02-06" + }, + "1.19.0": { + "releaseDate": "2017-03-13" + }, + "1.19.1": { + "releaseDate": "2017-03-17" + }, + "1.20.0": { + "releaseDate": "2017-04-10" + }, + "1.21.0": { + "releaseDate": "2017-04-25" + }, + "1.22.0": { + "releaseDate": "2017-05-24" + }, + "1.22.1": { + "releaseDate": "2017-07-18" + }, + "1.23.0": { + "releaseDate": "2017-07-25" + }, + "1.23.1": { + "releaseDate": "2017-08-01" + }, + "1.23.2": { + "releaseDate": "2017-08-01" + }, + "1.24.0": { + "releaseDate": "2017-08-22" + }, + "1.24.1": { + "releaseDate": "2017-09-04" + }, + "1.25.0": { + "releaseDate": "2017-09-12" + }, + "1.26.0": { + "releaseDate": "2017-09-14" + }, + "1.26.1": { + "releaseDate": "2017-10-09" + }, + "1.27.0": { + "releaseDate": "2018-01-03" + }, + "1.28.0": { + "releaseDate": "2018-07-10" + }, + "1.29.0": { + "releaseDate": "2018-09-04" + }, + "1.30.0": { + "releaseDate": "2018-11-30" + }, + "1.31.0": { + "releaseDate": "2018-12-17" + }, + "1.32.0": { + "releaseDate": "2019-01-08" + }, + "1.33.0": { + "releaseDate": "2019-07-18" + }, + "1.34.0": { + "releaseDate": "2019-08-07" + }, + "1.35.0": { + "releaseDate": "2020-01-27" + }, + "1.35.1": { + "releaseDate": "2020-04-06" + }, + "1.36.0": { + "releaseDate": "2020-07-20" + }, + "1.37.0": { + "releaseDate": "2020-08-03" + }, + "1.38.0": { + "releaseDate": "2020-08-06" + }, + "1.38.1": { + "releaseDate": "2020-09-11" + }, + "1.38.2": { + "releaseDate": "2020-10-05" + }, + "1.39.0": { + "releaseDate": "2020-11-03" + }, + "1.39.1": { + "releaseDate": "2021-03-01" + }, + "1.40.0": { + "releaseDate": "2021-04-28" + }, + "1.41.0": { + "releaseDate": "2021-07-23" + }, + "1.42.0": { + "releaseDate": "2021-08-03" + }, + "1.43.0": { + "releaseDate": "2021-08-03" + }, + "1.43.1": { + "releaseDate": "2021-09-22" + }, + "1.44.0": { + "releaseDate": "2021-10-29" + }, + "1.44.1": { + "releaseDate": "2022-02-24" + }, + "1.45.0": { + "releaseDate": "2022-05-17" + }, + "1.45.1": { + "releaseDate": "2022-12-15" + }, + "1.45.2": { + "releaseDate": "2024-05-16" + }, + "2.0.0": { + "releaseDate": "2024-08-14" + }, + "2.0.1": { + "releaseDate": "2024-08-14" + }, + "2.0.2": { + "releaseDate": "2024-08-19" + }, + "2.1.0": { + "releaseDate": "2024-08-20" + }, + "2.1.1": { + "releaseDate": "2024-08-21" + }, + "2.2.0": { + "releaseDate": "2024-08-27" + }, + "2.2.1": { + "releaseDate": "2024-08-28" + }, + "2.2.2": { + "releaseDate": "2024-08-29" + }, + "2.2.3": { + "releaseDate": "2024-09-02" + }, + "2.2.4": { + "releaseDate": "2024-09-03" + }, + "2.3.0": { + "releaseDate": "2024-09-06" + }, + "2.3.1": { + "releaseDate": "2024-09-12" + }, + "2.3.2": { + "releaseDate": "2024-09-17" + }, + "2.3.3": { + "releaseDate": "2024-09-19" + }, + "2.3.4": { + "releaseDate": "2024-09-19" + }, + "2.3.5": { + "releaseDate": "2024-09-20" + }, + "2.3.6": { + "releaseDate": "2024-09-24" + }, + "2.3.7": { + "releaseDate": "2024-09-25" + } + }, + "dart": { + "1.0.0": { + "releaseDate": "2023-10-19" + }, + "1.1.0": { + "releaseDate": "2023-11-07" + }, + "1.2.0": { + "releaseDate": "2023-11-09" + }, + "1.2.1": { + "releaseDate": "2023-12-28" + }, + "1.2.2": { + "releaseDate": "2024-01-04" + }, + "1.3.0": { + "releaseDate": "2024-01-09" + }, + "1.4.0": { + "releaseDate": "2024-01-16" + }, + "1.5.0": { + "releaseDate": "2024-01-23" + }, + "1.5.1": { + "releaseDate": "2024-02-29" + }, + "1.6.0": { + "releaseDate": "2024-03-13" + }, + "1.6.1": { + "releaseDate": "2024-03-19" + }, + "1.6.2": { + "releaseDate": "2024-03-25" + }, + "1.6.3": { + "releaseDate": "2024-04-03" + }, + "1.7.0": { + "releaseDate": "2024-04-09" + }, + "1.8.0": { + "releaseDate": "2024-04-16" + }, + "1.9.0": { + "releaseDate": "2024-04-23" + }, + "1.10.0": { + "releaseDate": "2024-05-17" + }, + "1.11.0": { + "releaseDate": "2024-06-11" + }, + "1.12.0": { + "releaseDate": "2024-06-13" + }, + "1.13.0": { + "releaseDate": "2024-06-21" + }, + "1.14.0": { + "releaseDate": "2024-06-24" + }, + "1.15.0": { + "releaseDate": "2024-06-26" + }, + "1.15.1": { + "releaseDate": "2024-06-27" + }, + "1.16.0": { + "releaseDate": "2024-07-01" + }, + "1.17.0": { + "releaseDate": "2024-07-08" + }, + "1.17.1": { + "releaseDate": "2024-07-12" + }, + "1.18.0": { + "releaseDate": "2024-07-19" + }, + "1.19.0": { + "releaseDate": "2024-07-26" + }, + "1.20.0": { + "releaseDate": "2024-08-01" + }, + "1.21.0": { + "releaseDate": "2024-08-06" + }, + "1.22.0": { + "releaseDate": "2024-08-09" + }, + "1.22.1": { + "releaseDate": "2024-08-14" + }, + "1.22.2": { + "releaseDate": "2024-08-19" + }, + "1.22.3": { + "releaseDate": "2024-08-21" + }, + "1.23.0": { + "releaseDate": "2024-08-27" + }, + "1.23.1": { + "releaseDate": "2024-08-28" + }, + "1.23.2": { + "releaseDate": "2024-08-29" + }, + "1.23.3": { + "releaseDate": "2024-09-02" + }, + "1.23.4": { + "releaseDate": "2024-09-03" + }, + "1.24.0": { + "releaseDate": "2024-09-06" + }, + "1.24.1": { + "releaseDate": "2024-09-17" + }, + "1.24.2": { + "releaseDate": "2024-09-19" + } + }, + "kotlin": { + "1.0.0": { + "releaseDate": "2019-06-03" + }, + "1.1.0": { + "releaseDate": "2019-07-29" + }, + "1.1.1": { + "releaseDate": "2019-08-01" + }, + "1.1.2": { + "releaseDate": "2019-08-09" + }, + "1.1.3": { + "releaseDate": "2019-08-27" + }, + "1.1.4": { + "releaseDate": "2019-09-05" + }, + "1.2.0": { + "releaseDate": "2019-11-26" + }, + "1.2.1": { + "releaseDate": "2019-12-12" + }, + "1.2.2": { + "releaseDate": "2020-02-20" + }, + "1.3.1": { + "releaseDate": "2020-02-24" + }, + "1.4.0": { + "releaseDate": "2020-06-04" + }, + "1.5.0": { + "releaseDate": "2020-09-21" + }, + "1.5.1": { + "releaseDate": "2020-11-02" + }, + "1.5.2": { + "releaseDate": "2020-11-10" + }, + "1.6.0": { + "releaseDate": "2020-11-24" + }, + "1.6.1": { + "releaseDate": "2020-12-15" + }, + "1.6.2": { + "releaseDate": "2021-01-20" + }, + "1.7.0": { + "releaseDate": "2021-02-22" + }, + "1.8.0": { + "releaseDate": "2021-06-21" + }, + "1.9.0": { + "releaseDate": "2021-07-13" + }, + "1.9.1": { + "releaseDate": "2021-07-23" + }, + "1.9.2": { + "releaseDate": "2021-08-10" + }, + "1.10.0": { + "releaseDate": "2021-09-21" + }, + "1.11.0": { + "releaseDate": "2021-10-07" + }, + "1.12.0": { + "releaseDate": "2021-10-28" + }, + "1.12.1": { + "releaseDate": "2022-01-27" + }, + "1.12.2": { + "releaseDate": "2022-03-08" + }, + "1.13.0": { + "releaseDate": "2022-04-14" + }, + "2.0.0": { + "releaseDate": "2022-05-17" + }, + "2.1.0": { + "releaseDate": "2022-06-16" + }, + "2.1.1": { + "releaseDate": "2022-09-26" + }, + "2.1.2": { + "releaseDate": "2023-01-30" + }, + "2.1.3": { + "releaseDate": "2023-02-03" + }, + "2.1.4": { + "releaseDate": "2023-06-08" + }, + "2.1.5": { + "releaseDate": "2023-06-22" + }, + "2.1.6": { + "releaseDate": "2023-08-21" + }, + "2.1.7": { + "releaseDate": "2023-09-04" + }, + "2.1.8": { + "releaseDate": "2023-10-10" + }, + "2.1.9": { + "releaseDate": "2023-12-07" + }, + "2.1.10": { + "releaseDate": "2024-03-27" + }, + "2.1.11": { + "releaseDate": "2024-05-16" + }, + "2.1.12": { + "releaseDate": "2024-05-28" + }, + "2.1.13": { + "releaseDate": "2024-06-17" + }, + "2.1.14": { + "releaseDate": "2024-08-06" + }, + "3.0.0": { + "releaseDate": "2024-08-14" + }, + "3.0.1": { + "releaseDate": "2024-08-14" + }, + "3.0.2": { + "releaseDate": "2024-08-19" + }, + "3.1.0": { + "releaseDate": "2024-08-20" + }, + "3.1.1": { + "releaseDate": "2024-08-21" + }, + "3.2.0": { + "releaseDate": "2024-08-27" + }, + "3.2.1": { + "releaseDate": "2024-08-28" + }, + "3.2.2": { + "releaseDate": "2024-08-29" + }, + "3.2.3": { + "releaseDate": "2024-09-02" + }, + "3.2.4": { + "releaseDate": "2024-09-03" + }, + "3.3.0": { + "releaseDate": "2024-09-06" + }, + "3.3.1": { + "releaseDate": "2024-09-12" + }, + "3.3.2": { + "releaseDate": "2024-09-17" + }, + "3.3.3": { + "releaseDate": "2024-09-19" + }, + "3.4.0": { + "releaseDate": "2024-09-24" + }, + "3.4.1": { + "releaseDate": "2024-09-25" + } + }, + "swift": { + "1.0": { + "releaseDate": "2015-03-09" + }, + "1.1.0": { + "releaseDate": "2015-03-30" + }, + "1.1.1": { + "releaseDate": "2015-04-09" + }, + "1.1.2": { + "releaseDate": "2015-05-27" + }, + "1.2.0": { + "releaseDate": "2015-06-08" + }, + "1.2.1": { + "releaseDate": "2015-06-09" + }, + "1.2.2": { + "releaseDate": "2015-06-16" + }, + "1.2.3": { + "releaseDate": "2015-06-20" + }, + "1.3.0": { + "releaseDate": "2015-06-30" + }, + "1.4.0": { + "releaseDate": "2015-07-06" + }, + "1.4.1": { + "releaseDate": "2015-07-10" + }, + "1.4.2": { + "releaseDate": "2015-08-18" + }, + "2.0.0": { + "releaseDate": "2015-09-22" + }, + "2.1.0": { + "releaseDate": "2015-10-20" + }, + "2.2.0": { + "releaseDate": "2015-12-11" + }, + "2.2.1": { + "releaseDate": "2016-02-05" + }, + "2.3": { + "releaseDate": "2016-04-01" + }, + "3.0a1": { + "releaseDate": "2016-04-13" + }, + "3.0": { + "releaseDate": "2016-04-13" + }, + "3.1": { + "releaseDate": "2016-05-09" + }, + "3.2": { + "releaseDate": "2016-05-26" + }, + "3.2.1": { + "releaseDate": "2016-05-27" + }, + "3.3": { + "releaseDate": "2016-06-29" + }, + "3.4": { + "releaseDate": "2016-07-25" + }, + "3.5": { + "releaseDate": "2016-07-29" + }, + "3.6": { + "releaseDate": "2016-08-09" + }, + "3.7": { + "releaseDate": "2016-09-07" + }, + "4.0a1": { + "releaseDate": "2016-09-12" + }, + "4.0": { + "releaseDate": "2016-09-14" + }, + "4.0.1": { + "releaseDate": "2016-09-15" + }, + "4.1": { + "releaseDate": "2016-10-03" + }, + "4.2": { + "releaseDate": "2016-11-02" + }, + "4.3": { + "releaseDate": "2016-11-09" + }, + "4.4": { + "releaseDate": "2016-11-18" + }, + "4.5": { + "releaseDate": "2016-12-07" + }, + "4.6": { + "releaseDate": "2016-12-28" + }, + "4.6.1": { + "releaseDate": "2017-01-10" + }, + "4.7": { + "releaseDate": "2017-02-08" + }, + "4.8": { + "releaseDate": "2017-04-03" + }, + "4.8.1": { + "releaseDate": "2017-04-18" + }, + "5.0.0": { + "releaseDate": "2017-09-26" + }, + "5.0.1": { + "releaseDate": "2017-09-26" + }, + "5.0.2": { + "releaseDate": "2017-09-27" + }, + "5.0.3": { + "releaseDate": "2017-10-03" + }, + "5.0.4": { + "releaseDate": "2017-10-10" + }, + "4.8.2": { + "releaseDate": "2017-10-11" + }, + "5.0.5": { + "releaseDate": "2017-10-13" + }, + "5.0.6": { + "releaseDate": "2017-10-17" + }, + "5.1.0": { + "releaseDate": "2017-10-20" + }, + "5.1.1": { + "releaseDate": "2018-01-10" + }, + "5.1.2": { + "releaseDate": "2018-02-02" + }, + "5.1.3": { + "releaseDate": "2018-03-02" + }, + "5.1.4": { + "releaseDate": "2018-03-02" + }, + "5.1.5": { + "releaseDate": "2018-03-02" + }, + "5.1.6": { + "releaseDate": "2018-03-05" + }, + "5.1.7": { + "releaseDate": "2018-05-04" + }, + "5.1.8": { + "releaseDate": "2018-05-17" + }, + "5.1.9": { + "releaseDate": "2018-05-24" + }, + "5.1.10": { + "releaseDate": "2018-05-28" + }, + "5.2.0": { + "releaseDate": "2018-06-15" + }, + "5.3.0": { + "releaseDate": "2018-06-21" + }, + "5.4": { + "releaseDate": "2018-09-21" + }, + "5.4.0": { + "releaseDate": "2018-09-21" + }, + "6.0.0": { + "releaseDate": "2018-09-24" + }, + "6.1.0": { + "releaseDate": "2018-10-15" + }, + "6.1.1": { + "releaseDate": "2018-11-30" + }, + "6.2.0": { + "releaseDate": "2019-02-11" + }, + "6.3.0": { + "releaseDate": "2019-03-18" + }, + "7.0.0": { + "releaseDate": "2019-04-18" + }, + "7.0.1": { + "releaseDate": "2019-11-15" + }, + "7.0.2": { + "releaseDate": "2019-12-13" + }, + "7.0.3": { + "releaseDate": "2019-12-16" + }, + "2dev": { + "releaseDate": "2020-03-23" + }, + "7.0.4": { + "releaseDate": "2020-03-24" + }, + "7.0.5": { + "releaseDate": "2020-05-26" + }, + "8.0.0": { + "releaseDate": "2020-07-20" + }, + "8.0.1": { + "releaseDate": "2020-07-28" + }, + "8.1.0": { + "releaseDate": "2020-08-04" + }, + "8.1.1": { + "releaseDate": "2020-09-17" + }, + "8.1.2": { + "releaseDate": "2020-10-06" + }, + "8.1.3": { + "releaseDate": "2020-10-27" + }, + "8.2.0": { + "releaseDate": "2020-11-03" + }, + "8.3.0": { + "releaseDate": "2020-11-23" + }, + "8.4.0": { + "releaseDate": "2020-12-17" + }, + "8.4.1": { + "releaseDate": "2020-12-18" + }, + "8.4.2": { + "releaseDate": "2020-12-21" + }, + "8.5.0": { + "releaseDate": "2021-01-18" + }, + "8.6.0": { + "releaseDate": "2021-02-03" + }, + "8.7.0": { + "releaseDate": "2021-02-15" + }, + "8.8.0": { + "releaseDate": "2021-03-02" + }, + "8.8.1": { + "releaseDate": "2021-03-03" + }, + "8.9.0": { + "releaseDate": "2021-07-07" + }, + "8.10.0": { + "releaseDate": "2021-07-13" + }, + "8.11.0": { + "releaseDate": "2021-10-06" + }, + "8.12.0": { + "releaseDate": "2021-11-05" + }, + "8.13.0": { + "releaseDate": "2021-12-13" + }, + "8.13.1": { + "releaseDate": "2021-12-22" + }, + "8.13.2": { + "releaseDate": "2022-01-12" + }, + "8.13.3": { + "releaseDate": "2022-01-21" + }, + "8.13.4": { + "releaseDate": "2022-02-21" + }, + "8.14.0": { + "releaseDate": "2022-03-18" + }, + "8.15.0": { + "releaseDate": "2022-08-04" + }, + "8.15.1": { + "releaseDate": "2022-08-29" + }, + "8.16.0": { + "releaseDate": "2022-10-24" + }, + "8.17.0": { + "releaseDate": "2023-02-06" + }, + "8.18.0": { + "releaseDate": "2023-03-24" + }, + "8.18.1": { + "releaseDate": "2023-06-22" + }, + "8.18.2": { + "releaseDate": "2023-08-15" + }, + "8.19.0": { + "releaseDate": "2023-12-07" + }, + "8.20.0": { + "releaseDate": "2024-02-02" + }, + "8.20.1": { + "releaseDate": "2024-03-04" + }, + "9.0.0": { + "releaseDate": "2024-08-14" + }, + "9.0.1": { + "releaseDate": "2024-08-14" + }, + "9.0.2": { + "releaseDate": "2024-08-19" + }, + "9.1.0": { + "releaseDate": "2024-08-20" + }, + "9.1.1": { + "releaseDate": "2024-08-21" + }, + "9.2.0": { + "releaseDate": "2024-08-27" + }, + "9.2.1": { + "releaseDate": "2024-08-28" + }, + "9.2.2": { + "releaseDate": "2024-08-29" + }, + "9.2.3": { + "releaseDate": "2024-09-02" + }, + "9.2.4": { + "releaseDate": "2024-09-03" + }, + "9.3.0": { + "releaseDate": "2024-09-06" + }, + "9.3.1": { + "releaseDate": "2024-09-12" + }, + "9.3.2": { + "releaseDate": "2024-09-17" + }, + "8.21.0": { + "releaseDate": "2024-09-18" + }, + "9.3.3": { + "releaseDate": "2024-09-19" + }, + "9.4.0": { + "releaseDate": "2024-09-19" + }, + "9.5.0": { + "releaseDate": "2024-09-24" + }, + "9.5.1": { + "releaseDate": "2024-09-25" + } + }, + "php": { + "1.0.0": { + "releaseDate": "2013-12-16" + }, + "1.1.0": { + "releaseDate": "2013-12-23" + }, + "1.1.1": { + "releaseDate": "2014-01-20" + }, + "1.1.2": { + "releaseDate": "2014-01-29" + }, + "1.1.3": { + "releaseDate": "2014-01-29" + }, + "1.1.5": { + "releaseDate": "2014-01-31" + }, + "1.1.6": { + "releaseDate": "2014-02-13" + }, + "1.1.7": { + "releaseDate": "2014-03-06" + }, + "1.1.8": { + "releaseDate": "2014-04-02" + }, + "1.1.9": { + "releaseDate": "2014-04-30" + }, + "1.2.0": { + "releaseDate": "2014-06-14" + }, + "1.2.1": { + "releaseDate": "2014-07-08" + }, + "1.2.2": { + "releaseDate": "2014-07-17" + }, + "1.3.0": { + "releaseDate": "2014-07-24" + }, + "1.3.1": { + "releaseDate": "2014-07-24" + }, + "1.3.2": { + "releaseDate": "2014-07-28" + }, + "1.3.3": { + "releaseDate": "2014-07-28" + }, + "1.3.4": { + "releaseDate": "2014-08-18" + }, + "1.3.5": { + "releaseDate": "2014-09-14" + }, + "1.4.0": { + "releaseDate": "2014-10-17" + }, + "1.4.1": { + "releaseDate": "2014-10-22" + }, + "1.5.0": { + "releaseDate": "2014-11-29" + }, + "1.5.1": { + "releaseDate": "2014-12-11" + }, + "1.5.2": { + "releaseDate": "2015-01-07" + }, + "1.5.3": { + "releaseDate": "2015-01-20" + }, + "1.5.4": { + "releaseDate": "2015-03-12" + }, + "1.5.5": { + "releaseDate": "2015-04-09" + }, + "1.5.6": { + "releaseDate": "2015-04-30" + }, + "1.5.8": { + "releaseDate": "2015-05-27" + }, + "1.6.0": { + "releaseDate": "2015-07-03" + }, + "1.6.1": { + "releaseDate": "2015-09-07" + }, + "1.7.0": { + "releaseDate": "2015-10-16" + }, + "1.6.2": { + "releaseDate": "2015-11-19" + }, + "1.6.3": { + "releaseDate": "2015-12-07" + }, + "1.7.1": { + "releaseDate": "2016-02-23" + }, + "1.8.0": { + "releaseDate": "2016-02-24" + }, + "1.8.1": { + "releaseDate": "2016-03-08" + }, + "1.8.2": { + "releaseDate": "2016-05-05" + }, + "1.9.0": { + "releaseDate": "2016-05-10" + }, + "1.9.1": { + "releaseDate": "2016-05-17" + }, + "1.9.2": { + "releaseDate": "2016-05-18" + }, + "1.9.3": { + "releaseDate": "2016-06-03" + }, + "1.9.4": { + "releaseDate": "2016-06-14" + }, + "1.10.0": { + "releaseDate": "2016-06-23" + }, + "1.10.1": { + "releaseDate": "2016-06-29" + }, + "1.10.2": { + "releaseDate": "2016-08-05" + }, + "1.10.3": { + "releaseDate": "2016-10-03" + }, + "1.11.0": { + "releaseDate": "2016-10-20" + }, + "1.12.0": { + "releaseDate": "2016-12-08" + }, + "1.12.1": { + "releaseDate": "2016-12-09" + }, + "1.13.0": { + "releaseDate": "2016-12-21" + }, + "1.14.0": { + "releaseDate": "2017-02-07" + }, + "1.15.0": { + "releaseDate": "2017-02-25" + }, + "1.16.0": { + "releaseDate": "2017-02-28" + }, + "1.17.0": { + "releaseDate": "2017-04-03" + }, + "1.18.0": { + "releaseDate": "2017-05-22" + }, + "1.19.0": { + "releaseDate": "2017-08-28" + }, + "1.20.0": { + "releaseDate": "2017-08-30" + }, + "1.21.0": { + "releaseDate": "2017-10-06" + }, + "1.22.0": { + "releaseDate": "2017-10-17" + }, + "1.23.0": { + "releaseDate": "2017-10-26" + }, + "1.23.1": { + "releaseDate": "2017-11-07" + }, + "1.24.0": { + "releaseDate": "2017-12-12" + }, + "1.25.0": { + "releaseDate": "2017-12-28" + }, + "1.25.1": { + "releaseDate": "2018-03-02" + }, + "1.26.0": { + "releaseDate": "2018-06-07" + }, + "1.26.1": { + "releaseDate": "2018-06-15" + }, + "1.27.0": { + "releaseDate": "2018-06-19" + }, + "1.28.0": { + "releaseDate": "2018-11-06" + }, + "2.0.0": { + "releaseDate": "2018-11-22" + }, + "2.0.1": { + "releaseDate": "2018-12-12" + }, + "2.1.0": { + "releaseDate": "2018-12-19" + }, + "2.1.1": { + "releaseDate": "2018-12-19" + }, + "2.1.2": { + "releaseDate": "2018-12-26" + }, + "2.1.3": { + "releaseDate": "2019-01-11" + }, + "2.2.0": { + "releaseDate": "2019-01-23" + }, + "2.2.1": { + "releaseDate": "2019-02-21" + }, + "2.2.2": { + "releaseDate": "2019-02-26" + }, + "2.2.3": { + "releaseDate": "2019-02-26" + }, + "2.2.4": { + "releaseDate": "2019-05-07" + }, + "2.2.5": { + "releaseDate": "2019-05-14" + }, + "2.2.6": { + "releaseDate": "2019-05-15" + }, + "2.3.0": { + "releaseDate": "2019-07-18" + }, + "2.4.0": { + "releaseDate": "2019-09-11" + }, + "2.5.0": { + "releaseDate": "2019-11-05" + }, + "2.5.1": { + "releaseDate": "2020-01-27" + }, + "2.6.0": { + "releaseDate": "2020-03-09" + }, + "2.6.1": { + "releaseDate": "2020-04-16" + }, + "1.28.1": { + "releaseDate": "2020-06-03" + }, + "2.6.2": { + "releaseDate": "2020-06-23" + }, + "2.7.0": { + "releaseDate": "2020-06-25" + }, + "2.7.1": { + "releaseDate": "2020-11-12" + }, + "2.7.2": { + "releaseDate": "2020-11-24" + }, + "2.7.3": { + "releaseDate": "2020-12-22" + }, + "2.8.0": { + "releaseDate": "2021-04-07" + }, + "3.0.0": { + "releaseDate": "2021-04-14" + }, + "3.0.1": { + "releaseDate": "2021-04-23" + }, + "3.0.2": { + "releaseDate": "2021-05-04" + }, + "3.1.0": { + "releaseDate": "2021-08-31" + }, + "3.2.0": { + "releaseDate": "2022-01-04" + }, + "3.3.0": { + "releaseDate": "2022-07-06" + }, + "3.3.1": { + "releaseDate": "2022-08-02" + }, + "3.3.2": { + "releaseDate": "2022-09-22" + }, + "3.4.0": { + "releaseDate": "2023-08-10" + }, + "3.4.1": { + "releaseDate": "2023-08-28" + }, + "4.0.0": { + "releaseDate": "2024-08-14" + }, + "4.0.1": { + "releaseDate": "2024-08-14" + }, + "4.0.2": { + "releaseDate": "2024-08-19" + }, + "4.1.0": { + "releaseDate": "2024-08-20" + }, + "4.2.0": { + "releaseDate": "2024-08-21" + }, + "4.3.0": { + "releaseDate": "2024-08-27" + }, + "4.3.1": { + "releaseDate": "2024-08-28" + }, + "4.3.2": { + "releaseDate": "2024-08-29" + }, + "4.3.3": { + "releaseDate": "2024-08-29" + }, + "4.3.4": { + "releaseDate": "2024-09-02" + }, + "4.3.5": { + "releaseDate": "2024-09-03" + }, + "4.4.0": { + "releaseDate": "2024-09-06" + }, + "4.4.1": { + "releaseDate": "2024-09-12" + }, + "4.4.2": { + "releaseDate": "2024-09-17" + }, + "4.4.3": { + "releaseDate": "2024-09-19" + }, + "4.4.4": { + "releaseDate": "2024-09-25" + } + }, + "go": { + "1.0.0": { + "releaseDate": "2014-10-16" + }, + "1.0.1": { + "releaseDate": "2014-10-22" + }, + "1.0.2": { + "releaseDate": "2014-11-27" + }, + "1.1.0": { + "releaseDate": "2014-11-30" + }, + "1.1.1": { + "releaseDate": "2015-01-23" + }, + "1.2.0": { + "releaseDate": "2015-04-09" + }, + "1.2.1": { + "releaseDate": "2015-05-04" + }, + "1.3.0": { + "releaseDate": "2015-07-07" + }, + "1.4.0": { + "releaseDate": "2015-10-16" + }, + "1.5.0": { + "releaseDate": "2016-06-01" + }, + "2.0.0": { + "releaseDate": "2016-06-06" + }, + "2.1.0": { + "releaseDate": "2016-10-03" + }, + "2.1.1": { + "releaseDate": "2016-10-03" + }, + "2.1.2": { + "releaseDate": "2016-10-19" + }, + "2.2.0": { + "releaseDate": "2016-10-19" + }, + "2.3.0": { + "releaseDate": "2016-11-02" + }, + "2.3.1": { + "releaseDate": "2016-11-02" + }, + "2.4.0": { + "releaseDate": "2016-11-02" + }, + "2.5.0": { + "releaseDate": "2016-11-29" + }, + "2.6.0": { + "releaseDate": "2016-12-08" + }, + "2.7.0": { + "releaseDate": "2016-12-28" + }, + "2.7.1": { + "releaseDate": "2017-01-25" + }, + "2.8.0": { + "releaseDate": "2017-02-14" + }, + "2.9.0": { + "releaseDate": "2017-02-24" + }, + "2.9.1": { + "releaseDate": "2017-03-22" + }, + "2.10.0": { + "releaseDate": "2017-03-24" + }, + "2.11.0": { + "releaseDate": "2017-03-24" + }, + "2.12.0": { + "releaseDate": "2017-04-12" + }, + "2.13.0": { + "releaseDate": "2017-04-26" + }, + "2.14.0": { + "releaseDate": "2017-06-06" + }, + "2.15.0": { + "releaseDate": "2017-06-30" + }, + "2.16.0": { + "releaseDate": "2017-08-02" + }, + "2.17.0": { + "releaseDate": "2017-08-07" + }, + "2.18.0": { + "releaseDate": "2017-08-23" + }, + "2.19.0": { + "releaseDate": "2017-08-28" + }, + "2.19.1": { + "releaseDate": "2017-09-06" + }, + "2.20.0": { + "releaseDate": "2017-10-11" + }, + "2.21.0": { + "releaseDate": "2017-11-14" + }, + "2.21.1": { + "releaseDate": "2017-11-29" + }, + "2.21.2": { + "releaseDate": "2018-02-05" + }, + "2.21.3": { + "releaseDate": "2018-02-13" + }, + "2.22.0": { + "releaseDate": "2018-03-26" + }, + "2.23.0": { + "releaseDate": "2018-06-19" + }, + "2.23.1": { + "releaseDate": "2018-06-29" + }, + "2.24.0": { + "releaseDate": "2018-08-24" + }, + "2.25.0": { + "releaseDate": "2018-09-06" + }, + "2.26.0": { + "releaseDate": "2018-12-07" + }, + "2.26.1": { + "releaseDate": "2018-12-07" + }, + "2.27.0": { + "releaseDate": "2018-12-17" + }, + "2.28.0": { + "releaseDate": "2019-04-10" + }, + "3.0.0": { + "releaseDate": "2019-06-11" + }, + "3.1.0": { + "releaseDate": "2019-07-08" + }, + "3.2.0": { + "releaseDate": "2019-08-20" + }, + "3.2.1": { + "releaseDate": "2019-08-21" + }, + "3.3.0": { + "releaseDate": "2019-09-06" + }, + "3.4.0": { + "releaseDate": "2019-09-25" + }, + "3.5.0": { + "releaseDate": "2019-12-13" + }, + "3.5.1": { + "releaseDate": "2020-01-24" + }, + "3.5.2": { + "releaseDate": "2020-01-24" + }, + "3.6.0": { + "releaseDate": "2020-03-09" + }, + "3.6.1": { + "releaseDate": "2020-04-06" + }, + "3.7.0": { + "releaseDate": "2020-05-07" + }, + "3.8.0": { + "releaseDate": "2020-05-20" + }, + "3.8.1": { + "releaseDate": "2020-06-26" + }, + "3.8.2": { + "releaseDate": "2020-07-03" + }, + "3.9.0": { + "releaseDate": "2020-07-20" + }, + "3.10.0": { + "releaseDate": "2020-08-12" + }, + "3.11.0": { + "releaseDate": "2020-08-13" + }, + "3.12.0": { + "releaseDate": "2020-09-29" + }, + "3.12.1": { + "releaseDate": "2020-10-02" + }, + "3.13.0": { + "releaseDate": "2020-10-15" + }, + "3.14.0": { + "releaseDate": "2020-11-24" + }, + "3.15.0": { + "releaseDate": "2021-01-06" + }, + "3.15.1": { + "releaseDate": "2021-01-14" + }, + "3.16.0": { + "releaseDate": "2021-01-30" + }, + "3.17.0": { + "releaseDate": "2021-03-08" + }, + "3.18.0": { + "releaseDate": "2021-03-26" + }, + "3.18.1": { + "releaseDate": "2021-04-02" + }, + "3.19.0": { + "releaseDate": "2021-06-23" + }, + "3.20.0": { + "releaseDate": "2021-07-05" + }, + "3.21.0": { + "releaseDate": "2021-07-26" + }, + "3.22.0": { + "releaseDate": "2021-11-08" + }, + "3.23.0": { + "releaseDate": "2022-01-11" + }, + "3.24.0": { + "releaseDate": "2022-03-25" + }, + "3.25.0": { + "releaseDate": "2022-04-13" + }, + "3.26.0": { + "releaseDate": "2022-07-04" + }, + "3.26.1": { + "releaseDate": "2022-08-31" + }, + "3.26.2": { + "releaseDate": "2023-01-18" + }, + "3.26.3": { + "releaseDate": "2023-02-16" + }, + "3.26.4": { + "releaseDate": "2023-02-24" + }, + "3.26.5": { + "releaseDate": "2023-03-29" + }, + "3.27.0": { + "releaseDate": "2023-03-30" + }, + "3.28.0": { + "releaseDate": "2023-04-13" + }, + "3.28.1": { + "releaseDate": "2023-04-19" + }, + "3.29.0": { + "releaseDate": "2023-05-09" + }, + "3.29.1": { + "releaseDate": "2023-05-09" + }, + "3.29.2": { + "releaseDate": "2023-05-11" + }, + "3.29.4": { + "releaseDate": "2023-05-22" + }, + "3.30.0": { + "releaseDate": "2023-06-06" + }, + "3.30.1": { + "releaseDate": "2023-07-05" + }, + "3.31.0": { + "releaseDate": "2023-08-25" + }, + "3.31.1": { + "releaseDate": "2024-03-04" + }, + "3.31.2": { + "releaseDate": "2024-06-25" + }, + "4.0.0": { + "releaseDate": "2024-08-14" + }, + "4.0.1": { + "releaseDate": "2024-08-14" + }, + "4.0.2": { + "releaseDate": "2024-08-19" + }, + "4.1.0": { + "releaseDate": "2024-08-20" + }, + "4.1.1": { + "releaseDate": "2024-08-21" + }, + "4.2.0": { + "releaseDate": "2024-08-27" + }, + "4.2.1": { + "releaseDate": "2024-08-28" + }, + "4.2.2": { + "releaseDate": "2024-08-29" + }, + "4.2.3": { + "releaseDate": "2024-09-02" + }, + "4.2.4": { + "releaseDate": "2024-09-03" + }, + "4.3.0": { + "releaseDate": "2024-09-06" + }, + "4.3.1": { + "releaseDate": "2024-09-12" + }, + "4.3.2": { + "releaseDate": "2024-09-17" + }, + "4.3.3": { + "releaseDate": "2024-09-19" + }, + "3.31.3": { + "releaseDate": "2024-09-23" + }, + "4.3.4": { + "releaseDate": "2024-09-24" + }, + "4.3.5": { + "releaseDate": "2024-09-25" + } + }, + "java": { + "2.0.0": { + "releaseDate": "2016-07-06" + }, + "2.1.0": { + "releaseDate": "2016-07-12" + }, + "2.2.0": { + "releaseDate": "2016-07-27" + }, + "2.2.1": { + "releaseDate": "2016-08-03" + }, + "2.3.0": { + "releaseDate": "2016-08-22" + }, + "2.3.1": { + "releaseDate": "2016-09-01" + }, + "2.4.0": { + "releaseDate": "2016-10-03" + }, + "2.4.1": { + "releaseDate": "2016-10-04" + }, + "2.5.0": { + "releaseDate": "2016-11-08" + }, + "2.6.0": { + "releaseDate": "2016-12-09" + }, + "2.6.1": { + "releaseDate": "2016-12-09" + }, + "2.7.0": { + "releaseDate": "2016-12-20" + }, + "2.8.0": { + "releaseDate": "2017-02-06" + }, + "2.9.0": { + "releaseDate": "2017-04-11" + }, + "2.10.0": { + "releaseDate": "2017-05-30" + }, + "2.11.0": { + "releaseDate": "2017-07-03" + }, + "2.11.1": { + "releaseDate": "2017-07-07" + }, + "2.11.2": { + "releaseDate": "2017-07-21" + }, + "2.11.3": { + "releaseDate": "2017-08-01" + }, + "2.12.0": { + "releaseDate": "2017-08-22" + }, + "2.13.0": { + "releaseDate": "2017-09-13" + }, + "2.13.1": { + "releaseDate": "2017-09-25" + }, + "2.13.2": { + "releaseDate": "2017-09-27" + }, + "2.13.3": { + "releaseDate": "2017-10-09" + }, + "2.14.0": { + "releaseDate": "2017-10-19" + }, + "2.15.0": { + "releaseDate": "2017-11-14" + }, + "2.15.1": { + "releaseDate": "2017-11-17" + }, + "2.15.2": { + "releaseDate": "2017-11-20" + }, + "2.15.3": { + "releaseDate": "2017-12-07" + }, + "2.15.4": { + "releaseDate": "2017-12-11" + }, + "2.15.5": { + "releaseDate": "2017-12-29" + }, + "2.15.6": { + "releaseDate": "2018-01-24" + }, + "2.15.7": { + "releaseDate": "2018-02-20" + }, + "2.16.0": { + "releaseDate": "2018-02-26" + }, + "2.16.1": { + "releaseDate": "2018-02-27" + }, + "2.16.2": { + "releaseDate": "2018-02-28" + }, + "2.16.3": { + "releaseDate": "2018-03-05" + }, + "2.16.4": { + "releaseDate": "2018-03-06" + }, + "2.16.5": { + "releaseDate": "2018-03-07" + }, + "2.16.6": { + "releaseDate": "2018-03-09" + }, + "2.16.7": { + "releaseDate": "2018-04-03" + }, + "2.16.8": { + "releaseDate": "2018-04-03" + }, + "2.17.0": { + "releaseDate": "2018-06-07" + }, + "2.17.1": { + "releaseDate": "2018-06-07" + }, + "2.17.2": { + "releaseDate": "2018-06-12" + }, + "2.17.3": { + "releaseDate": "2018-06-15" + }, + "2.18.0": { + "releaseDate": "2018-07-26" + }, + "2.18.1": { + "releaseDate": "2018-08-07" + }, + "2.19.0": { + "releaseDate": "2018-09-03" + }, + "2.20.0": { + "releaseDate": "2018-10-18" + }, + "2.21.0": { + "releaseDate": "2018-12-17" + }, + "2.21.1": { + "releaseDate": "2018-12-18" + }, + "2.22.0": { + "releaseDate": "2019-01-17" + }, + "3.0.0": { + "releaseDate": "2019-06-10" + }, + "2.23.0": { + "releaseDate": "2019-07-10" + }, + "3.1.0": { + "releaseDate": "2019-08-07" + }, + "3.2.0": { + "releaseDate": "2019-08-14" + }, + "3.2.1": { + "releaseDate": "2019-08-19" + }, + "3.3.0": { + "releaseDate": "2019-10-21" + }, + "3.4.0": { + "releaseDate": "2019-10-24" + }, + "3.5.0": { + "releaseDate": "2019-10-31" + }, + "3.6.0": { + "releaseDate": "2019-11-06" + }, + "3.6.1": { + "releaseDate": "2019-11-12" + }, + "3.6.2": { + "releaseDate": "2019-11-26" + }, + "3.7.0": { + "releaseDate": "2020-02-06" + }, + "3.8.0": { + "releaseDate": "2020-03-25" + }, + "3.8.1": { + "releaseDate": "2020-03-26" + }, + "3.9.0": { + "releaseDate": "2020-04-21" + }, + "3.10.0": { + "releaseDate": "2020-06-12" + }, + "3.11.0": { + "releaseDate": "2020-07-17" + }, + "3.12.0": { + "releaseDate": "2020-07-28" + }, + "3.12.1": { + "releaseDate": "2020-11-03" + }, + "3.13.0": { + "releaseDate": "2021-03-31" + }, + "3.14.0": { + "releaseDate": "2021-04-29" + }, + "3.14.1": { + "releaseDate": "2021-05-03" + }, + "3.14.2": { + "releaseDate": "2021-06-02" + }, + "3.14.3": { + "releaseDate": "2021-06-29" + }, + "3.15.0": { + "releaseDate": "2021-07-23" + }, + "3.15.1": { + "releaseDate": "2021-08-20" + }, + "3.16.0": { + "releaseDate": "2021-10-14" + }, + "3.16.1": { + "releaseDate": "2021-10-29" + }, + "3.16.2": { + "releaseDate": "2022-01-07" + }, + "3.16.3": { + "releaseDate": "2022-01-27" + }, + "3.16.4": { + "releaseDate": "2022-02-07" + }, + "3.16.5": { + "releaseDate": "2022-03-18" + }, + "3.16.6": { + "releaseDate": "2022-08-03" + }, + "3.16.7": { + "releaseDate": "2023-06-02" + }, + "3.16.8": { + "releaseDate": "2023-12-20" + }, + "3.16.9": { + "releaseDate": "2024-02-08" + }, + "4.0.0": { + "releaseDate": "2024-08-14" + }, + "4.0.1": { + "releaseDate": "2024-08-14" + }, + "4.0.2": { + "releaseDate": "2024-08-19" + }, + "4.1.0": { + "releaseDate": "2024-08-20" + }, + "4.1.1": { + "releaseDate": "2024-08-21" + }, + "4.2.0": { + "releaseDate": "2024-08-27" + }, + "4.2.1": { + "releaseDate": "2024-08-28" + }, + "4.2.2": { + "releaseDate": "2024-08-29" + }, + "4.2.3": { + "releaseDate": "2024-08-29" + }, + "4.2.4": { + "releaseDate": "2024-09-02" + }, + "4.2.5": { + "releaseDate": "2024-09-03" + }, + "4.3.0": { + "releaseDate": "2024-09-06" + }, + "4.3.1": { + "releaseDate": "2024-09-12" + }, + "4.3.2": { + "releaseDate": "2024-09-17" + }, + "4.3.3": { + "releaseDate": "2024-09-19" + }, + "4.3.4": { + "releaseDate": "2024-09-19" + }, + "4.3.5": { + "releaseDate": "2024-09-20" + }, + "4.3.6": { + "releaseDate": "2024-09-24" + }, + "4.3.7": { + "releaseDate": "2024-09-25" + } + }, + "javascript": { + "2.0.0": { + "releaseDate": "2013-10-07" + }, + "2.0.1": { + "releaseDate": "2013-10-15" + }, + "2.1.0": { + "releaseDate": "2013-11-03" + }, + "2.2.0": { + "releaseDate": "2013-11-07" + }, + "2.3.0": { + "releaseDate": "2013-11-07" + }, + "2.3.1": { + "releaseDate": "2013-11-08" + }, + "2.3.2": { + "releaseDate": "2013-11-22" + }, + "2.3.3": { + "releaseDate": "2013-11-29" + }, + "2.3.4": { + "releaseDate": "2013-12-04" + }, + "2.3.6": { + "releaseDate": "2013-12-17" + }, + "2.3.7": { + "releaseDate": "2014-01-08" + }, + "2.3.8": { + "releaseDate": "2014-01-16" + }, + "2.4.0": { + "releaseDate": "2014-02-12" + }, + "2.4.1": { + "releaseDate": "2014-02-19" + }, + "2.4.3": { + "releaseDate": "2014-03-12" + }, + "2.4.4": { + "releaseDate": "2014-03-19" + }, + "2.4.6": { + "releaseDate": "2014-04-05" + }, + "2.4.7": { + "releaseDate": "2014-04-23" + }, + "2.5.0": { + "releaseDate": "2014-05-09" + }, + "2.5.1": { + "releaseDate": "2014-05-14" + }, + "2.5.2": { + "releaseDate": "2014-06-05" + }, + "2.5.3": { + "releaseDate": "2014-07-23" + }, + "2.6.0": { + "releaseDate": "2014-09-06" + }, + "2.6.1": { + "releaseDate": "2014-09-20" + }, + "2.6.2": { + "releaseDate": "2014-09-20" + }, + "2.6.3": { + "releaseDate": "2014-09-23" + }, + "2.6.4": { + "releaseDate": "2014-09-23" + }, + "2.6.5": { + "releaseDate": "2014-09-26" + }, + "2.6.6": { + "releaseDate": "2014-10-07" + }, + "2.7.0": { + "releaseDate": "2014-10-15" + }, + "2.7.1": { + "releaseDate": "2014-10-15" + }, + "2.7.2": { + "releaseDate": "2014-10-27" + }, + "2.7.3": { + "releaseDate": "2014-10-29" + }, + "2.7.4": { + "releaseDate": "2014-11-12" + }, + "2.7.5": { + "releaseDate": "2014-11-25" + }, + "2.8.0": { + "releaseDate": "2014-11-29" + }, + "2.8.1": { + "releaseDate": "2014-12-09" + }, + "2.8.2": { + "releaseDate": "2014-12-23" + }, + "2.8.3": { + "releaseDate": "2014-12-30" + }, + "2.8.4": { + "releaseDate": "2014-12-31" + }, + "2.8.5": { + "releaseDate": "2015-01-07" + }, + "2.8.6": { + "releaseDate": "2015-01-13" + }, + "2.9.0": { + "releaseDate": "2015-01-14" + }, + "2.9.1": { + "releaseDate": "2015-02-03" + }, + "2.9.2": { + "releaseDate": "2015-02-16" + }, + "2.9.3": { + "releaseDate": "2015-03-19" + }, + "2.9.4": { + "releaseDate": "2015-03-20" + }, + "3.0.0": { + "releaseDate": "2015-03-25" + }, + "3.0.1": { + "releaseDate": "2015-03-26" + }, + "3.0.2": { + "releaseDate": "2015-03-26" + }, + "3.0.3": { + "releaseDate": "2015-03-28" + }, + "2.9.5": { + "releaseDate": "2015-04-02" + }, + "3.0.4": { + "releaseDate": "2015-04-02" + }, + "3.0.5": { + "releaseDate": "2015-04-02" + }, + "3.0.6": { + "releaseDate": "2015-04-03" + }, + "2.9.6": { + "releaseDate": "2015-04-10" + }, + "3.0.7": { + "releaseDate": "2015-04-10" + }, + "3.1.0": { + "releaseDate": "2015-04-14" + }, + "3.2.0": { + "releaseDate": "2015-04-24" + }, + "3.2.1": { + "releaseDate": "2015-04-29" + }, + "3.2.2": { + "releaseDate": "2015-05-06" + }, + "3.2.3": { + "releaseDate": "2015-05-09" + }, + "3.2.4": { + "releaseDate": "2015-05-11" + }, + "3.3.0": { + "releaseDate": "2015-05-12" + }, + "3.3.1": { + "releaseDate": "2015-05-13" + }, + "3.3.2": { + "releaseDate": "2015-05-14" + }, + "3.4.0": { + "releaseDate": "2015-05-23" + }, + "2.9.7": { + "releaseDate": "2015-06-03" + }, + "3.5.0": { + "releaseDate": "2015-06-03" + }, + "3.6.0": { + "releaseDate": "2015-06-05" + }, + "3.6.1": { + "releaseDate": "2015-06-16" + }, + "3.6.2": { + "releaseDate": "2015-06-17" + }, + "3.6.3": { + "releaseDate": "2015-06-18" + }, + "3.7.0": { + "releaseDate": "2015-06-23" + }, + "3.7.1": { + "releaseDate": "2015-07-08" + }, + "3.7.2": { + "releaseDate": "2015-07-08" + }, + "3.7.3": { + "releaseDate": "2015-07-09" + }, + "3.7.4": { + "releaseDate": "2015-07-20" + }, + "3.7.5": { + "releaseDate": "2015-07-23" + }, + "3.7.6": { + "releaseDate": "2015-08-24" + }, + "3.7.7": { + "releaseDate": "2015-08-27" + }, + "3.7.8": { + "releaseDate": "2015-09-01" + }, + "3.8.0": { + "releaseDate": "2015-09-17" + }, + "3.8.1": { + "releaseDate": "2015-09-21" + }, + "3.9.0": { + "releaseDate": "2015-10-23" + }, + "3.9.1": { + "releaseDate": "2015-11-02" + }, + "3.9.2": { + "releaseDate": "2015-11-05" + }, + "3.9.3": { + "releaseDate": "2015-12-01" + }, + "3.9.4": { + "releaseDate": "2015-12-04" + }, + "3.10.0": { + "releaseDate": "2015-12-08" + }, + "3.10.1": { + "releaseDate": "2015-12-11" + }, + "3.10.2": { + "releaseDate": "2015-12-14" + }, + "3.11.0": { + "releaseDate": "2016-01-29" + }, + "3.12.0": { + "releaseDate": "2016-02-05" + }, + "3.13.0": { + "releaseDate": "2016-02-23" + }, + "3.13.1": { + "releaseDate": "2016-03-24" + }, + "3.14.0": { + "releaseDate": "2016-05-04" + }, + "3.14.1": { + "releaseDate": "2016-05-12" + }, + "3.14.2": { + "releaseDate": "2016-05-24" + }, + "3.14.3": { + "releaseDate": "2016-05-25" + }, + "3.14.4": { + "releaseDate": "2016-05-25" + }, + "3.14.5": { + "releaseDate": "2016-05-26" + }, + "3.14.6": { + "releaseDate": "2016-05-30" + }, + "3.15.0": { + "releaseDate": "2016-06-07" + }, + "3.15.1": { + "releaseDate": "2016-06-16" + }, + "3.16.0": { + "releaseDate": "2016-06-22" + }, + "3.17.0": { + "releaseDate": "2016-07-06" + }, + "3.18.0": { + "releaseDate": "2016-07-22" + }, + "3.18.1": { + "releaseDate": "2016-08-31" + }, + "3.19.0": { + "releaseDate": "2016-10-26" + }, + "3.19.1": { + "releaseDate": "2016-11-10" + }, + "3.19.2": { + "releaseDate": "2016-11-28" + }, + "3.20.0": { + "releaseDate": "2016-12-14" + }, + "3.20.1": { + "releaseDate": "2016-12-16" + }, + "3.20.2": { + "releaseDate": "2016-12-19" + }, + "3.20.3": { + "releaseDate": "2017-01-04" + }, + "3.20.4": { + "releaseDate": "2017-01-16" + }, + "3.21.0": { + "releaseDate": "2017-02-06" + }, + "3.21.1": { + "releaseDate": "2017-02-08" + }, + "3.22.0": { + "releaseDate": "2017-03-13" + }, + "3.22.1": { + "releaseDate": "2017-03-13" + }, + "3.22.2": { + "releaseDate": "2017-05-18" + }, + "3.22.3": { + "releaseDate": "2017-05-29" + }, + "3.23.0": { + "releaseDate": "2017-06-08" + }, + "3.24.0": { + "releaseDate": "2017-06-21" + }, + "3.24.1": { + "releaseDate": "2017-07-20" + }, + "3.24.2": { + "releaseDate": "2017-07-24" + }, + "3.24.3": { + "releaseDate": "2017-07-24" + }, + "3.24.4": { + "releaseDate": "2017-09-21" + }, + "3.24.5": { + "releaseDate": "2017-10-02" + }, + "3.24.6": { + "releaseDate": "2017-11-16" + }, + "3.24.7": { + "releaseDate": "2017-11-29" + }, + "3.24.8": { + "releaseDate": "2017-12-13" + }, + "3.24.9": { + "releaseDate": "2017-12-29" + }, + "3.24.10": { + "releaseDate": "2018-02-07" + }, + "3.24.11": { + "releaseDate": "2018-02-08" + }, + "3.24.12": { + "releaseDate": "2018-02-28" + }, + "3.25.0": { + "releaseDate": "2018-03-07" + }, + "3.25.1": { + "releaseDate": "2018-03-07" + }, + "3.26.0": { + "releaseDate": "2018-03-21" + }, + "3.27.0": { + "releaseDate": "2018-04-16" + }, + "3.27.1": { + "releaseDate": "2018-05-03" + }, + "3.28.0": { + "releaseDate": "2018-06-13" + }, + "3.29.0": { + "releaseDate": "2018-06-20" + }, + "3.30.0": { + "releaseDate": "2018-08-01" + }, + "3.31.0": { + "releaseDate": "2018-12-04" + }, + "3.32.0": { + "releaseDate": "2018-12-17" + }, + "3.32.1": { + "releaseDate": "2019-03-14" + }, + "3.33.0": { + "releaseDate": "2019-05-09" + }, + "3.34.0": { + "releaseDate": "2019-08-29" + }, + "3.35.0": { + "releaseDate": "2019-09-26" + }, + "3.35.1": { + "releaseDate": "2019-10-08" + }, + "4.0.0": { + "releaseDate": "2020-02-03" + }, + "4.0.1": { + "releaseDate": "2020-02-03" + }, + "4.0.2": { + "releaseDate": "2020-02-07" + }, + "4.0.3": { + "releaseDate": "2020-02-13" + }, + "4.1.0": { + "releaseDate": "2020-03-09" + }, + "4.2.0": { + "releaseDate": "2020-04-21" + }, + "4.3.0": { + "releaseDate": "2020-06-11" + }, + "4.3.1": { + "releaseDate": "2020-07-20" + }, + "4.4.0": { + "releaseDate": "2020-08-06" + }, + "4.5.0": { + "releaseDate": "2020-09-14" + }, + "4.5.1": { + "releaseDate": "2020-09-14" + }, + "4.6.0": { + "releaseDate": "2020-11-02" + }, + "4.7.0": { + "releaseDate": "2020-11-16" + }, + "4.8.0": { + "releaseDate": "2020-11-19" + }, + "4.8.1": { + "releaseDate": "2020-11-25" + }, + "4.8.2": { + "releaseDate": "2020-11-26" + }, + "4.8.3": { + "releaseDate": "2020-12-03" + }, + "4.8.4": { + "releaseDate": "2021-01-20" + }, + "4.8.5": { + "releaseDate": "2021-02-08" + }, + "4.8.6": { + "releaseDate": "2021-03-08" + }, + "4.9.0": { + "releaseDate": "2021-04-13" + }, + "4.9.1": { + "releaseDate": "2021-04-26" + }, + "4.9.2": { + "releaseDate": "2021-06-10" + }, + "4.9.3": { + "releaseDate": "2021-06-15" + }, + "4.10.0": { + "releaseDate": "2021-06-23" + }, + "4.10.2": { + "releaseDate": "2021-06-23" + }, + "4.10.3": { + "releaseDate": "2021-07-05" + }, + "4.10.4": { + "releaseDate": "2021-08-23" + }, + "4.10.5": { + "releaseDate": "2021-08-26" + }, + "4.11.0": { + "releaseDate": "2021-10-20" + }, + "4.12.0": { + "releaseDate": "2022-01-07" + }, + "4.12.1": { + "releaseDate": "2022-01-28" + }, + "4.12.2": { + "releaseDate": "2022-03-02" + }, + "4.13.0": { + "releaseDate": "2022-03-14" + }, + "4.13.1": { + "releaseDate": "2022-05-18" + }, + "4.14.0": { + "releaseDate": "2022-07-18" + }, + "4.14.1": { + "releaseDate": "2022-07-20" + }, + "4.14.2": { + "releaseDate": "2022-07-27" + }, + "4.14.3": { + "releaseDate": "2022-12-19" + }, + "4.15.0": { + "releaseDate": "2023-03-02" + }, + "4.16.0": { + "releaseDate": "2023-03-22" + }, + "4.17.0": { + "releaseDate": "2023-04-03" + }, + "4.17.1": { + "releaseDate": "2023-05-24" + }, + "4.17.2": { + "releaseDate": "2023-06-08" + }, + "4.18.0": { + "releaseDate": "2023-06-23" + }, + "4.19.0": { + "releaseDate": "2023-07-18" + }, + "4.19.1": { + "releaseDate": "2023-07-20" + }, + "4.20.0": { + "releaseDate": "2023-09-12" + }, + "4.21.0": { + "releaseDate": "2023-12-11" + }, + "4.21.1": { + "releaseDate": "2023-12-12" + }, + "4.22.0": { + "releaseDate": "2023-12-14" + }, + "4.22.1": { + "releaseDate": "2024-01-09" + }, + "4.23.0": { + "releaseDate": "2024-03-26" + }, + "4.23.1": { + "releaseDate": "2024-03-26" + }, + "4.23.2": { + "releaseDate": "2024-03-27" + }, + "4.23.3": { + "releaseDate": "2024-04-10" + }, + "4.24.0": { + "releaseDate": "2024-06-25" + }, + "5.0.0": { + "releaseDate": "2024-08-14" + }, + "5.0.1": { + "releaseDate": "2024-08-14" + }, + "5.0.2": { + "releaseDate": "2024-08-19" + }, + "5.1.0": { + "releaseDate": "2024-08-20" + }, + "5.1.1": { + "releaseDate": "2024-08-21" + }, + "5.2.0": { + "releaseDate": "2024-08-27" + }, + "5.2.1": { + "releaseDate": "2024-08-28" + }, + "5.2.2": { + "releaseDate": "2024-08-29" + }, + "5.2.3": { + "releaseDate": "2024-08-29" + }, + "5.2.4": { + "releaseDate": "2024-09-02" + }, + "5.2.5": { + "releaseDate": "2024-09-03" + }, + "5.3.0": { + "releaseDate": "2024-09-06" + }, + "5.3.1": { + "releaseDate": "2024-09-09" + }, + "5.3.2": { + "releaseDate": "2024-09-09" + }, + "5.4.0": { + "releaseDate": "2024-09-10" + }, + "5.4.1": { + "releaseDate": "2024-09-12" + }, + "5.4.2": { + "releaseDate": "2024-09-13" + }, + "5.4.3": { + "releaseDate": "2024-09-17" + }, + "5.5.0": { + "releaseDate": "2024-09-18" + }, + "5.5.1": { + "releaseDate": "2024-09-18" + }, + "5.5.2": { + "releaseDate": "2024-09-19" + }, + "5.5.3": { + "releaseDate": "2024-09-20" + }, + "5.6.0": { + "releaseDate": "2024-09-24" + }, + "5.6.1": { + "releaseDate": "2024-09-25" + } + }, + "python": { + "1.0.0": { + "releaseDate": "2013-10-09" + }, + "1.0.1": { + "releaseDate": "2013-10-09" + }, + "1.0.2": { + "releaseDate": "2013-10-11" + }, + "1.1.0": { + "releaseDate": "2013-11-07" + }, + "1.1.1": { + "releaseDate": "2013-11-08" + }, + "1.1.3": { + "releaseDate": "2013-12-06" + }, + "1.1.5": { + "releaseDate": "2013-12-06" + }, + "1.1.6": { + "releaseDate": "2013-12-10" + }, + "1.2.1": { + "releaseDate": "2013-12-18" + }, + "1.2.2": { + "releaseDate": "2013-12-23" + }, + "1.2.3": { + "releaseDate": "2014-01-11" + }, + "1.2.4": { + "releaseDate": "2014-01-11" + }, + "1.2.5": { + "releaseDate": "2014-01-31" + }, + "1.2.6": { + "releaseDate": "2014-02-02" + }, + "1.2.9": { + "releaseDate": "2014-03-31" + }, + "1.2.10": { + "releaseDate": "2014-04-18" + }, + "1.2.11": { + "releaseDate": "2014-07-17" + }, + "1.2.12": { + "releaseDate": "2014-08-20" + }, + "1.2.13": { + "releaseDate": "2014-08-21" + }, + "1.2.14": { + "releaseDate": "2014-08-22" + }, + "1.3.1": { + "releaseDate": "2014-09-14" + }, + "1.3.4": { + "releaseDate": "2014-09-15" + }, + "1.3.7": { + "releaseDate": "2014-09-17" + }, + "1.3.8": { + "releaseDate": "2014-09-17" + }, + "1.3.9": { + "releaseDate": "2014-09-17" + }, + "1.3.10": { + "releaseDate": "2014-10-11" + }, + "1.3.11": { + "releaseDate": "2014-10-22" + }, + "1.4.0": { + "releaseDate": "2014-11-29" + }, + "1.5.0": { + "releaseDate": "2014-12-26" + }, + "1.5.1": { + "releaseDate": "2015-03-13" + }, + "1.5.2": { + "releaseDate": "2015-04-09" + }, + "1.5.3": { + "releaseDate": "2015-04-24" + }, + "1.5.4": { + "releaseDate": "2015-05-04" + }, + "1.5.5": { + "releaseDate": "2015-06-16" + }, + "1.5.6": { + "releaseDate": "2015-06-18" + }, + "1.5.7": { + "releaseDate": "2015-06-19" + }, + "1.5.8": { + "releaseDate": "2015-07-10" + }, + "1.5.9": { + "releaseDate": "2015-07-22" + }, + "1.6.0": { + "releaseDate": "2015-07-30" + }, + "1.6.1": { + "releaseDate": "2015-07-30" + }, + "1.6.2": { + "releaseDate": "2015-08-01" + }, + "1.6.3": { + "releaseDate": "2015-08-13" + }, + "1.6.4": { + "releaseDate": "2015-08-17" + }, + "1.6.6": { + "releaseDate": "2015-09-07" + }, + "1.6.7": { + "releaseDate": "2015-10-06" + }, + "1.6.8": { + "releaseDate": "2015-10-07" + }, + "1.7.0": { + "releaseDate": "2015-10-16" + }, + "1.7.1": { + "releaseDate": "2015-10-23" + }, + "1.8.0": { + "releaseDate": "2016-02-11" + }, + "1.9.0": { + "releaseDate": "2016-06-15" + }, + "1.9.1": { + "releaseDate": "2016-07-05" + }, + "1.9.2": { + "releaseDate": "2016-08-08" + }, + "1.10.0": { + "releaseDate": "2016-10-19" + }, + "1.11.0": { + "releaseDate": "2016-12-02" + }, + "1.11.2": { + "releaseDate": "2017-01-31" + }, + "1.11.3": { + "releaseDate": "2017-02-23" + }, + "1.12.0": { + "releaseDate": "2017-03-02" + }, + "1.14.0": { + "releaseDate": "2017-10-30" + }, + "1.14.1": { + "releaseDate": "2017-11-06" + }, + "1.15.0": { + "releaseDate": "2017-12-05" + }, + "1.15.2": { + "releaseDate": "2017-12-18" + }, + "1.15.3": { + "releaseDate": "2018-03-15" + }, + "1.16.0": { + "releaseDate": "2018-06-07" + }, + "1.17.0": { + "releaseDate": "2018-06-19" + }, + "1.18.0": { + "releaseDate": "2018-11-23" + }, + "1.18.1": { + "releaseDate": "2018-11-26" + }, + "1.19.0": { + "releaseDate": "2018-12-18" + }, + "1.20.0": { + "releaseDate": "2019-01-23" + }, + "2.0.0": { + "releaseDate": "2019-04-23" + }, + "2.0.1": { + "releaseDate": "2019-05-14" + }, + "2.0.2": { + "releaseDate": "2019-05-21" + }, + "2.0.3": { + "releaseDate": "2019-05-28" + }, + "2.0.4": { + "releaseDate": "2019-06-17" + }, + "2.1.0": { + "releaseDate": "2019-09-04" + }, + "2.2.0": { + "releaseDate": "2020-03-09" + }, + "2.3.0": { + "releaseDate": "2020-06-04" + }, + "2.3.1": { + "releaseDate": "2020-07-09" + }, + "2.4.0": { + "releaseDate": "2020-08-10" + }, + "2.5.0": { + "releaseDate": "2021-04-30" + }, + "2.6.0": { + "releaseDate": "2021-10-08" + }, + "2.6.1": { + "releaseDate": "2021-12-13" + }, + "2.6.2": { + "releaseDate": "2022-05-04" + }, + "2.6.3": { + "releaseDate": "2023-01-03" + }, + "3.0.0": { + "releaseDate": "2023-02-27" + }, + "4.0.0": { + "releaseDate": "2024-08-14" + }, + "4.0.1": { + "releaseDate": "2024-08-14" + }, + "4.0.2": { + "releaseDate": "2024-08-19" + }, + "4.1.0": { + "releaseDate": "2024-08-20" + }, + "4.1.1": { + "releaseDate": "2024-08-21" + }, + "4.2.0": { + "releaseDate": "2024-08-27" + }, + "4.2.1": { + "releaseDate": "2024-08-28" + }, + "4.2.2": { + "releaseDate": "2024-08-29" + }, + "4.2.3": { + "releaseDate": "2024-09-02" + }, + "4.2.4": { + "releaseDate": "2024-09-03" + }, + "4.3.0": { + "releaseDate": "2024-09-06" + }, + "4.4.0": { + "releaseDate": "2024-09-09" + }, + "4.4.1": { + "releaseDate": "2024-09-12" + }, + "4.4.2": { + "releaseDate": "2024-09-17" + }, + "4.4.3": { + "releaseDate": "2024-09-19" + }, + "4.4.4": { + "releaseDate": "2024-09-19" + }, + "4.4.5": { + "releaseDate": "2024-09-24" + }, + "4.4.6": { + "releaseDate": "2024-09-25" + } + } +} \ No newline at end of file diff --git a/scripts/.eslintrc.cjs b/scripts/.eslintrc.cjs index 3a58bbdfc1..9389e997bc 100644 --- a/scripts/.eslintrc.cjs +++ b/scripts/.eslintrc.cjs @@ -1,5 +1,5 @@ module.exports = { - ignorePatterns: ['**.yml', 'tsconfig.json'], + ignorePatterns: ['**.yml', 'tsconfig.json', 'foo'], extends: "../.eslintrc.cjs", diff --git a/scripts/ci/codegen/createGitHubReleases.ts b/scripts/ci/codegen/createGitHubReleases.ts index 72d3b1d314..e7c6ce71cc 100644 --- a/scripts/ci/codegen/createGitHubReleases.ts +++ b/scripts/ci/codegen/createGitHubReleases.ts @@ -1,7 +1,7 @@ /* eslint-disable no-console */ import { ensureGitHubToken, getOctokit, OWNER, run, setVerbose, toAbsolutePath } from '../../common'; -import { isPreRelease } from '../../release/sla'; +import { isPreRelease } from '../../release/versionsHistory'; import type { Language } from '../../types'; import { cloneRepository } from '../utils'; diff --git a/scripts/ci/codegen/pushToAlgoliaDoc.ts b/scripts/ci/codegen/pushToAlgoliaDoc.ts index 781b0f13d9..cb12a7a848 100644 --- a/scripts/ci/codegen/pushToAlgoliaDoc.ts +++ b/scripts/ci/codegen/pushToAlgoliaDoc.ts @@ -86,15 +86,6 @@ async function pushToAlgoliaDoc(): Promise { head: targetBranch, }); - await octokit.issues.createComment({ - owner: OWNER, - repo: repository, - issue_number: data.number, - body: [ - `[**Preview SLA changes→**](https://deploy-preview-${data.number}--algolia-docs.netlify.app/doc/libraries/supported-versions/)`, - ].join('\n\n'), - }); - console.log(`Pull request created on ${OWNER}/${repository}`); console.log(` > ${data.url}`); } diff --git a/scripts/cli/index.ts b/scripts/cli/index.ts index 5b3337e010..7102664ff3 100644 --- a/scripts/cli/index.ts +++ b/scripts/cli/index.ts @@ -11,7 +11,7 @@ import { formatter } from '../formatter.js'; import { generate } from '../generate.js'; import { playground } from '../playground.js'; import { createReleasePR } from '../release/createReleasePR.js'; -import { generateSLA } from '../release/sla.js'; +import { generateVersionsHistory } from '../release/versionsHistory.js'; import { snippetsGenerateMany } from '../snippets/generate.js'; import { buildSpecs } from '../specs'; import type { Language } from '../types.js'; @@ -255,13 +255,13 @@ program undefined, ) .option('-d, --dry-run', 'does not push anything to GitHub') - .option('-sla, --sla-only', 'only generates the sla policy', false) + .option('-vh, --versions-history', 'only generates the versions-history policy', false) .option('-b --breaking', 'allow breaking change on the CI', false) - .action(async ({ verbose, releaseType, dryRun, slaOnly, breaking }) => { + .action(async ({ verbose, releaseType, dryRun, versionsHistory, breaking }) => { setVerbose(Boolean(verbose)); - if (slaOnly) { - await generateSLA({}); + if (versionsHistory) { + await generateVersionsHistory({}); return; } diff --git a/scripts/release/__tests__/sla.test.ts b/scripts/release/__tests__/sla.test.ts deleted file mode 100644 index ee368b4f83..0000000000 --- a/scripts/release/__tests__/sla.test.ts +++ /dev/null @@ -1,231 +0,0 @@ -// @ts-nocheck this file is broken while the SLA is unclear -import { describe, expect, it } from 'vitest'; - -import { fullReleaseConfig, LANGUAGES } from '../../common.js'; -import { generateLanguageSLA } from '../sla.js'; - -describe('generateLanguageSLA', () => { - LANGUAGES.forEach((lang) => { - if (!('sla' in fullReleaseConfig)) { - fullReleaseConfig.sla = {}; - } - - // @ts-expect-error - fullReleaseConfig.sla[lang] = {}; - }); - - describe('no new releases', () => { - it('parses version of the same minor', () => { - generateLanguageSLA( - [ - '1.2.4 Thu Dec 28 15:48:25 2023 +0000', - '1.2.5 Tue Jan 2 14:17:11 2024 +0000', - '1.2.6 Tue Jan 2 15:26:06 2024 +0000', - '1.2.7 Thu Jan 4 15:09:11 2024 +0000', - ], - 'csharp', - { current: '1.2.7', next: null, releaseType: null }, - ); - - // @ts-expect-error - expect(fullReleaseConfig.sla.csharp).toEqual({ - '1.2.4': { - releaseDate: '2023-12-28', - supportEnd: '2024-01-02', - supportStatus: 'inactive', - }, - '1.2.5': { - releaseDate: '2024-01-02', - supportEnd: '2024-01-02', - supportStatus: 'inactive', - }, - '1.2.6': { - releaseDate: '2024-01-02', - supportEnd: '2024-01-04', - supportStatus: 'inactive', - }, - '1.2.7': { - releaseDate: '2024-01-04', - supportStatus: 'active', - }, - }); - }); - - it('parses version of different same minor', () => { - generateLanguageSLA( - [ - '1.1.4 Thu Dec 28 15:48:25 2023 +0000', - '1.2.5 Tue Jan 2 14:17:11 2024 +0000', - '1.3.6 Tue Jan 2 15:26:06 2024 +0000', - '1.4.7 Thu Jan 4 15:09:11 2024 +0000', - ], - 'javascript', - { current: '1.4.7', next: null, releaseType: null }, - ); - - // @ts-expect-error - expect(fullReleaseConfig.sla.javascript).toEqual({ - '1.1.4': { - releaseDate: '2023-12-28', - supportEnd: '2026-01-02', - supportStart: '2024-01-02', - supportStatus: 'maintenance', - }, - '1.2.5': { - releaseDate: '2024-01-02', - supportEnd: '2026-01-02', - supportStart: '2024-01-02', - supportStatus: 'maintenance', - }, - '1.3.6': { - releaseDate: '2024-01-02', - supportEnd: '2026-01-04', - supportStart: '2024-01-04', - supportStatus: 'maintenance', - }, - '1.4.7': { - releaseDate: '2024-01-04', - supportStatus: 'active', - }, - }); - }); - - it('ignores versions older than 2 years', () => { - generateLanguageSLA( - [ - 'v1.0.9 Thu Dec 28 15:48:25 2011 +0000', - 'v1.1.4 Thu Dec 28 15:48:25 2021 +0000', - 'v1.4.7 Tue Jan 2 14:17:11 2024 +0000', - ], - 'php', - { current: '1.4.7', next: null, releaseType: null }, - ); - - // @ts-expect-error - expect(fullReleaseConfig.sla.php).toEqual({ - '1.1.4': { - releaseDate: '2021-12-28', - supportEnd: '2026-01-02', - supportStart: '2024-01-02', - supportStatus: 'maintenance', - }, - '1.4.7': { - releaseDate: '2024-01-02', - supportStatus: 'active', - }, - }); - }); - - it('overrides the previously stored versions and sanitize v prefixed versions', () => { - // @ts-expect-error - fullReleaseConfig.sla.go = { '0.1.2': { releaseDate: '2014-01-04', supportStatus: 'active' } }; - - generateLanguageSLA(['v1.1.4 Thu Dec 28 15:48:25 2023 +0000', 'v1.4.7 Tue Jan 2 14:17:11 2024 +0000'], 'go', { - current: '1.4.7', - next: null, - releaseType: null, - }); - - // @ts-expect-error - expect(fullReleaseConfig.sla.go).toEqual({ - '1.1.4': { - releaseDate: '2023-12-28', - supportEnd: '2026-01-02', - supportStart: '2024-01-02', - supportStatus: 'maintenance', - }, - '1.4.7': { - releaseDate: '2024-01-02', - supportStatus: 'active', - }, - }); - }); - }); - - describe('new release', () => { - const start = new Date(); - const end = new Date(start); - end.setFullYear(start.getFullYear() + 2); - - it('same version as active version', () => { - generateLanguageSLA(['1.2.4 Thu Dec 28 15:48:25 2023 +0000'], 'dart', { - next: '1.2.4', - current: '1.2.4', - releaseType: 'minor', - }); - - // @ts-expect-error - expect(fullReleaseConfig.sla.dart).toEqual({ - '1.2.4': { - releaseDate: '2023-12-28', - supportStatus: 'active', - }, - }); - }); - - it('new major: sets the new release as active, sets the last tag as maintenance', () => { - generateLanguageSLA(['1.2.4 Thu Dec 28 15:48:25 2023 +0000'], 'dart', { - next: '2.0.0', - current: '1.2.4', - releaseType: 'major', - }); - - // @ts-expect-error - expect(fullReleaseConfig.sla.dart).toEqual({ - '1.2.4': { - releaseDate: '2023-12-28', - supportEnd: end.toISOString().split('T')[0], - supportStart: start.toISOString().split('T')[0], - supportStatus: 'maintenance', - }, - '2.0.0': { - releaseDate: start.toISOString().split('T')[0], - supportStatus: 'active', - }, - }); - }); - - it('new minor: sets the new release as active, sets the last tag as maintenance', () => { - generateLanguageSLA(['1.2.4 Thu Dec 28 15:48:25 2023 +0000'], 'kotlin', { - next: '1.3.0', - current: '1.2.4', - releaseType: 'minor', - }); - - // @ts-expect-error - expect(fullReleaseConfig.sla.kotlin).toEqual({ - '1.2.4': { - releaseDate: '2023-12-28', - supportEnd: end.toISOString().split('T')[0], - supportStart: start.toISOString().split('T')[0], - supportStatus: 'maintenance', - }, - '1.3.0': { - releaseDate: start.toISOString().split('T')[0], - supportStatus: 'active', - }, - }); - }); - - it('new patch: sets the new release as active, sets the last tag as inactive', () => { - generateLanguageSLA(['1.2.4 Thu Dec 28 15:48:25 2023 +0000'], 'swift', { - next: '1.2.5', - current: '1.2.4', - releaseType: 'patch', - }); - - // @ts-expect-error - expect(fullReleaseConfig.sla.swift).toEqual({ - '1.2.4': { - releaseDate: '2023-12-28', - supportEnd: start.toISOString().split('T')[0], - supportStatus: 'inactive', - }, - '1.2.5': { - releaseDate: start.toISOString().split('T')[0], - supportStatus: 'active', - }, - }); - }); - }); -}); diff --git a/scripts/release/__tests__/versionsHistory.test.ts b/scripts/release/__tests__/versionsHistory.test.ts new file mode 100644 index 0000000000..7365cff1f5 --- /dev/null +++ b/scripts/release/__tests__/versionsHistory.test.ts @@ -0,0 +1,135 @@ +// @ts-nocheck this file is broken while the VersionsHistory is unclear +import { describe, expect, it } from 'vitest'; + +import { generateLanguageVersionsHistory } from '../versionsHistory.js'; + +describe('generateLanguageVersionsHistory', () => { + describe('no new releases', () => { + it('parses version of the same minor', () => { + const versions = generateLanguageVersionsHistory( + [ + '1.2.4 Thu Dec 28 15:48:25 2023 +0000', + '1.2.5 Tue Jan 2 14:17:11 2024 +0000', + '1.2.6 Tue Jan 2 15:26:06 2024 +0000', + '1.2.7 Thu Jan 4 15:09:11 2024 +0000', + ], + 'csharp', + { current: '1.2.7', next: null, releaseType: null }, + ); + + expect(versions).toEqual({ + '1.2.4': { + releaseDate: '2023-12-28', + }, + '1.2.5': { + releaseDate: '2024-01-02', + }, + '1.2.6': { + releaseDate: '2024-01-02', + }, + '1.2.7': { + releaseDate: '2024-01-04', + }, + }); + }); + + it('parses version of different same minor', () => { + const versions = generateLanguageVersionsHistory( + [ + '1.1.4 Thu Dec 28 15:48:25 2023 +0000', + '1.2.5 Tue Jan 2 14:17:11 2024 +0000', + '1.3.6 Tue Jan 2 15:26:06 2024 +0000', + '1.4.7 Thu Jan 4 15:09:11 2024 +0000', + ], + 'javascript', + { current: '1.4.7', next: null, releaseType: null }, + ); + + expect(versions).toEqual({ + '1.1.4': { + releaseDate: '2023-12-28', + }, + '1.2.5': { + releaseDate: '2024-01-02', + }, + '1.3.6': { + releaseDate: '2024-01-02', + }, + '1.4.7': { + releaseDate: '2024-01-04', + }, + }); + }); + }); + + describe('new release', () => { + const start = new Date(); + const end = new Date(start); + end.setFullYear(start.getFullYear() + 2); + + it('same version as active version', () => { + const versions = generateLanguageVersionsHistory(['1.2.4 Thu Dec 28 15:48:25 2023 +0000'], 'dart', { + next: '1.2.4', + current: '1.2.4', + releaseType: 'minor', + }); + + expect(versions).toEqual({ + '1.2.4': { + releaseDate: '2023-12-28', + }, + }); + }); + + it('new major: sets the new release as active, sets the last tag as maintenance', () => { + const versions = generateLanguageVersionsHistory(['1.2.4 Thu Dec 28 15:48:25 2023 +0000'], 'dart', { + next: '2.0.0', + current: '1.2.4', + releaseType: 'major', + }); + + expect(versions).toEqual({ + '1.2.4': { + releaseDate: '2023-12-28', + }, + '2.0.0': { + releaseDate: start.toISOString().split('T')[0], + }, + }); + }); + + it('new minor: sets the new release as active, sets the last tag as maintenance', () => { + const versions = generateLanguageVersionsHistory(['1.2.4 Thu Dec 28 15:48:25 2023 +0000'], 'kotlin', { + next: '1.3.0', + current: '1.2.4', + releaseType: 'minor', + }); + + expect(versions).toEqual({ + '1.2.4': { + releaseDate: '2023-12-28', + }, + '1.3.0': { + releaseDate: start.toISOString().split('T')[0], + }, + }); + }); + + it('new patch: sets the new release as active, sets the last tag as inactive', () => { + const versions = generateLanguageVersionsHistory(['1.2.4 Thu Dec 28 15:48:25 2023 +0000'], 'swift', { + next: '1.2.5', + current: '1.2.4', + releaseType: 'patch', + }); + + expect(versions).toEqual({ + '1.2.4': { + releaseDate: '2023-12-28', + }, + '1.2.5': { + releaseDate: start.toISOString().split('T')[0], + }, + }); + }); + }); +}); diff --git a/scripts/release/createReleasePR.ts b/scripts/release/createReleasePR.ts index e930c569b6..ca6cba2992 100755 --- a/scripts/release/createReleasePR.ts +++ b/scripts/release/createReleasePR.ts @@ -26,10 +26,10 @@ import { getPackageVersionDefault } from '../config.js'; import type { Language } from '../types.js'; import { getFileChanges, getLastReleasedTag } from './common.js'; -import { generateSLA } from './sla.js'; import TEXT from './text.js'; import type { Versions, ParsedCommit, Commit, Changelog, Scope, CommitType } from './types.js'; import { updateAPIVersions } from './updateAPIVersions.js'; +import { generateVersionsHistory } from './versionsHistory.js'; dotenv.config({ path: path.resolve(ROOT_DIR, '.env') }); @@ -343,10 +343,7 @@ export async function createReleasePR({ const versions = decideReleaseStrategy({ commits: validCommits, releaseType }); - // skip anything sla related for now - if (process.env.SLA) { - await generateSLA(versions); - } + await generateVersionsHistory(versions); const versionChanges = getVersionChangesText(versions); const languages = Object.keys(versions).join(', '); diff --git a/scripts/release/sla.ts b/scripts/release/sla.ts deleted file mode 100644 index 41ca61799e..0000000000 --- a/scripts/release/sla.ts +++ /dev/null @@ -1,183 +0,0 @@ -/* eslint-disable no-console */ -// @ts-nocheck this file is broken while the SLA is unclear -import fsp from 'fs/promises'; - -import semver from 'semver'; - -import { cloneRepository } from '../ci/utils.js'; -import { ensureGitHubToken, fullReleaseConfig, LANGUAGES, run, toAbsolutePath } from '../common.js'; -import type { Language } from '../types.js'; - -import { preReleaseRegExp } from './createReleasePR.js'; -import type { Version, Versions } from './types.js'; - -function getMajorMinor(lang: Language, version: string): { major: number; minor: number } { - const matches = version.match(/(\d+)\.(\d+)/); - - if (!matches || matches.length < 3) { - console.warn(`unable to parse version '${version}' for language '${lang}'`); - - return { major: 0, minor: 0 }; - } - - return { major: parseInt(matches[1], 10), minor: parseInt(matches[2], 10) }; -} - -export function isPreRelease(version: string): boolean { - return ( - version.match(preReleaseRegExp) !== null || - semver.prerelease(version) !== null || - version.includes('beta') || - version.includes('alpha') || - version.startsWith('0') || - isNaN(parseInt(version.charAt(0), 10)) - ); -} - -function setInactive(lang: Language, version: string, supportEnd: Date): void { - fullReleaseConfig.sla[lang][version].supportEnd = supportEnd.toISOString().split('T')[0]; - fullReleaseConfig.sla[lang][version].supportStatus = 'inactive'; -} - -function setMaintenance(lang: Language, version: string, supportStart: Date, supportEnd: Date): void { - fullReleaseConfig.sla[lang][version] = { - ...fullReleaseConfig.sla[lang][version], - supportStart: supportStart.toISOString().split('T')[0], - supportEnd: supportEnd.toISOString().split('T')[0], - supportStatus: 'maintenance', - }; -} - -// fetches the git tags on the given `lang` repository, throws if none. -async function getTags(lang: Language): Promise { - const githubToken = ensureGitHubToken(); - - // fetch all release tags for this lang - const { tempGitDir } = await cloneRepository({ - lang, - githubToken, - tempDir: process.env.RUNNER_TEMP! || toAbsolutePath('foo/local/test'), - }); - await run('git fetch --all --tags', { cwd: tempGitDir }); - - const tags = ( - await run("git for-each-ref --sort=creatordate --format '%(refname:short) %(creatordate)' refs/tags", { - cwd: tempGitDir, - }) - ).split('\n'); - - if (tags.length === 0) { - throw new Error(`unable to find tags for language ${lang}`); - } - - return tags; -} - -/* - * udpates the release.config.json file for the given `lang` by generating an SLA policy map of every versions in a now-2years window. - * the given `version` to release is added to the map once existing tags are computed. - * any pre-release and non-semver tags are excluded - */ -export function generateLanguageSLA(tags: string[], lang: Language, version: Version): void { - const start = new Date(); - const old = new Date(start); - old.setFullYear(start.getFullYear() - 2); - const end = new Date(start); - end.setFullYear(start.getFullYear() + 2); - - // @ts-expect-error -- force reset our sla policy to remove outdated ones - fullReleaseConfig.sla[lang] = {}; - - let prevTagRelease = start; - let prevTagMajor = 0; - let prevTagMinor = 0; - let prevTagVersion = ''; - - for (const tag of tags) { - // eslint-disable-next-line prefer-const - let [tagVersion, tagReleaseDate] = tag.split(/(?<=^\S+)\s/); - - // edge case for go which tags version with a v prefix - if (tagVersion.startsWith('v')) { - tagVersion = tagVersion.replace(/^v/, ''); - } - - // we skip any form of pre-releases because they are not part of the SLA - if (isPreRelease(tagVersion)) { - continue; - } - - const { major: tagMajor, minor: tagMinor } = getMajorMinor(lang, tagVersion); - - if (tagMajor === 0 && tagMinor === 0) { - continue; - } - - const releaseDate = new Date(tagReleaseDate); - const deadline = new Date(releaseDate); - deadline.setFullYear(releaseDate.getFullYear() + 2); - - // the current tag version defines the maintenance policy of the previous one - if (prevTagVersion !== '') { - // if the previous tag is on the same major.minor version, we don't support it - if (tagMajor === prevTagMajor && tagMinor === prevTagMinor) { - setInactive(lang, prevTagVersion, releaseDate); - - if (prevTagRelease.getTime() < old.getTime()) { - delete fullReleaseConfig.sla[lang][prevTagVersion]; - } - } else { - setMaintenance(lang, prevTagVersion, releaseDate, deadline); - - if (start.getTime() > deadline.getTime()) { - delete fullReleaseConfig.sla[lang][prevTagVersion]; - } - } - } - - fullReleaseConfig.sla[lang][tagVersion] = { - releaseDate: releaseDate.toISOString().split('T')[0], - }; - - prevTagRelease = releaseDate; - prevTagMajor = tagMajor; - prevTagMinor = tagMinor; - prevTagVersion = tagVersion; - } - - // if there's no release planned, or if the release is a pre-release, then the latest tagged version is the active one - if (!version?.next || isPreRelease(version?.next) || version?.next === prevTagVersion) { - fullReleaseConfig.sla[lang][prevTagVersion].supportStatus = 'active'; - - return; - } - - const { major: nextMajor, minor: nextMinor } = getMajorMinor(lang, version.next); - - // if we release a new patch on the same major.minor version as the active one, we set it as inactive - if (nextMajor === prevTagMajor && nextMinor === prevTagMinor) { - setInactive(lang, prevTagVersion, start); - } else { - setMaintenance(lang, prevTagVersion, start, end); - } - - // if it's a new major or minor, it's just a new active version, the previous one is already in maintenance - fullReleaseConfig.sla[lang][version.next] = { - releaseDate: start.toISOString().split('T')[0], - supportStatus: 'active', - }; -} - -export async function generateSLA(versions: Versions): Promise { - await Promise.all( - LANGUAGES.map(async (lang) => { - console.log(`> generating SLA for the ${lang} client`); - - const tags = await getTags(lang); - - return generateLanguageSLA(tags, lang, versions[lang]); - }), - ); - - await fsp.writeFile(toAbsolutePath('config/release.config.json'), JSON.stringify(fullReleaseConfig, null, 2)); -} diff --git a/scripts/release/versionsHistory.ts b/scripts/release/versionsHistory.ts new file mode 100644 index 0000000000..ba9bf6ab91 --- /dev/null +++ b/scripts/release/versionsHistory.ts @@ -0,0 +1,108 @@ +/* eslint-disable no-console */ +// @ts-nocheck this file is broken while the VersionsHistory is unclear +import fsp from 'fs/promises'; + +import semver from 'semver'; + +import { cloneRepository } from '../ci/utils.js'; +import { ensureGitHubToken, LANGUAGES, run, toAbsolutePath } from '../common.js'; +import type { Language } from '../types.js'; + +import { preReleaseRegExp } from './createReleasePR.js'; +import type { Version, Versions } from './types.js'; + +export function isPreRelease(version: string): boolean { + return ( + version.match(preReleaseRegExp) !== null || + semver.prerelease(version) !== null || + version.includes('beta') || + version.includes('alpha') || + version.startsWith('0') || + isNaN(parseInt(version.charAt(0), 10)) + ); +} + +// fetches the git tags on the given `lang` repository, throws if none. +async function getTags(lang: Language): Promise { + const githubToken = ensureGitHubToken(); + + // fetch all release tags for this lang + const { tempGitDir } = await cloneRepository({ + lang, + githubToken, + tempDir: process.env.RUNNER_TEMP! || toAbsolutePath('foo/local/test'), + }); + await run('git fetch --all --tags', { cwd: tempGitDir }); + + const tags = ( + await run("git for-each-ref --sort=creatordate --format '%(refname:short) %(creatordate)' refs/tags", { + cwd: tempGitDir, + }) + ).split('\n'); + + if (tags.length === 0) { + throw new Error(`unable to find tags for language ${lang}`); + } + + return tags; +} + +/* + * udpates the release.config.json file for the given `lang` by generating an VersionsHistory policy map of every versions in a now-2years window. + * the given `version` to release is added to the map once existing tags are computed. + * any pre-release and non-semver tags are excluded + */ +export function generateLanguageVersionsHistory( + tags: string[], + lang: Language, + version: Version, +): Record { + const versions: Record = {}; + + let prevTagVersion = ''; + + for (const tag of tags) { + // eslint-disable-next-line prefer-const + let [tagVersion, tagReleaseDate] = tag.split(/(?<=^\S+)\s/); + + // edge case for go which tags version with a v prefix + if (tagVersion.startsWith('v')) { + tagVersion = tagVersion.replace(/^v/, ''); + } + + // we skip any form of pre-releases because they are not part of the VersionsHistory + if (isPreRelease(tagVersion)) { + continue; + } + + versions[tagVersion] = { + releaseDate: new Date(tagReleaseDate).toISOString().split('T')[0], + }; + + prevTagVersion = tagVersion; + } + + // if there's no release planned, just skip this language + if (version?.next && !isPreRelease(version?.next) && version?.next !== prevTagVersion) { + versions[version.next] = { + releaseDate: new Date().toISOString().split('T')[0], + }; + } + + return versions; +} + +export async function generateVersionsHistory(versions: Versions): Promise { + const versionsHistory = {}; + await Promise.all( + LANGUAGES.map(async (lang) => { + console.log(`> generating VersionsHistory for the ${lang} client`); + + const tags = await getTags(lang); + + versionsHistory[lang] = generateLanguageVersionsHistory(tags, lang, versions[lang]); + }), + ); + + await fsp.writeFile(toAbsolutePath('config/versions.history.json'), JSON.stringify(versionsHistory, null, 2)); +} diff --git a/tests/output/csharp/src/generated/e2e/Insights.test.cs b/tests/output/csharp/src/generated/e2e/Insights.test.cs index 27d27231fc..eddd155d48 100644 --- a/tests/output/csharp/src/generated/e2e/Insights.test.cs +++ b/tests/output/csharp/src/generated/e2e/Insights.test.cs @@ -63,7 +63,7 @@ public async Task PushEventsTest1() Index = "products", UserToken = "user-123456", AuthenticatedUserToken = "user-123456", - Timestamp = 1727049600000L, + Timestamp = 1727308800000L, ObjectIDs = new List { "9780545139700", "9780439784542" }, QueryID = "43b15df305339e827f0ac0bdc5ebcaa7", } @@ -76,7 +76,7 @@ public async Task PushEventsTest1() Index = "products", UserToken = "user-123456", AuthenticatedUserToken = "user-123456", - Timestamp = 1727049600000L, + Timestamp = 1727308800000L, ObjectIDs = new List { "9780545139700", "9780439784542" }, } ), diff --git a/tests/output/csharp/src/generated/requests/Insights.test.cs b/tests/output/csharp/src/generated/requests/Insights.test.cs index 70f5e5aa68..b088cb78c9 100644 --- a/tests/output/csharp/src/generated/requests/Insights.test.cs +++ b/tests/output/csharp/src/generated/requests/Insights.test.cs @@ -580,7 +580,7 @@ await client.PushEventsAsync( Index = "products", UserToken = "user-123456", AuthenticatedUserToken = "user-123456", - Timestamp = 1727049600000L, + Timestamp = 1727308800000L, ObjectIDs = new List { "9780545139700", "9780439784542" }, QueryID = "43b15df305339e827f0ac0bdc5ebcaa7", } @@ -593,7 +593,7 @@ await client.PushEventsAsync( Index = "products", UserToken = "user-123456", AuthenticatedUserToken = "user-123456", - Timestamp = 1727049600000L, + Timestamp = 1727308800000L, ObjectIDs = new List { "9780545139700", "9780439784542" }, } ), @@ -605,7 +605,7 @@ await client.PushEventsAsync( Assert.Equal("/1/events", req.Path); Assert.Equal("POST", req.Method.ToString()); JsonAssert.EqualOverrideDefault( - "{\"events\":[{\"eventType\":\"conversion\",\"eventName\":\"Product Purchased\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727049600000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"],\"queryID\":\"43b15df305339e827f0ac0bdc5ebcaa7\"},{\"eventType\":\"view\",\"eventName\":\"Product Detail Page Viewed\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727049600000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"]}]}", + "{\"events\":[{\"eventType\":\"conversion\",\"eventName\":\"Product Purchased\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727308800000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"],\"queryID\":\"43b15df305339e827f0ac0bdc5ebcaa7\"},{\"eventType\":\"view\",\"eventName\":\"Product Detail Page Viewed\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727308800000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"]}]}", req.Body, new JsonDiffConfig(false) ); diff --git a/tests/output/dart/test/requests/insights_test.dart b/tests/output/dart/test/requests/insights_test.dart index a39b5f88a1..33776b8d1e 100644 --- a/tests/output/dart/test/requests/insights_test.dart +++ b/tests/output/dart/test/requests/insights_test.dart @@ -635,7 +635,7 @@ void main() { index: "products", userToken: "user-123456", authenticatedUserToken: "user-123456", - timestamp: 1727049600000, + timestamp: 1727308800000, objectIDs: [ "9780545139700", "9780439784542", @@ -648,7 +648,7 @@ void main() { index: "products", userToken: "user-123456", authenticatedUserToken: "user-123456", - timestamp: 1727049600000, + timestamp: 1727308800000, objectIDs: [ "9780545139700", "9780439784542", @@ -661,7 +661,7 @@ void main() { expectPath(request.path, '/1/events'); expect(request.method, 'post'); expectBody(request.body, - """{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"]}]}"""); + """{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"]}]}"""); }, ), ); diff --git a/tests/output/go/tests/e2e/insights_test.go b/tests/output/go/tests/e2e/insights_test.go index 78de3cbd38..6d6d463b5e 100644 --- a/tests/output/go/tests/e2e/insights_test.go +++ b/tests/output/go/tests/e2e/insights_test.go @@ -38,9 +38,9 @@ func TestInsightsE2E_PushEvents(t *testing.T) { insights.NewEmptyInsightsEvents().SetEvents( []insights.EventsItems{*insights.ConvertedObjectIDsAfterSearchAsEventsItems( - insights.NewEmptyConvertedObjectIDsAfterSearch().SetEventType(insights.ConversionEvent("conversion")).SetEventName("Product Purchased").SetIndex("products").SetUserToken("user-123456").SetAuthenticatedUserToken("user-123456").SetTimestamp(1727049600000).SetObjectIDs( + insights.NewEmptyConvertedObjectIDsAfterSearch().SetEventType(insights.ConversionEvent("conversion")).SetEventName("Product Purchased").SetIndex("products").SetUserToken("user-123456").SetAuthenticatedUserToken("user-123456").SetTimestamp(1727308800000).SetObjectIDs( []string{"9780545139700", "9780439784542"}).SetQueryID("43b15df305339e827f0ac0bdc5ebcaa7")), *insights.ViewedObjectIDsAsEventsItems( - insights.NewEmptyViewedObjectIDs().SetEventType(insights.ViewEvent("view")).SetEventName("Product Detail Page Viewed").SetIndex("products").SetUserToken("user-123456").SetAuthenticatedUserToken("user-123456").SetTimestamp(1727049600000).SetObjectIDs( + insights.NewEmptyViewedObjectIDs().SetEventType(insights.ViewEvent("view")).SetEventName("Product Detail Page Viewed").SetIndex("products").SetUserToken("user-123456").SetAuthenticatedUserToken("user-123456").SetTimestamp(1727308800000).SetObjectIDs( []string{"9780545139700", "9780439784542"}))}), )) require.NoError(t, err) diff --git a/tests/output/go/tests/requests/insights_test.go b/tests/output/go/tests/requests/insights_test.go index f64b4d0a81..cd905e9672 100644 --- a/tests/output/go/tests/requests/insights_test.go +++ b/tests/output/go/tests/requests/insights_test.go @@ -433,9 +433,9 @@ func TestInsights_PushEvents(t *testing.T) { insights.NewEmptyInsightsEvents().SetEvents( []insights.EventsItems{*insights.ConvertedObjectIDsAfterSearchAsEventsItems( - insights.NewEmptyConvertedObjectIDsAfterSearch().SetEventType(insights.ConversionEvent("conversion")).SetEventName("Product Purchased").SetIndex("products").SetUserToken("user-123456").SetAuthenticatedUserToken("user-123456").SetTimestamp(1727049600000).SetObjectIDs( + insights.NewEmptyConvertedObjectIDsAfterSearch().SetEventType(insights.ConversionEvent("conversion")).SetEventName("Product Purchased").SetIndex("products").SetUserToken("user-123456").SetAuthenticatedUserToken("user-123456").SetTimestamp(1727308800000).SetObjectIDs( []string{"9780545139700", "9780439784542"}).SetQueryID("43b15df305339e827f0ac0bdc5ebcaa7")), *insights.ViewedObjectIDsAsEventsItems( - insights.NewEmptyViewedObjectIDs().SetEventType(insights.ViewEvent("view")).SetEventName("Product Detail Page Viewed").SetIndex("products").SetUserToken("user-123456").SetAuthenticatedUserToken("user-123456").SetTimestamp(1727049600000).SetObjectIDs( + insights.NewEmptyViewedObjectIDs().SetEventType(insights.ViewEvent("view")).SetEventName("Product Detail Page Viewed").SetIndex("products").SetUserToken("user-123456").SetAuthenticatedUserToken("user-123456").SetTimestamp(1727308800000).SetObjectIDs( []string{"9780545139700", "9780439784542"}))}), )) require.NoError(t, err) @@ -444,7 +444,7 @@ func TestInsights_PushEvents(t *testing.T) { require.Equal(t, "POST", echo.Method) ja := jsonassert.New(t) - ja.Assertf(*echo.Body, `{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"]}]}`) + ja.Assertf(*echo.Body, `{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"]}]}`) }) t.Run("ConvertedObjectIDsAfterSearch", func(t *testing.T) { _, err := client.PushEvents(client.NewApiPushEventsRequest( diff --git a/tests/output/java/src/test/java/com/algolia/e2e/Insights.test.java b/tests/output/java/src/test/java/com/algolia/e2e/Insights.test.java index 72eea0977d..7660751680 100644 --- a/tests/output/java/src/test/java/com/algolia/e2e/Insights.test.java +++ b/tests/output/java/src/test/java/com/algolia/e2e/Insights.test.java @@ -50,7 +50,7 @@ void pushEventsTest1() { .setIndex("products") .setUserToken("user-123456") .setAuthenticatedUserToken("user-123456") - .setTimestamp(1727049600000L) + .setTimestamp(1727308800000L) .setObjectIDs(Arrays.asList("9780545139700", "9780439784542")) .setQueryID("43b15df305339e827f0ac0bdc5ebcaa7"), new ViewedObjectIDs() @@ -59,7 +59,7 @@ void pushEventsTest1() { .setIndex("products") .setUserToken("user-123456") .setAuthenticatedUserToken("user-123456") - .setTimestamp(1727049600000L) + .setTimestamp(1727308800000L) .setObjectIDs(Arrays.asList("9780545139700", "9780439784542")) ) ) diff --git a/tests/output/java/src/test/java/com/algolia/requests/Insights.test.java b/tests/output/java/src/test/java/com/algolia/requests/Insights.test.java index ddd38bdb35..6796719da2 100644 --- a/tests/output/java/src/test/java/com/algolia/requests/Insights.test.java +++ b/tests/output/java/src/test/java/com/algolia/requests/Insights.test.java @@ -720,7 +720,7 @@ void pushEventsTest1() { .setIndex("products") .setUserToken("user-123456") .setAuthenticatedUserToken("user-123456") - .setTimestamp(1727049600000L) + .setTimestamp(1727308800000L) .setObjectIDs(Arrays.asList("9780545139700", "9780439784542")) .setQueryID("43b15df305339e827f0ac0bdc5ebcaa7"), new ViewedObjectIDs() @@ -729,7 +729,7 @@ void pushEventsTest1() { .setIndex("products") .setUserToken("user-123456") .setAuthenticatedUserToken("user-123456") - .setTimestamp(1727049600000L) + .setTimestamp(1727308800000L) .setObjectIDs(Arrays.asList("9780545139700", "9780439784542")) ) ) @@ -741,9 +741,9 @@ void pushEventsTest1() { assertDoesNotThrow(() -> JSONAssert.assertEquals( "{\"events\":[{\"eventType\":\"conversion\",\"eventName\":\"Product" + - " Purchased\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727049600000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"],\"queryID\":\"43b15df305339e827f0ac0bdc5ebcaa7\"},{\"eventType\":\"view\",\"eventName\":\"Product" + + " Purchased\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727308800000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"],\"queryID\":\"43b15df305339e827f0ac0bdc5ebcaa7\"},{\"eventType\":\"view\",\"eventName\":\"Product" + " Detail Page" + - " Viewed\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727049600000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"]}]}", + " Viewed\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727308800000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"]}]}", req.body, JSONCompareMode.STRICT ) diff --git a/tests/output/javascript/src/e2e/insights.test.ts b/tests/output/javascript/src/e2e/insights.test.ts index 1d9ed0416f..b5914208fa 100644 --- a/tests/output/javascript/src/e2e/insights.test.ts +++ b/tests/output/javascript/src/e2e/insights.test.ts @@ -27,7 +27,7 @@ describe('pushEvents', () => { index: 'products', userToken: 'user-123456', authenticatedUserToken: 'user-123456', - timestamp: 1727049600000, + timestamp: 1727308800000, objectIDs: ['9780545139700', '9780439784542'], queryID: '43b15df305339e827f0ac0bdc5ebcaa7', }, @@ -37,7 +37,7 @@ describe('pushEvents', () => { index: 'products', userToken: 'user-123456', authenticatedUserToken: 'user-123456', - timestamp: 1727049600000, + timestamp: 1727308800000, objectIDs: ['9780545139700', '9780439784542'], }, ], diff --git a/tests/output/javascript/src/requests/insights.test.ts b/tests/output/javascript/src/requests/insights.test.ts index 0d7b1b94ed..8d9a5d61fb 100644 --- a/tests/output/javascript/src/requests/insights.test.ts +++ b/tests/output/javascript/src/requests/insights.test.ts @@ -308,7 +308,7 @@ describe('pushEvents', () => { index: 'products', userToken: 'user-123456', authenticatedUserToken: 'user-123456', - timestamp: 1727049600000, + timestamp: 1727308800000, objectIDs: ['9780545139700', '9780439784542'], queryID: '43b15df305339e827f0ac0bdc5ebcaa7', }, @@ -318,7 +318,7 @@ describe('pushEvents', () => { index: 'products', userToken: 'user-123456', authenticatedUserToken: 'user-123456', - timestamp: 1727049600000, + timestamp: 1727308800000, objectIDs: ['9780545139700', '9780439784542'], }, ], @@ -334,7 +334,7 @@ describe('pushEvents', () => { index: 'products', userToken: 'user-123456', authenticatedUserToken: 'user-123456', - timestamp: 1727049600000, + timestamp: 1727308800000, objectIDs: ['9780545139700', '9780439784542'], queryID: '43b15df305339e827f0ac0bdc5ebcaa7', }, @@ -344,7 +344,7 @@ describe('pushEvents', () => { index: 'products', userToken: 'user-123456', authenticatedUserToken: 'user-123456', - timestamp: 1727049600000, + timestamp: 1727308800000, objectIDs: ['9780545139700', '9780439784542'], }, ], diff --git a/tests/output/kotlin/src/commonTest/kotlin/com/algolia/e2e/InsightsTest.kt b/tests/output/kotlin/src/commonTest/kotlin/com/algolia/e2e/InsightsTest.kt index 98cee57c9c..28666b3454 100644 --- a/tests/output/kotlin/src/commonTest/kotlin/com/algolia/e2e/InsightsTest.kt +++ b/tests/output/kotlin/src/commonTest/kotlin/com/algolia/e2e/InsightsTest.kt @@ -41,7 +41,7 @@ class InsightsTest { index = "products", userToken = "user-123456", authenticatedUserToken = "user-123456", - timestamp = 1727049600000L, + timestamp = 1727308800000L, objectIDs = listOf("9780545139700", "9780439784542"), queryID = "43b15df305339e827f0ac0bdc5ebcaa7", ), @@ -51,7 +51,7 @@ class InsightsTest { index = "products", userToken = "user-123456", authenticatedUserToken = "user-123456", - timestamp = 1727049600000L, + timestamp = 1727308800000L, objectIDs = listOf("9780545139700", "9780439784542"), ), ), diff --git a/tests/output/kotlin/src/commonTest/kotlin/com/algolia/requests/InsightsTest.kt b/tests/output/kotlin/src/commonTest/kotlin/com/algolia/requests/InsightsTest.kt index 29c794cfa1..9256482ff1 100644 --- a/tests/output/kotlin/src/commonTest/kotlin/com/algolia/requests/InsightsTest.kt +++ b/tests/output/kotlin/src/commonTest/kotlin/com/algolia/requests/InsightsTest.kt @@ -529,7 +529,7 @@ class InsightsTest { index = "products", userToken = "user-123456", authenticatedUserToken = "user-123456", - timestamp = 1727049600000L, + timestamp = 1727308800000L, objectIDs = listOf("9780545139700", "9780439784542"), queryID = "43b15df305339e827f0ac0bdc5ebcaa7", ), @@ -539,7 +539,7 @@ class InsightsTest { index = "products", userToken = "user-123456", authenticatedUserToken = "user-123456", - timestamp = 1727049600000L, + timestamp = 1727308800000L, objectIDs = listOf("9780545139700", "9780439784542"), ), ), @@ -549,7 +549,7 @@ class InsightsTest { intercept = { assertEquals("/1/events".toPathSegments(), it.url.pathSegments) assertEquals(HttpMethod.parse("POST"), it.method) - assertJsonBody("""{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"]}]}""", it.body) + assertJsonBody("""{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"]}]}""", it.body) }, ) } diff --git a/tests/output/php/src/e2e/InsightsTest.php b/tests/output/php/src/e2e/InsightsTest.php index ecada8dbe4..41f0409ed0 100644 --- a/tests/output/php/src/e2e/InsightsTest.php +++ b/tests/output/php/src/e2e/InsightsTest.php @@ -35,7 +35,7 @@ public function testPushEvents1(): void 'index' => 'products', 'userToken' => 'user-123456', 'authenticatedUserToken' => 'user-123456', - 'timestamp' => 1727049600000, + 'timestamp' => 1727308800000, 'objectIDs' => [ '9780545139700', @@ -49,7 +49,7 @@ public function testPushEvents1(): void 'index' => 'products', 'userToken' => 'user-123456', 'authenticatedUserToken' => 'user-123456', - 'timestamp' => 1727049600000, + 'timestamp' => 1727308800000, 'objectIDs' => [ '9780545139700', diff --git a/tests/output/php/src/requests/InsightsTest.php b/tests/output/php/src/requests/InsightsTest.php index 344223f714..c404a635a9 100644 --- a/tests/output/php/src/requests/InsightsTest.php +++ b/tests/output/php/src/requests/InsightsTest.php @@ -527,7 +527,7 @@ public function testPushEvents1(): void 'index' => 'products', 'userToken' => 'user-123456', 'authenticatedUserToken' => 'user-123456', - 'timestamp' => 1727049600000, + 'timestamp' => 1727308800000, 'objectIDs' => [ '9780545139700', @@ -541,7 +541,7 @@ public function testPushEvents1(): void 'index' => 'products', 'userToken' => 'user-123456', 'authenticatedUserToken' => 'user-123456', - 'timestamp' => 1727049600000, + 'timestamp' => 1727308800000, 'objectIDs' => [ '9780545139700', @@ -556,7 +556,7 @@ public function testPushEvents1(): void [ 'path' => '/1/events', 'method' => 'POST', - 'body' => json_decode('{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"]}]}'), + 'body' => json_decode('{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"]}]}'), ], ]); } diff --git a/tests/output/python/tests/e2e/insights_test.py b/tests/output/python/tests/e2e/insights_test.py index 267015f759..d6bc82491a 100644 --- a/tests/output/python/tests/e2e/insights_test.py +++ b/tests/output/python/tests/e2e/insights_test.py @@ -36,7 +36,7 @@ async def test_push_events_1(self): "index": "products", "userToken": "user-123456", "authenticatedUserToken": "user-123456", - "timestamp": 1727049600000, + "timestamp": 1727308800000, "objectIDs": [ "9780545139700", "9780439784542", @@ -49,7 +49,7 @@ async def test_push_events_1(self): "index": "products", "userToken": "user-123456", "authenticatedUserToken": "user-123456", - "timestamp": 1727049600000, + "timestamp": 1727308800000, "objectIDs": [ "9780545139700", "9780439784542", @@ -71,7 +71,7 @@ async def test_push_events_1(self): "index": "products", "userToken": "user-123456", "authenticatedUserToken": "user-123456", - "timestamp": 1727049600000, + "timestamp": 1727308800000, "objectIDs": [ "9780545139700", "9780439784542", @@ -84,7 +84,7 @@ async def test_push_events_1(self): "index": "products", "userToken": "user-123456", "authenticatedUserToken": "user-123456", - "timestamp": 1727049600000, + "timestamp": 1727308800000, "objectIDs": [ "9780545139700", "9780439784542", @@ -127,7 +127,7 @@ def test_push_events_1(self): "index": "products", "userToken": "user-123456", "authenticatedUserToken": "user-123456", - "timestamp": 1727049600000, + "timestamp": 1727308800000, "objectIDs": [ "9780545139700", "9780439784542", @@ -140,7 +140,7 @@ def test_push_events_1(self): "index": "products", "userToken": "user-123456", "authenticatedUserToken": "user-123456", - "timestamp": 1727049600000, + "timestamp": 1727308800000, "objectIDs": [ "9780545139700", "9780439784542", @@ -162,7 +162,7 @@ def test_push_events_1(self): "index": "products", "userToken": "user-123456", "authenticatedUserToken": "user-123456", - "timestamp": 1727049600000, + "timestamp": 1727308800000, "objectIDs": [ "9780545139700", "9780439784542", @@ -175,7 +175,7 @@ def test_push_events_1(self): "index": "products", "userToken": "user-123456", "authenticatedUserToken": "user-123456", - "timestamp": 1727049600000, + "timestamp": 1727308800000, "objectIDs": [ "9780545139700", "9780439784542", diff --git a/tests/output/python/tests/requests/insights_test.py b/tests/output/python/tests/requests/insights_test.py index 1f8a61f90c..d2d2bb3129 100644 --- a/tests/output/python/tests/requests/insights_test.py +++ b/tests/output/python/tests/requests/insights_test.py @@ -463,7 +463,7 @@ async def test_push_events_1(self): "index": "products", "userToken": "user-123456", "authenticatedUserToken": "user-123456", - "timestamp": 1727049600000, + "timestamp": 1727308800000, "objectIDs": [ "9780545139700", "9780439784542", @@ -476,7 +476,7 @@ async def test_push_events_1(self): "index": "products", "userToken": "user-123456", "authenticatedUserToken": "user-123456", - "timestamp": 1727049600000, + "timestamp": 1727308800000, "objectIDs": [ "9780545139700", "9780439784542", @@ -491,7 +491,7 @@ async def test_push_events_1(self): assert _req.query_parameters.items() == {}.items() assert _req.headers.items() >= {}.items() assert loads(_req.data) == loads( - """{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"]}]}""" + """{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"]}]}""" ) async def test_push_events_2(self): @@ -1060,7 +1060,7 @@ def test_push_events_1(self): "index": "products", "userToken": "user-123456", "authenticatedUserToken": "user-123456", - "timestamp": 1727049600000, + "timestamp": 1727308800000, "objectIDs": [ "9780545139700", "9780439784542", @@ -1073,7 +1073,7 @@ def test_push_events_1(self): "index": "products", "userToken": "user-123456", "authenticatedUserToken": "user-123456", - "timestamp": 1727049600000, + "timestamp": 1727308800000, "objectIDs": [ "9780545139700", "9780439784542", @@ -1088,7 +1088,7 @@ def test_push_events_1(self): assert _req.query_parameters.items() == {}.items() assert _req.headers.items() >= {}.items() assert loads(_req.data) == loads( - """{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"]}]}""" + """{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"]}]}""" ) def test_push_events_2(self): diff --git a/tests/output/ruby/test/e2e/insights_test.rb b/tests/output/ruby/test/e2e/insights_test.rb index e88ac85248..2582c309df 100644 --- a/tests/output/ruby/test/e2e/insights_test.rb +++ b/tests/output/ruby/test/e2e/insights_test.rb @@ -28,7 +28,7 @@ def test_push_events1 index: "products", user_token: "user-123456", authenticated_user_token: "user-123456", - timestamp: 1727049600000, + timestamp: 1727308800000, object_ids: ["9780545139700", "9780439784542"], query_id: "43b15df305339e827f0ac0bdc5ebcaa7" ), @@ -38,7 +38,7 @@ def test_push_events1 index: "products", user_token: "user-123456", authenticated_user_token: "user-123456", - timestamp: 1727049600000, + timestamp: 1727308800000, object_ids: ["9780545139700", "9780439784542"] ) ] @@ -55,7 +55,7 @@ def test_push_events1 index: "products", user_token: "user-123456", authenticated_user_token: "user-123456", - timestamp: 1727049600000, + timestamp: 1727308800000, object_ids: ["9780545139700", "9780439784542"], query_id: "43b15df305339e827f0ac0bdc5ebcaa7" ), @@ -65,7 +65,7 @@ def test_push_events1 index: "products", user_token: "user-123456", authenticated_user_token: "user-123456", - timestamp: 1727049600000, + timestamp: 1727308800000, object_ids: ["9780545139700", "9780439784542"] ) ] diff --git a/tests/output/ruby/test/requests/insights_test.rb b/tests/output/ruby/test/requests/insights_test.rb index c15604fb32..8e6830a847 100644 --- a/tests/output/ruby/test/requests/insights_test.rb +++ b/tests/output/ruby/test/requests/insights_test.rb @@ -338,7 +338,7 @@ def test_push_events1 index: "products", user_token: "user-123456", authenticated_user_token: "user-123456", - timestamp: 1727049600000, + timestamp: 1727308800000, object_ids: ["9780545139700", "9780439784542"], query_id: "43b15df305339e827f0ac0bdc5ebcaa7" ), @@ -348,7 +348,7 @@ def test_push_events1 index: "products", user_token: "user-123456", authenticated_user_token: "user-123456", - timestamp: 1727049600000, + timestamp: 1727308800000, object_ids: ["9780545139700", "9780439784542"] ) ] @@ -361,7 +361,7 @@ def test_push_events1 assert(({}.to_a - req.headers.to_a).empty?, req.headers.to_s) assert_equal( JSON.parse( - "{\"events\":[{\"eventType\":\"conversion\",\"eventName\":\"Product Purchased\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727049600000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"],\"queryID\":\"43b15df305339e827f0ac0bdc5ebcaa7\"},{\"eventType\":\"view\",\"eventName\":\"Product Detail Page Viewed\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727049600000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"]}]}" + "{\"events\":[{\"eventType\":\"conversion\",\"eventName\":\"Product Purchased\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727308800000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"],\"queryID\":\"43b15df305339e827f0ac0bdc5ebcaa7\"},{\"eventType\":\"view\",\"eventName\":\"Product Detail Page Viewed\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727308800000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"]}]}" ), JSON.parse(req.body) ) diff --git a/tests/output/scala/src/test/scala/algoliasearch/e2e/InsightsTest.scala b/tests/output/scala/src/test/scala/algoliasearch/e2e/InsightsTest.scala index e21e9a834d..fa78554527 100644 --- a/tests/output/scala/src/test/scala/algoliasearch/e2e/InsightsTest.scala +++ b/tests/output/scala/src/test/scala/algoliasearch/e2e/InsightsTest.scala @@ -49,7 +49,7 @@ class InsightsTestE2E extends AnyFunSuite { index = "products", userToken = "user-123456", authenticatedUserToken = Some("user-123456"), - timestamp = Some(1727049600000L), + timestamp = Some(1727308800000L), objectIDs = Seq("9780545139700", "9780439784542"), queryID = "43b15df305339e827f0ac0bdc5ebcaa7" ), @@ -59,7 +59,7 @@ class InsightsTestE2E extends AnyFunSuite { index = "products", userToken = "user-123456", authenticatedUserToken = Some("user-123456"), - timestamp = Some(1727049600000L), + timestamp = Some(1727308800000L), objectIDs = Seq("9780545139700", "9780439784542") ) ) diff --git a/tests/output/scala/src/test/scala/algoliasearch/requests/InsightsTest.scala b/tests/output/scala/src/test/scala/algoliasearch/requests/InsightsTest.scala index 876b817270..5211d61218 100644 --- a/tests/output/scala/src/test/scala/algoliasearch/requests/InsightsTest.scala +++ b/tests/output/scala/src/test/scala/algoliasearch/requests/InsightsTest.scala @@ -574,7 +574,7 @@ class InsightsTest extends AnyFunSuite { index = "products", userToken = "user-123456", authenticatedUserToken = Some("user-123456"), - timestamp = Some(1727049600000L), + timestamp = Some(1727308800000L), objectIDs = Seq("9780545139700", "9780439784542"), queryID = "43b15df305339e827f0ac0bdc5ebcaa7" ), @@ -584,7 +584,7 @@ class InsightsTest extends AnyFunSuite { index = "products", userToken = "user-123456", authenticatedUserToken = Some("user-123456"), - timestamp = Some(1727049600000L), + timestamp = Some(1727308800000L), objectIDs = Seq("9780545139700", "9780439784542") ) ) @@ -597,7 +597,7 @@ class InsightsTest extends AnyFunSuite { assert(res.path == "/1/events") assert(res.method == "POST") val expectedBody = parse( - """{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727049600000,"objectIDs":["9780545139700","9780439784542"]}]}""" + """{"events":[{"eventType":"conversion","eventName":"Product Purchased","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"],"queryID":"43b15df305339e827f0ac0bdc5ebcaa7"},{"eventType":"view","eventName":"Product Detail Page Viewed","index":"products","userToken":"user-123456","authenticatedUserToken":"user-123456","timestamp":1727308800000,"objectIDs":["9780545139700","9780439784542"]}]}""" ) val actualBody = parse(res.body.get) assert(actualBody == expectedBody) diff --git a/tests/output/swift/Tests/e2e/InsightsTests.swift b/tests/output/swift/Tests/e2e/InsightsTests.swift index 7b121c95d6..870efd7fab 100644 --- a/tests/output/swift/Tests/e2e/InsightsTests.swift +++ b/tests/output/swift/Tests/e2e/InsightsTests.swift @@ -65,7 +65,7 @@ final class InsightsClientRequestsTestsE2E: XCTestCase { queryID: "43b15df305339e827f0ac0bdc5ebcaa7", userToken: "user-123456", authenticatedUserToken: "user-123456", - timestamp: Int64(1_727_049_600_000) + timestamp: Int64(1_727_308_800_000) )), EventsItems.viewedObjectIDs(ViewedObjectIDs( eventName: "Product Detail Page Viewed", @@ -74,7 +74,7 @@ final class InsightsClientRequestsTestsE2E: XCTestCase { objectIDs: ["9780545139700", "9780439784542"], userToken: "user-123456", authenticatedUserToken: "user-123456", - timestamp: Int64(1_727_049_600_000) + timestamp: Int64(1_727_308_800_000) )), ])) let responseBody = try XCTUnwrap(response.body) diff --git a/tests/output/swift/Tests/requests/InsightsTests.swift b/tests/output/swift/Tests/requests/InsightsTests.swift index 722d7cdaab..c5b1527042 100644 --- a/tests/output/swift/Tests/requests/InsightsTests.swift +++ b/tests/output/swift/Tests/requests/InsightsTests.swift @@ -785,7 +785,7 @@ final class InsightsClientRequestsTests: XCTestCase { queryID: "43b15df305339e827f0ac0bdc5ebcaa7", userToken: "user-123456", authenticatedUserToken: "user-123456", - timestamp: Int64(1_727_049_600_000) + timestamp: Int64(1_727_308_800_000) )), EventsItems.viewedObjectIDs(ViewedObjectIDs( eventName: "Product Detail Page Viewed", @@ -794,7 +794,7 @@ final class InsightsClientRequestsTests: XCTestCase { objectIDs: ["9780545139700", "9780439784542"], userToken: "user-123456", authenticatedUserToken: "user-123456", - timestamp: Int64(1_727_049_600_000) + timestamp: Int64(1_727_308_800_000) )), ])) let responseBodyData = try XCTUnwrap(response.bodyData) @@ -804,7 +804,7 @@ final class InsightsClientRequestsTests: XCTestCase { let echoResponseBodyJSON = try XCTUnwrap(echoResponseBodyData.jsonString) let expectedBodyData = - "{\"events\":[{\"eventType\":\"conversion\",\"eventName\":\"Product Purchased\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727049600000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"],\"queryID\":\"43b15df305339e827f0ac0bdc5ebcaa7\"},{\"eventType\":\"view\",\"eventName\":\"Product Detail Page Viewed\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727049600000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"]}]}" + "{\"events\":[{\"eventType\":\"conversion\",\"eventName\":\"Product Purchased\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727308800000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"],\"queryID\":\"43b15df305339e827f0ac0bdc5ebcaa7\"},{\"eventType\":\"view\",\"eventName\":\"Product Detail Page Viewed\",\"index\":\"products\",\"userToken\":\"user-123456\",\"authenticatedUserToken\":\"user-123456\",\"timestamp\":1727308800000,\"objectIDs\":[\"9780545139700\",\"9780439784542\"]}]}" .data(using: .utf8) let expectedBodyJSON = try XCTUnwrap(expectedBodyData?.jsonString)