diff --git a/data/wp_versions.json b/data/wp_versions.json new file mode 100644 index 0000000000..ffc6b32ade --- /dev/null +++ b/data/wp_versions.json @@ -0,0 +1,1289 @@ +{ + "$schema": "../static/schema/wp_versions.json", + "versions": [ + { + "name": "5.1", + "releaseDate": "4 November 2025", + "generalEndDate": "20 August 2026", + "securityEndDate": "20 August 2026", + "improvementsandnewfeaturesEndDate": "21 April 2026", + "isLTS": false, + "isRolling": true, + "releases": [ + { + "name": "5.1.0", + "releaseDate": "4 November 2025", + "version": 2025110400, + "upgradePath": "https://docs.moodle.org/501/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/501/en/Moodle_Workplace_rolling_release_notes" + }, + { + "name": "5.1.1", + "releaseDate": "9 December 2025", + "version": 2025110410, + "releaseNoteUrl": "https://docs.moodle.org/501/en/Moodle_Workplace_rolling_release_notes#5.1.1_rolling" + }, + { + "name": "5.1.3", + "releaseDate": "13 February 2026", + "version": 2026021300, + "releaseNoteUrl": false + } + ] + }, + { + "name": "5.1", + "releaseDate": "4 November 2025", + "generalEndDate": "6 October 2026", + "securityEndDate": "6 April 2027", + "improvementsandnewfeaturesEndDate": "", + "isLTS": false, + "isRolling": false, + "releases": [ + { + "name": "5.1.0", + "releaseDate": "4 November 2025", + "version": 2025110400, + "upgradePath": "https://docs.moodle.org/501/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/501/en/Moodle_Workplace_release_notes" + }, + { + "name": "5.1.1", + "releaseDate": "9 December 2025", + "version": 2025110410, + "releaseNoteUrl": "https://docs.moodle.org/501/en/Moodle_Workplace_release_notes#5.1.1" + }, + { + "name": "5.1.3", + "releaseDate": "13 February 2026", + "version": 2026021300, + "releaseNoteUrl": false + } + ] + }, + { + "name": "5.0", + "releaseDate": "13 May 2025", + "generalEndDate": "10 February 2026", + "securityEndDate": "10 February 2026", + "improvementsandnewfeaturesEndDate": "7 October 2025", + "isLTS": false, + "isRolling": true, + "releases": [ + { + "name": "5.0.0", + "releaseDate": "13 May 2025", + "version": 2025051300, + "upgradePath": "https://docs.moodle.org/500/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/500/en/Moodle_Workplace_rolling_release_notes" + }, + { + "name": "5.0.1", + "releaseDate": "10 June 2025", + "version": 2025061000, + "releaseNoteUrl": "https://docs.moodle.org/500/en/Moodle_Workplace_rolling_release_notes#5.0.1_rolling" + }, + { + "name": "5.0.2", + "releaseDate": "12 August 2025", + "version": 2025081200, + "releaseNoteUrl": "https://docs.moodle.org/500/en/Moodle_Workplace_rolling_release_notes#5.0.2_rolling" + }, + { + "name": "5.0.3", + "releaseDate": "7 October 2025", + "version": 2025092210, + "releaseNoteUrl": "https://docs.moodle.org/500/en/Moodle_Workplace_rolling_release_notes#5.0.3_rolling" + }, + { + "name": "5.0.4", + "releaseDate": "9 December 2025", + "version": 2025092220, + "releaseNoteUrl": "https://docs.moodle.org/500/en/Moodle_Workplace_rolling_release_notes#5.0.4_rolling" + }, + { + "name": "5.0.6", + "releaseDate": "13 February 2026", + "version": 2025092236, + "releaseNoteUrl": false + } + ] + }, + { + "name": "5.0", + "releaseDate": "13 May 2025", + "generalEndDate": "21 April 2026", + "securityEndDate": "6 October 2026", + "improvementsandnewfeaturesEndDate": "", + "isLTS": false, + "isRolling": false, + "releases": [ + { + "name": "5.0.0", + "releaseDate": "13 May 2025", + "version": 2025051300, + "upgradePath": "https://docs.moodle.org/500/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/500/en/Moodle_Workplace_release_notes" + }, + { + "name": "5.0.1", + "releaseDate": "10 June 2025", + "version": 2025051310, + "releaseNoteUrl": "https://docs.moodle.org/500/en/Moodle_Workplace_release_notes#5.0.1" + }, + { + "name": "5.0.2", + "releaseDate": "12 August 2025", + "version": 2025051320, + "releaseNoteUrl": "https://docs.moodle.org/500/en/Moodle_Workplace_release_notes#5.0.2" + }, + { + "name": "5.0.3", + "releaseDate": "7 October 2025", + "version": 2025051330, + "releaseNoteUrl": "https://docs.moodle.org/500/en/Moodle_Workplace_release_notes#5.0.3" + }, + { + "name": "5.0.4", + "releaseDate": "9 December 2025", + "version": 2025051340, + "releaseNoteUrl": "https://docs.moodle.org/500/en/Moodle_Workplace_release_notes#5.0.4" + }, + { + "name": "5.0.6", + "releaseDate": "13 February 2026", + "version": 2025051356, + "releaseNoteUrl": false + } + ] + }, + { + "name": "4.5", + "releaseDate": "5 November 2024", + "generalEndDate": "4 November 2025", + "securityEndDate": "4 November 2025", + "improvementsandnewfeaturesEndDate": "4 March 2025", + "isLTS": false, + "isRolling": true, + "releases": [ + { + "name": "4.5.0", + "releaseDate": "5 November 2024", + "version": 2024110500, + "upgradePath": "https://docs.moodle.org/405/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_rolling_release_notes" + }, + { + "name": "4.5.1", + "releaseDate": "10 December 2024", + "version": 2024121000, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_rolling_release_notes#4.5.1_rolling" + }, + { + "name": "4.5.2", + "releaseDate": "11 February 2025", + "version": 2025021100, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_rolling_release_notes#4.5.2_rolling" + }, + { + "name": "4.5.3", + "releaseDate": "18 March 2025", + "version": 2025031800, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_rolling_release_notes#4.5.3_rolling" + }, + { + "name": "4.5.4", + "releaseDate": "15 April 2025", + "version": 2025033110, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_rolling_release_notes#4.5.4_rolling" + }, + { + "name": "4.5.5", + "releaseDate": "10 June 2025", + "version": 2025033120, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_rolling_release_notes#4.5.5_rolling" + }, + { + "name": "4.5.6", + "releaseDate": "12 August 2025", + "version": 2025033130, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_rolling_release_notes#4.5.6_rolling" + } + ] + }, + { + "name": "4.5", + "releaseDate": "5 November 2024", + "generalEndDate": "7 October 2025", + "securityEndDate": "5 October 2027", + "improvementsandnewfeaturesEndDate": "", + "isLTS": true, + "isRolling": false, + "releases": [ + { + "name": "4.5.0", + "releaseDate": "5 November 2024", + "version": 2024110500, + "upgradePath": "https://docs.moodle.org/405/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_release_notes" + }, + { + "name": "4.5.1", + "releaseDate": "10 December 2024", + "version": 2024110510, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_release_notes#4.5.1" + }, + { + "name": "4.5.2", + "releaseDate": "11 February 2025", + "version": 2024110520, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_release_notes#4.5.2" + }, + { + "name": "4.5.3", + "releaseDate": "18 March 2025", + "version": 2024110530, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_release_notes#4.5.3" + }, + { + "name": "4.5.4", + "releaseDate": "14 April 2025", + "version": 2024110540, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_release_notes#4.5.4" + }, + { + "name": "4.5.5", + "releaseDate": "10 June 2025", + "version": 2024110550, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_release_notes#4.5.5" + }, + { + "name": "4.5.6", + "releaseDate": "12 August 2025", + "version": 2024110560, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_release_notes#4.5.6" + }, + { + "name": "4.5.7", + "releaseDate": "7 October 2025", + "version": 2024110570, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_release_notes#4.5.7" + }, + { + "name": "4.5.8", + "releaseDate": "9 December 2025", + "version": 2024110580, + "releaseNoteUrl": "https://docs.moodle.org/405/en/Moodle_Workplace_release_notes#4.5.8" + } + ] + }, + { + "name": "4.4", + "releaseDate": "21 May 2024", + "generalEndDate": "20 May 2025", + "securityEndDate": "20 November 2025", + "improvementsandnewfeaturesEndDate": "20 September 2024", + "isLTS": false, + "isRolling": true, + "releases": [ + { + "name": "4.4.0", + "releaseDate": "21 May 2024", + "version": 2024052100, + "upgradePath": "https://docs.moodle.org/404/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_rolling_release_notes" + }, + { + "name": "4.4.1", + "releaseDate": "11 June 2024", + "version": 2024061100, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_rolling_release_notes#4.4.1_rolling" + }, + { + "name": "4.4.2", + "releaseDate": "13 August 2024", + "version": 2024081300, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_rolling_release_notes#4.4.2_rolling" + }, + { + "name": "4.4.3", + "releaseDate": "3 September 2024", + "version": 2024090300, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_rolling_release_notes#4.4.3_rolling" + }, + { + "name": "4.4.4", + "releaseDate": "8 October 2024", + "version": 2024093010, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_rolling_release_notes#4.4.4_rolling" + }, + { + "name": "4.4.5", + "releaseDate": "10 December 2024", + "version": 2024093020, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_rolling_release_notes#4.4.5_rolling" + }, + { + "name": "4.4.6", + "releaseDate": "11 February 2025", + "version": 2024093030, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_rolling_release_notes#4.4.6_rolling" + } + ] + }, + { + "name": "4.4", + "releaseDate": "21 May 2024", + "generalEndDate": "20 May 2025", + "securityEndDate": "20 November 2025", + "improvementsandnewfeaturesEndDate": "", + "isLTS": false, + "isRolling": false, + "releases": [ + { + "name": "4.4.0", + "releaseDate": "21 May 2024", + "version": 2024052100, + "upgradePath": "https://docs.moodle.org/404/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes" + }, + { + "name": "4.4.1", + "releaseDate": "11 June 2024", + "version": 2024052110, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes#4.4.1" + }, + { + "name": "4.4.2", + "releaseDate": "13 August 2024", + "version": 2024052120, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes#4.4.2" + }, + { + "name": "4.4.3", + "releaseDate": "3 September 2024", + "version": 2024052130, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes#4.4.3" + }, + { + "name": "4.4.4", + "releaseDate": "8 October 2024", + "version": 2024052140, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes#4.4.4" + }, + { + "name": "4.4.5", + "releaseDate": "10 December 2024", + "version": 2024052150, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes#4.4.5" + }, + { + "name": "4.4.6", + "releaseDate": "11 February 2025", + "version": 2024052160, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes#4.4.6" + }, + { + "name": "4.4.7", + "releaseDate": "18 March 2025", + "version": 2024052170, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes#4.4.7" + }, + { + "name": "4.4.8", + "releaseDate": "15 April 2025", + "version": 2024052180, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes#4.4.8" + }, + { + "name": "4.4.9", + "releaseDate": "10 June 2025", + "version": 2024052190, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes#4.4.9" + }, + { + "name": "4.4.10", + "releaseDate": "12 August 2025", + "version": 2024052200, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes#4.4.10" + }, + { + "name": "4.4.11", + "releaseDate": "7 October 2025", + "version": 2024052210, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes#4.4.11" + }, + { + "name": "4.4.12", + "releaseDate": "9 December 2025", + "version": 2024052220, + "releaseNoteUrl": "https://docs.moodle.org/404/en/Moodle_Workplace_release_notes#4.4.12" + } + ] + }, + { + "name": "4.3", + "releaseDate": "9 November 2023", + "generalEndDate": "8 November 2024", + "securityEndDate": "8 May 2025", + "improvementsandnewfeaturesEndDate": "8 March 2024", + "isLTS": false, + "isRolling": true, + "releases": [ + { + "name": "4.3.0", + "releaseDate": "9 November 2023", + "version": 2023110900, + "upgradePath": "https://docs.moodle.org/403/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_rolling_release_notes" + }, + { + "name": "4.3.1", + "releaseDate": "12 December 2023", + "version": 2023121200, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_rolling_release_notes#4.3.1_rolling" + }, + { + "name": "4.3.2", + "releaseDate": "28 December 2023", + "version": 2023122800, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_rolling_release_notes#4.3.2_rolling" + }, + { + "name": "4.3.3", + "releaseDate": "13 February 2024", + "version": 2024021300, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_rolling_release_notes#4.3.3_rolling" + }, + { + "name": "4.3.4", + "releaseDate": "23 April 2024", + "version": 2024041510, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_rolling_release_notes#4.3.4_rolling" + }, + { + "name": "4.3.5", + "releaseDate": "11 June 2024", + "version": 2024041520, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_rolling_release_notes#4.3.5_rolling" + }, + { + "name": "4.3.6", + "releaseDate": "13 August 2024", + "version": 2024041530, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_rolling_release_notes#4.3.6_rolling" + } + ] + }, + { + "name": "4.3", + "releaseDate": "9 November 2023", + "generalEndDate": "8 November 2024", + "securityEndDate": "8 May 2025", + "improvementsandnewfeaturesEndDate": "", + "isLTS": false, + "isRolling": false, + "releases": [ + { + "name": "4.3.0", + "releaseDate": "9 November 2023", + "version": 2023110900, + "upgradePath": "https://docs.moodle.org/403/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes" + }, + { + "name": "4.3.1", + "releaseDate": "12 December 2023", + "version": 2023110910, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes#4.3.1" + }, + { + "name": "4.3.2", + "releaseDate": "28 December 2023", + "version": 2023110920, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes#4.3.2" + }, + { + "name": "4.3.3", + "releaseDate": "13 February 2024", + "version": 2023110930, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes#4.3.3" + }, + { + "name": "4.3.4", + "releaseDate": "23 April 2024", + "version": 2023110940, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes#4.3.4" + }, + { + "name": "4.3.5", + "releaseDate": "11 June 2024", + "version": 2023110950, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes#4.3.5" + }, + { + "name": "4.3.6", + "releaseDate": "13 August 2024", + "version": 2023110960, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes#4.3.6" + }, + { + "name": "4.3.7", + "releaseDate": "3 September 2024", + "version": 2023110970, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes#4.3.7" + }, + { + "name": "4.3.8", + "releaseDate": "8 October 2024", + "version": 2023110980, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes#4.3.8" + }, + { + "name": "4.3.9", + "releaseDate": "10 December 2024", + "version": 2023110990, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes#4.3.9" + }, + { + "name": "4.3.10", + "releaseDate": "11 February 2025", + "version": 2023111000, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes#4.3.10" + }, + { + "name": "4.3.11", + "releaseDate": "18 March 2025", + "version": 2023111010, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes#4.3.11" + }, + { + "name": "4.3.12", + "releaseDate": "15 April 2025", + "version": 2023111020, + "releaseNoteUrl": "https://docs.moodle.org/403/en/Moodle_Workplace_release_notes#4.3.12" + } + ] + }, + { + "name": "4.2", + "releaseDate": "30 May 2023", + "generalEndDate": "29 May 2024", + "securityEndDate": "29 November 2024", + "improvementsandnewfeaturesEndDate": "29 September 2023", + "isLTS": false, + "isRolling": true, + "releases": [ + { + "name": "4.2.0", + "releaseDate": "30 May 2023", + "version": 2023053000, + "upgradePath": "https://docs.moodle.org/402/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_rolling_release_notes" + }, + { + "name": "4.2.1", + "releaseDate": "13 June 2023", + "version": 2023061300, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_rolling_release_notes#4.2.1" + }, + { + "name": "4.2.2", + "releaseDate": "22 August 2023", + "version": 2023082200, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_rolling_release_notes#4.2.2_rolling" + }, + { + "name": "4.2.3", + "releaseDate": "10 October 2023", + "version": 2023101000, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_rolling_release_notes#4.2.3_rolling" + }, + { + "name": "4.2.4", + "releaseDate": "12 December 2023", + "version": 2023101010, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_rolling_release_notes#4.2.4_rolling" + }, + { + "name": "4.2.5", + "releaseDate": "28 December 2023", + "version": 2023101020, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_rolling_release_notes#4.2.5_rolling" + }, + { + "name": "4.2.6", + "releaseDate": "14 February 2024", + "version": 2023101030, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_rolling_release_notes#4.2.6_rolling" + } + ] + }, + { + "name": "4.2", + "releaseDate": "30 May 2023", + "generalEndDate": "29 May 2024", + "securityEndDate": "29 November 2024", + "improvementsandnewfeaturesEndDate": "", + "isLTS": false, + "isRolling": false, + "releases": [ + { + "name": "4.2.0", + "releaseDate": "30 May 2023", + "version": 2023053000, + "upgradePath": "https://docs.moodle.org/402/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_release_notes" + }, + { + "name": "4.2.1", + "releaseDate": "13 June 2023", + "version": 2023053010, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_release_notes#4.2.1" + }, + { + "name": "4.2.2", + "releaseDate": "22 August 2023", + "version": 2023053020, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_release_notes#4.2.2" + }, + { + "name": "4.2.3", + "releaseDate": "10 October 2023", + "version": 2023053030, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_release_notes#4.2.3" + }, + { + "name": "4.2.4", + "releaseDate": "12 December 2023", + "version": 2023053040, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_release_notes#4.2.4" + }, + { + "name": "4.2.5", + "releaseDate": "28 December 2023", + "version": 2023053050, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_release_notes#4.2.5" + }, + { + "name": "4.2.6", + "releaseDate": "13 February 2024", + "version": 2023053060, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_release_notes#4.2.6" + }, + { + "name": "4.2.7", + "releaseDate": "23 April 2024", + "version": 2023053070, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_release_notes#4.2.7" + }, + { + "name": "4.2.8", + "releaseDate": "11 June 2024", + "version": 2023053080, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_release_notes#4.2.8" + }, + { + "name": "4.2.9", + "releaseDate": "13 August 2024", + "version": 2023053090, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_release_notes#4.2.9" + }, + { + "name": "4.2.10", + "releaseDate": "3 September 2024", + "version": 2023053100, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_release_notes#4.2.10" + }, + { + "name": "4.2.11", + "releaseDate": "8 October 2024", + "version": 2023053110, + "releaseNoteUrl": "https://docs.moodle.org/402/en/Moodle_Workplace_release_notes#4.2.11" + } + ] + }, + { + "name": "4.1", + "releaseDate": "11 January 2023", + "generalEndDate": "10 January 2024", + "securityEndDate": "10 July 2024", + "improvementsandnewfeaturesEndDate": "10 May 2023", + "isLTS": false, + "isRolling": true, + "releases": [ + { + "name": "4.1.0", + "releaseDate": "11 January 2023", + "version": 2023011100, + "upgradePath": "https://docs.moodle.org/401/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes" + }, + { + "name": "4.1.1", + "releaseDate": "17 January 2023", + "version": 2023011700, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.1" + }, + { + "name": "4.1.2", + "releaseDate": "14 March 2023", + "version": 2023031400, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.2" + }, + { + "name": "4.1.3", + "releaseDate": "25 April 2023", + "version": 2023042500, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.3" + }, + { + "name": "4.1.4", + "releaseDate": "13 June 2023", + "version": 2023042510, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.4" + }, + { + "name": "4.1.5", + "releaseDate": "22 August 2023", + "version": 2023042520, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.5" + } + ] + }, + { + "name": "4.1", + "releaseDate": "11 January 2023", + "generalEndDate": "10 January 2024", + "securityEndDate": "10 January 2026", + "improvementsandnewfeaturesEndDate": "", + "isLTS": true, + "isRolling": false, + "releases": [ + { + "name": "4.1.0", + "releaseDate": "11 January 2023", + "version": 2023011100, + "upgradePath": "https://docs.moodle.org/401/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes" + }, + { + "name": "4.1.1", + "releaseDate": "17 January 2023", + "version": 2023011110, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.1" + }, + { + "name": "4.1.2", + "releaseDate": "14 March 2001", + "version": 2023011120, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.2" + }, + { + "name": "4.1.3", + "releaseDate": "25 April 2023", + "version": 2023011130, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.3" + }, + { + "name": "4.1.4", + "releaseDate": "13 June 2023", + "version": 2023011140, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.4" + }, + { + "name": "4.1.5", + "releaseDate": "22 August 2023", + "version": 2023011150, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.5" + }, + { + "name": "4.1.6", + "releaseDate": "10 October 2023", + "version": 2023011160, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.6" + }, + { + "name": "4.1.7", + "releaseDate": "12 December 2023", + "version": 2023011170, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.7" + }, + { + "name": "4.1.8", + "releaseDate": "23 December 2023", + "version": 2023011180, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.8" + }, + { + "name": "4.1.9", + "releaseDate": "13 February 2023", + "version": 2023011190, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.9" + }, + { + "name": "4.1.10", + "releaseDate": "23 April 2024", + "version": 2023011200, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.10" + }, + { + "name": "4.1.11", + "releaseDate": "11 June 2024", + "version": 2023011210, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.11" + }, + { + "name": "4.1.12", + "releaseDate": "13 August 2024", + "version": 2023011220, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.12" + }, + { + "name": "4.1.13", + "releaseDate": "3 September 2024", + "version": 2023011230, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.13" + }, + { + "name": "4.1.14", + "releaseDate": "8 October 2024", + "version": 2023011240, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.14" + }, + { + "name": "4.1.15", + "releaseDate": "13 December 2024", + "version": 2023011250, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.15" + }, + { + "name": "4.1.16", + "releaseDate": "11 February 2025", + "version": 2023011260, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.16" + }, + { + "name": "4.1.17", + "releaseDate": "18 March 2025", + "version": 2023011270, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.17" + }, + { + "name": "4.1.18", + "releaseDate": "15 April 2025", + "version": 2023011280, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.18" + }, + { + "name": "4.1.19", + "releaseDate": "10 June 2025", + "version": 2023011290, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.19" + }, + { + "name": "4.1.20", + "releaseDate": "12 August 2025", + "version": 2023011300, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.20" + }, + { + "name": "4.1.21", + "releaseDate": "7 October 2025", + "version": 2023011310, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.21" + }, + { + "name": "4.1.22", + "releaseDate": "9 December 2025", + "version": 2023011320, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.1_release_notes#4.1.22" + } + ] + }, + { + "name": "4.0", + "releaseDate": "14 October 2022", + "generalEndDate": "13 October 2023", + "securityEndDate": "13 April 2024", + "improvementsandnewfeaturesEndDate": "", + "isLTS": false, + "isRolling": false, + "releases": [ + { + "name": "4.0.0", + "releaseDate": "14 October 2022", + "version": 2022101400, + "upgradePath": "https://docs.moodle.org/400/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.0_release_notes" + }, + { + "name": "4.0.5", + "releaseDate": "15 November 2022", + "version": 2022111500, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.0_release_notes#4.0.5" + }, + { + "name": "4.0.6", + "releaseDate": "17 January 2023", + "version": 2022112810, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.0_release_notes#4.0.6" + }, + { + "name": "4.0.7", + "releaseDate": "14 March 2023", + "version": 2022112811, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.0_release_notes#4.0.7" + }, + { + "name": "4.0.8", + "releaseDate": "25 April 2023", + "version": 2022112812, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.0_release_notes#4.0.8" + }, + { + "name": "4.0.9", + "releaseDate": "13 June 2023", + "version": 2022112840, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.0_release_notes#4.0.9" + }, + { + "name": "4.0.10", + "releaseDate": "22 August 2023", + "version": 2022112850, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.0_release_notes#4.0.10" + }, + { + "name": "4.0.11", + "releaseDate": "10 October 2023", + "version": 2022112860, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_4.0_release_notes#4.0.11" + }, + { + "name": "4.0.12", + "releaseDate": "12 December 2023", + "version": 2022112870, + "releaseNoteUrl": false + } + ] + }, + { + "name": "3.11", + "releaseDate": "8 June 2021", + "generalEndDate": "7 June 2022", + "securityEndDate": "7 December 2022", + "improvementsandnewfeaturesEndDate": "", + "isLTS": false, + "isRolling": false, + "releases": [ + { + "name": "3.11.0", + "releaseDate": "8 June 2021", + "version": 2021060800, + "upgradePath": "https://docs.moodle.org/311/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes" + }, + { + "name": "3.11.1", + "releaseDate": "20 July 2021", + "version": 2021072000, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.1" + }, + { + "name": "3.11.2", + "releaseDate": "30 July 2021", + "version": 2021073000, + "releaseNoteUrl": false + }, + { + "name": "3.11.3", + "releaseDate": "20 September 2021", + "version": 2021092000, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.3" + }, + { + "name": "3.11.4", + "releaseDate": "25 November 2021", + "version": 2021112500, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.4" + }, + { + "name": "3.11.5", + "releaseDate": "18 January 2022", + "version": 2022011800, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.5" + }, + { + "name": "3.11.6", + "releaseDate": "15 March 2022", + "version": 2022031500, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.6" + }, + { + "name": "3.11.7", + "releaseDate": "10 May 2022", + "version": 2022031610, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.7" + }, + { + "name": "3.11.8", + "releaseDate": "12 July 2022", + "version": 2022031620, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.8" + }, + { + "name": "3.11.9", + "releaseDate": "23 August 2022", + "version": 2022031630, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.9" + }, + { + "name": "3.11.10", + "releaseDate": "13 September 2022", + "version": 2022031640, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.10" + }, + { + "name": "3.11.11", + "releaseDate": "15 November 2022", + "version": 2022031650, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.11" + }, + { + "name": "3.11.12", + "releaseDate": "17 January 2023", + "version": 2022031660, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.12" + }, + { + "name": "3.11.13", + "releaseDate": "14 March 2023", + "version": 2022031670, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.13" + }, + { + "name": "3.11.14", + "releaseDate": "25 April 2023", + "version": 2022031680, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.11_release_notes#3.11.14" + }, + { + "name": "3.11.15", + "releaseDate": "13 June 2023", + "version": 2022031690, + "releaseNoteUrl": false + }, + { + "name": "3.11.16", + "releaseDate": "22 August 2023", + "version": 2022031700, + "releaseNoteUrl": false + }, + { + "name": "3.11.17", + "releaseDate": "10 October 2023", + "version": 2022031710, + "releaseNoteUrl": false + }, + { + "name": "3.11.18", + "releaseDate": "12 December 2023", + "version": 2022031720, + "releaseNoteUrl": false + } + ] + }, + { + "name": "3.10", + "releaseDate": "1 December 2020", + "generalEndDate": "30 November 2021", + "securityEndDate": "31 May 2022", + "improvementsandnewfeaturesEndDate": "", + "isLTS": false, + "isRolling": false, + "releases": [ + { + "name": "3.10.0", + "releaseDate": "1 December 2020", + "version": 2020120100, + "upgradePath": "https://docs.moodle.org/310/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.10_release_notes#3.10" + }, + { + "name": "3.10.1", + "releaseDate": "19 January 2021", + "version": 2021011900, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.10_release_notes#3.10.1" + }, + { + "name": "3.10.2", + "releaseDate": "9 March 2021", + "version": 2021030800, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.10_release_notes#3.10.2" + }, + { + "name": "3.10.3", + "releaseDate": "25 March 2021", + "version": 2021032500, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.10_release_notes#3.10.3" + }, + { + "name": "3.10.4", + "releaseDate": "10 May 2021", + "version": 2021051000, + "releaseNoteUrl": false + }, + { + "name": "3.10.5", + "releaseDate": "13 July 2021", + "version": 2021051200, + "releaseNoteUrl": false + }, + { + "name": "3.10.6", + "releaseDate": "30 July 2021", + "version": 2021051210, + "releaseNoteUrl": false + }, + { + "name": "3.10.7", + "releaseDate": "16 September 2021", + "version": 2021051220, + "releaseNoteUrl": false + }, + { + "name": "3.10.8", + "releaseDate": "17 November 2021", + "version": 2021051230, + "releaseNoteUrl": false + }, + { + "name": "3.10.9", + "releaseDate": "18 January 2022", + "version": 2021051240, + "releaseNoteUrl": false + }, + { + "name": "3.10.10", + "releaseDate": "15 March 2022", + "version": 2021051250, + "releaseNoteUrl": false + }, + { + "name": "3.10.11", + "releaseDate": "10 May 2022", + "version": 2021051260, + "releaseNoteUrl": false + } + ] + }, + { + "name": "3.9", + "releaseDate": "30 June 2020", + "generalEndDate": "29 June 2021", + "securityEndDate": "29 December 2021", + "improvementsandnewfeaturesEndDate": "", + "isLTS": false, + "isRolling": false, + "releases": [ + { + "name": "3.9.0", + "releaseDate": "30 June 2020", + "version": 2020063000, + "upgradePath": "https://docs.moodle.org/309/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.9_release_notes#3.9" + }, + { + "name": "3.9.1", + "releaseDate": "15 July 2020", + "version": 2020071500, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.9_release_notes#3.9.1" + }, + { + "name": "3.9.2", + "releaseDate": "24 September 2020", + "version": 2020092400, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.9_release_notes#3.9.2" + }, + { + "name": "3.9.3", + "releaseDate": "10 November 2020", + "version": 2020111000, + "releaseNoteUrl": false + } + ] + }, + { + "name": "3.8", + "releaseDate": "26 November 2019", + "generalEndDate": "25 November 2020", + "securityEndDate": "25 May 2021", + "improvementsandnewfeaturesEndDate": "", + "isLTS": false, + "isRolling": false, + "releases": [ + { + "name": "3.8.0", + "releaseDate": "26 November 2019", + "version": 2019112600, + "upgradePath": "https://docs.moodle.org/308/en/Upgrading", + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.8_release_notes#3.8" + }, + { + "name": "3.8.1", + "releaseDate": "20 January 2020", + "version": 2020012000, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.8_release_notes#3.8.1" + }, + { + "name": "3.8.2", + "releaseDate": "10 March 2020", + "version": 2020031000, + "releaseNoteUrl": "https://docs.moodle.org/dev/Moodle_Workplace_3.8_release_notes#3.8.2" + }, + { + "name": "3.8.3", + "releaseDate": "12 May 2020", + "version": 2020051200, + "releaseNoteUrl": false + }, + { + "name": "3.8.4", + "releaseDate": "9 June 2020", + "version": 2020060900, + "releaseNoteUrl": false + } + ] + }, + { + "name": "3.7", + "releaseDate": "25 June 2019", + "generalEndDate": "24 June 2020", + "securityEndDate": "24 December 2020", + "improvementsandnewfeaturesEndDate": "", + "isLTS": false, + "isRolling": false, + "releases": [ + { + "name": "3.7.0", + "releaseDate": "25 June 2019", + "version": 2019062500, + "upgradePath": "https://docs.moodle.org/307/en/Upgrading", + "releaseNoteUrl": false + }, + { + "name": "3.7.2", + "releaseDate": "10 September 2019", + "version": 2019091000, + "releaseNoteUrl": false + }, + { + "name": "3.7.3", + "releaseDate": "12 November 2019", + "version": 2019111200, + "releaseNoteUrl": false + } + ] + } + ] +} \ No newline at end of file diff --git a/general/_wp_releases/1680px-workplace_releases_timeline.png b/general/_wp_releases/1680px-workplace_releases_timeline.png new file mode 100644 index 0000000000..a114648653 Binary files /dev/null and b/general/_wp_releases/1680px-workplace_releases_timeline.png differ diff --git a/general/wp_releases.md b/general/wp_releases.md new file mode 100644 index 0000000000..864f88cc1d --- /dev/null +++ b/general/wp_releases.md @@ -0,0 +1,151 @@ +--- +title: Moodle Workplace releases +tags: + - 'Workplace' + - Release notes +--- + + + +import SupportedReleasesWP, { styles as ReleaseStylesWP } from '@site/src/components/SupportedReleasesWP'; +import ReleaseTableWP from '@site/src/components/ReleaseTableWP'; + +This page lists all official releases of Moodle Workplace, grouped by branch in reverse chronological order. + +## Release cycle + +Moodle Workplace is based on top of Moodle LMS. Moodle Workplace releases always follow the Moodle LMS releases. The minors are normally released the next day and the majors are normally released after three-four weeks. + +These are the target dates for releases. These dates may vary slightly due to unforeseen circumstances. When the Moodle LMS release is delayed, the Moodle Workplace release is delayed respectively. See also [Moodle LMS Releases](https://moodledev.io/general/releases). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Release + + Moodle Workplace + + Moodle LMS +
Release type Frequency Release Includes Release Includes
[Major](./development/process#major-release-cycles) (eg. 3.x)6 monthly3-4 weeks after Moodle LMS majorNew features, improvements and bug fixes (Moodle LMS and Workplace)April and OctoberNew features, Improvements and fixes
[Minor](./development/process#stable-maintenance-cycles) (Point) (eg. 3.x.y)2 monthly1 day after Moodle LMS minorWorkplace new features, improvements and bug fixes and Moodle LMS fixesFebruary, April, June, August, October and DecemberFixes based on the latest major release and never any significant new features or database changes
+ +Starting from 4.1 release, we package two Workplace versions in every release: + +- **Standard version**: no new features in minor releases, this version is supported for bug fixes and security fixes while the corresponding version of LMS is supported +- **Rolling version**: features are added continuously up until the new major release of LMS, after that it has bug fixes for four more months and then support stops completely (which is approximately 3 months after the next Workplace major release). + +![Release graph summarising the currently supported Workplace releases in a visual form](_wp_releases/1680px-workplace_releases_timeline.png) + +### End-of-life dates for currently supported releases + + + + +
+## Moodle Workplace 5.1 Rolling + + +
+## Moodle Workplace 5.1 + + +
+## Moodle Workplace 5.0 Rolling + + +
+## Moodle Workplace 5.0 + + +
+## Moodle Workplace 4.5 Rolling + + +
+## Moodle Workplace 4.5 (LTS) + + +
+## Moodle Workplace 4.4 Rolling + + +
+## Moodle Workplace 4.4 + + +
+## Moodle Workplace 4.3 Rolling + + +
+## Moodle Workplace 4.3 + + +
+## Moodle Workplace 4.2 Rolling + + +
+## Moodle Workplace 4.2 + + +
+## Moodle Workplace 4.1 Rolling + + +
+## Moodle Workplace 4.1 (LTS) + + +
+## Moodle Workplace 4.0 + + +
+## Moodle Workplace 3.11 + + +
+## Moodle Workplace 3.10 + + +
+## Moodle Workplace 3.9 + + +
+## Moodle workplace 3.8 + + +
+## Moodle workplace 3.7 + diff --git a/scripts/wp_version.mjs b/scripts/wp_version.mjs new file mode 100644 index 0000000000..b72e136395 --- /dev/null +++ b/scripts/wp_version.mjs @@ -0,0 +1,542 @@ +#!/usr/bin/env node +/** + * Copyright (c) Moodle Pty Ltd. + * + * Moodle is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Moodle is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Moodle. If not, see . + */ + +/* eslint-disable import/no-extraneous-dependencies */ + +import { program } from 'commander'; +import { readFile, writeFile } from 'fs/promises'; +import inquirer from 'inquirer'; + +const versionData = JSON.parse(await readFile('./data/wp_versions.json')); + +const getMajorVersionFromData = (majorVersion, isRollingVersion) => versionData.versions.find( + (version) => version.name === majorVersion && version.isRolling === isRollingVersion, +); +const getMajorVersionIndexFromData = (majorVersion, isRollingVersion) => versionData.versions.findIndex( + (version) => version.name === majorVersion && version.isRolling === isRollingVersion, +); +const getMajorVersionNameFromMinor = (minorVersion) => minorVersion.split('.').slice(0, 2).join('.'); +const updateMajorVersionWithData = (majorVersion, data, isRollingVersion = false) => { + const index = getMajorVersionIndexFromData(majorVersion, isRollingVersion); + versionData.versions[index] = data; +}; +const updateMinorVersionWithData = (majorVersion, minorVersion, data) => { + const majorVersionData = getMajorVersionFromData(majorVersion); + const minorVersionIndex = majorVersionData.releases.findIndex((release) => release.name === minorVersion); + majorVersionData.releases[minorVersionIndex] = data; + updateMajorVersionWithData(majorVersion, majorVersionData); +}; + +const persistVersionData = async () => { + await writeFile('./data/wp_versions.json', JSON.stringify(versionData, null, 4)); +}; + +const getFormatter = (options = {}) => new Intl.DateTimeFormat('en-AU', { + timezone: 'Australia/Perth', + weekday: 'short', + month: 'short', + year: 'numeric', + day: 'numeric', + ...options, +}); + +const getDateParts = (date, options = {}) => { + const formattedDate = getFormatter(options).formatToParts(date); + + return Object.fromEntries(formattedDate.map(({ type, value }) => [type, value])); +}; + +const getFormattedDate = (date) => { + const dateParts = getDateParts(date); + + return `${dateParts.weekday} ${dateParts.day} ${dateParts.month} ${dateParts.year}`; +}; + +const getReleaseDateFromDate = (date) => { + const dateParts = getDateParts(date, { + month: '2-digit', + day: '2-digit', + }); + + return `${dateParts.year}${dateParts.month}${dateParts.day}00`; +}; + +const getDateFormattedForVersionFile = (date) => { + const dateParts = getDateParts(date, { + month: 'long', + day: 'numeric', + }); + + return `${dateParts.day} ${dateParts.month} ${dateParts.year}`; +}; + +const getThreeDigitVersionFromName = (name) => { + const [major, minor] = name.split('.'); + + if (Number(minor) < 10) { + return `${major}0${minor}`; + } + + return `${major}${minor}`; +}; + +const getMajorVersion = async (defaultVersion = null) => { + const { major } = await inquirer.prompt({ + type: 'input', + name: 'major', + message: 'What version do you want to add a release to?', + default: defaultVersion, + validate: (input) => (input.match(/^\d+\.\d+$/) ? true : 'Version must be a number'), + }); + + return major; +}; + +const getRollingVersion = async () => { + const { isRolling } = await inquirer.prompt({ + type: 'confirm', + name: 'isRolling', + message: 'Is this a Rolling release?', + default: false, + }); + + return isRolling; +}; + +const getReleaseDate = async (defaultDate = null) => ( + await inquirer.prompt({ + type: 'input', + name: 'releaseDate', + message: 'What is the expected release date?', + default: defaultDate, + validate: (input) => { + const parsedDate = new Date(input); + + if (Number.isNaN(parsedDate.valueOf())) { + return 'Invalid date. Dates should be in a valid JS Date format.'; + } + + return true; + }, + filter: (input) => new Date(input), + }) +).releaseDate; + +const getFreezeDate = async (releaseDate) => { + const { hasFreezeDate } = await inquirer.prompt({ + name: 'hasFreezeDate', + type: 'confirm', + message: 'Do you want to set a code freeze date?', + default: true, + }); + + if (!hasFreezeDate) { + return null; + } + + const getSuggestedDate = () => getFormattedDate(new Date( + new Date(releaseDate) + .setDate(releaseDate.getDate() - (6 * 7)), + )); + + const { theDate } = await inquirer.prompt({ + type: 'input', + name: 'theDate', + message: 'What is the code freeze date?', + default: getSuggestedDate(), + validate: (input) => { + const parsedDate = new Date(input); + + if (Number.isNaN(parsedDate.valueOf())) { + return 'Invalid date. Dates should be in a valid JS Date format.'; + } + + if (parsedDate > releaseDate) { + return 'Code freeze date must be before the release date'; + } + + return true; + }, + filter: (input) => new Date(input), + }); + + return theDate; +}; + +const getImprovementsandfeaturesEndDate = async (releaseDate, isRolling) => { + if (!isRolling) { + return ''; + } + const getSuggestedDate = () => { + const supportLength = 4; + let calculatedDate; + calculatedDate = new Date(new Date(releaseDate).setMonth(releaseDate.getMonth() + supportLength)); + calculatedDate = new Date(calculatedDate.setDate(calculatedDate.getDate() - 1)); + return getFormattedDate(calculatedDate); + }; + + const { theDate } = await inquirer.prompt({ + type: 'input', + name: 'theDate', + message: 'What is the improvements and new features end date?', + default: getSuggestedDate(), + validate: (input) => { + const parsedDate = new Date(input); + + if (Number.isNaN(parsedDate.valueOf())) { + return 'Invalid date. Dates should be in ISO format.'; + } + + if (parsedDate < releaseDate) { + return 'General Support must be after the release date'; + } + + return true; + }, + filter: (input) => new Date(input), + }); + + return theDate; +}; + +const getGeneralSupportDate = async (releaseDate) => { + const getSuggestedDate = () => { + const supportLength = 12; + let calculatedDate; + calculatedDate = new Date(new Date(releaseDate).setMonth(releaseDate.getMonth() + supportLength)); + calculatedDate = new Date(calculatedDate.setDate(calculatedDate.getDate() - 1)); + return getFormattedDate(calculatedDate); + }; + + const { theDate } = await inquirer.prompt({ + type: 'input', + name: 'theDate', + message: 'What is the general support end date?', + default: getSuggestedDate(), + validate: (input) => { + const parsedDate = new Date(input); + + if (Number.isNaN(parsedDate.valueOf())) { + return 'Invalid date. Dates should be in ISO format.'; + } + + if (parsedDate < releaseDate) { + return 'General Support must be after the release date'; + } + + return true; + }, + filter: (input) => new Date(input), + }); + + return theDate; +}; + +const getSecurityEndDate = async (releaseDate, generalSupportEndDate, isLTS) => { + const getSuggestedDate = () => { + const supportLength = isLTS ? 36 : 18; + let calculatedDate; + calculatedDate = new Date(new Date(releaseDate).setMonth(releaseDate.getMonth() + supportLength)); + calculatedDate = new Date(calculatedDate.setDate(calculatedDate.getDate() - 1)); + return getFormattedDate(calculatedDate); + }; + + const { theDate } = await inquirer.prompt({ + type: 'input', + name: 'theDate', + message: 'What is the security support end date?', + default: getSuggestedDate(), + validate: (input) => { + const parsedDate = new Date(input); + + if (Number.isNaN(parsedDate.valueOf())) { + return 'Invalid date. Dates should be in ISO format.'; + } + + if (parsedDate < generalSupportEndDate) { + return 'Security support must must be after the general support end date'; + } + + return true; + }, + filter: (input) => new Date(input), + }); + + return theDate; +}; + +const getReleaseVersionForMajorMinor = async (releaseDate) => { + const { version } = await inquirer.prompt({ + type: 'input', + name: 'version', + message: 'What is the release version?', + default: getReleaseDateFromDate(releaseDate), + validate: (input) => { + if (input.match(/^\d{10}$/)) { + return true; + } + + return 'Version must be in the format YYYYMMDD00'; + }, + }); + + return version; +}; + +const getNotes = async () => { + const { addNotes } = await inquirer.prompt({ + type: 'confirm', + name: 'addNotes', + message: 'Do you want to add notes?', + default: false, + }); + + if (!addNotes) { + return null; + } + + const { standardNotes } = await inquirer.prompt({ + type: 'expand', + name: 'standardNotes', + message: 'Choose a standard note, or write your own', + choices: [{ + key: 'c', + name: 'Cancel (do not add any notes)', + value: null, + }, { + key: 's', + name: 'Unscheduled minor release', + }, { + key: 'e', + name: 'Support has ended', + }, { + key: 'n', + name: 'Custom', + value: false, + }], + }); + + if (standardNotes || standardNotes === null) { + return standardNotes; + } + + const { notes } = await inquirer.prompt({ + type: 'input', + name: 'notes', + message: 'Enter the notes', + }); + + return notes; +}; + +const addMinorRelease = async ( + confirmAddAnother = false, + suggestedReleaseDate = null, + versionList = [], +) => { + if (confirmAddAnother) { + const { addMinor } = await inquirer.prompt({ + type: 'confirm', + name: 'addMinor', + message: 'Do you want to add another minor release?', + default: false, + }); + if (!addMinor) { + return; + } + } + + const majorVersionName = await getMajorVersion(versionList.length ? versionList.pop() : null); + const isRollingVersion = await getRollingVersion(); + const thisVersionData = getMajorVersionFromData(majorVersionName, isRollingVersion); + + if (!thisVersionData) { + throw new Error(`Major version ${majorVersionName} does not exist`); + } + + const { releases } = thisVersionData; + const lastRelease = releases[releases.length - 1]; + const lastReleaseName = lastRelease.name.split('.'); + const nextReleaseName = `${majorVersionName}.${Number(lastReleaseName[2]) + 1}`; + + const releaseDate = await getReleaseDate(suggestedReleaseDate); + const nextReleaseVersion = await getReleaseVersionForMajorMinor(releaseDate); + + const schema = { + name: nextReleaseName, + releaseDate: getDateFormattedForVersionFile(releaseDate), + version: Number(nextReleaseVersion), + releaseNoteUrl: false, + }; + + const notes = await getNotes(); + + if (notes) { + schema.notes = notes; + } + + console.log(`Adding the following schema for ${majorVersionName}`); + console.log(schema); + + thisVersionData.releases.push(schema); + updateMajorVersionWithData(majorVersionName, thisVersionData, isRollingVersion); + await persistVersionData(); + + addMinorRelease(!versionList.length, releaseDate, versionList); +}; + +const addReleaseMarkdown = async (name, isRolling, isLTS) => { + let releaseName = `Moodle Workplace ${name}`; + let isRollingRelease = ''; + if (isLTS) { + releaseName = `${releaseName} (LTS)`; + } + if (isRolling) { + releaseName = `${releaseName} Rolling`; + isRollingRelease = 'isRolling'; + } + const content = await readFile('./general/wp_releases.md', 'utf8'); + const pointer = ''; + const newRelease = content.replace( + pointer, + `${pointer}\n
\n## ${releaseName}\n\n`, + ); + await writeFile('./general/wp_releases.md', newRelease, 'utf8'); +}; + +const addMajorRelease = async ( + name, + minors = [], +) => { + console.log('------------------------------------------------------------------------'); + console.log(`Adding a new major version: ${name}`); + console.log('------------------------------------------------------------------------'); + console.log(''); + console.log('Notes:'); + console.log(''); + console.log('- All dates must be in the format DD Month YYYY, for example 24 Feb 2025'); + console.log('- Code freeze dates are typically 6 weeks before the release date.'); + console.log('- Regular releases have an 18-month support period.'); + console.log('- LTS releases have a 3-year support period.'); + console.log(''); + console.log('All end dates are on the release date of that major release.'); + console.log('------------------------------------------------------------------------'); + console.log(''); + if (!name.match(/^\d+\.\d+$/)) { + throw new Error('Major versions must be in the format X.Y'); + } + + if (versionData.versions[name]) { + throw new Error(`Version ${name} already exists`); + } + + const { isLTS } = await inquirer.prompt({ + type: 'confirm', + name: 'isLTS', + message: 'Is this an LTS release?', + default: false, + }); + + const isRolling = await getRollingVersion(); + const releaseDate = await getReleaseDate(); + const codeFreezeDate = await getFreezeDate(releaseDate); + const generalSupportEndDate = await getGeneralSupportDate(releaseDate); + const improvementsandnewfeaturesEndDate = await getImprovementsandfeaturesEndDate(releaseDate, isRolling); + const securityEndDate = await getSecurityEndDate(releaseDate, generalSupportEndDate, isLTS); + + const schema = { + name, + releaseDate: getDateFormattedForVersionFile(releaseDate), + generalEndDate: getDateFormattedForVersionFile(generalSupportEndDate), + securityEndDate: getDateFormattedForVersionFile(securityEndDate), + improvementsandnewfeaturesEndDate: improvementsandnewfeaturesEndDate + ? getDateFormattedForVersionFile(improvementsandnewfeaturesEndDate) + : improvementsandnewfeaturesEndDate, + isLTS, + isRolling, + }; + + if (codeFreezeDate) { + schema.codeFreezeDate = getDateFormattedForVersionFile(codeFreezeDate); + } + + const releaseVersion = await getReleaseVersionForMajorMinor(releaseDate); + + const threeDigitVersion = getThreeDigitVersionFromName(name); + schema.releases = [{ + name: `${name}.0`, + releaseDate: schema.releaseDate, + version: Number(releaseVersion), + upgradePath: `https://docs.moodle.org/${threeDigitVersion}/en/Upgrading`, + releaseNoteUrl: false, + }]; + + versionData.versions.unshift(schema); + + addReleaseMarkdown(name, isRolling, isLTS); + + console.log(`Adding the following schema for ${name}`); + console.log(schema); + await persistVersionData(); + addMinorRelease(!minors.length, releaseDate, minors); +}; + +const releaseVersions = (versions) => { + for (const version of versions) { + const majorVersionName = getMajorVersionNameFromMinor(version); + const majorVersion = getMajorVersionFromData(majorVersionName); + + if (!majorVersion) { + throw new Error(`Version ${version} does not exist`); + } + + const minorVersionIndex = majorVersion.releases.findIndex((release) => release.name === version); + if (minorVersionIndex === -1) { + throw new Error(`Version ${version} does not exist`); + } + + const minorVersionData = majorVersion.releases[minorVersionIndex]; + delete minorVersionData.releaseNoteUrl; + updateMinorVersionWithData(majorVersionName, version, minorVersionData); + } + + persistVersionData(); +}; + +program + .name('Version Manager') + .description('CLI tooling to help manage version data for Moodle releases'); + +program + .command('major [majors...]') + .description( + 'Generate a new major version, and optionally a list of other major releases with upcoming minor releases', + ) + .action(addMajorRelease); + +program + .command('minors [majors...]') + .description('Generate new minor release versions for the supplied list of major releases') + .action((majors) => addMinorRelease(false, null, majors)); + +program + .command('release ') + .description('Mark the supplied minor releases as released by removing the releaseNoteUrl:false property') + .action(releaseVersions); + +program.parse(); diff --git a/sidebars/general.js b/sidebars/general.js index 21d9b5bd4a..c936d783ce 100644 --- a/sidebars/general.js +++ b/sidebars/general.js @@ -193,6 +193,11 @@ const sidebars = { id: 'app_releases', }, }, + { + type: 'doc', + id: 'wp_releases', + label: 'Moodle Workplace Releases', + }, ], }; diff --git a/src/components/ReleaseTableWP/index.tsx b/src/components/ReleaseTableWP/index.tsx new file mode 100755 index 0000000000..e55f794600 --- /dev/null +++ b/src/components/ReleaseTableWP/index.tsx @@ -0,0 +1,108 @@ +/** + * Copyright (c) Moodle Pty Ltd. + * + * Moodle is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Moodle is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Moodle. If not, see . + */ + +import React from 'react'; +import { MDXProvider } from '@mdx-js/react'; +import { + getVersion, getVersionTitle, type versionInfo, getReleaseStatus, +} from '@site/src/utils/SupportedReleasesWP'; +import Link from '@docusaurus/Link'; +import Admonition from '@theme/Admonition'; + +interface ReleaseTableProps { + releaseName: string, + isRolling?: boolean, +} + +const releaseNoteLink = ( + releaseName: string, + release: versionInfo, + isLms: boolean = false, + isRolling = false, +): null | JSX.Element => { + const isMajorRelease = (release.name.endsWith('.0') || (release.name.match(/\./g) || []).length === 1); + let label = `${isLms ? 'Moodle LMS' : 'Moodle Workplace'} `; + label += `${isMajorRelease ? releaseName : release.name} `; + + if (!isLms && !release.releaseNoteUrl) { + return null; + } + + if (!isLms && typeof release.releaseNoteUrl === 'string') { + label += isRolling ? 'rolling' : ''; + return {label}; + } + + const linkTo = isMajorRelease + ? `/general/releases/${releaseName}` + : `/general/releases/${releaseName}/${release.name}/`; + + return {label}; +}; + +export default function ReleaseTableWP({ releaseName, isRolling = false }: ReleaseTableProps): JSX.Element { + const rows = getVersion(releaseName, isRolling); + const impAndNewFeatEndDate = isRolling ? rows.improvementsandnewfeaturesEndDate : rows.generalEndDate; + + return ( + + + + + + + + + + + + + {rows.releases.map((row) => ( + + + + + + + + ))} + +
Version nameDateVersion numberMoodle LMS release notesMoodle Workplace release notes
{getVersionTitle(row.name)}{row.releaseDate}{row.version}{releaseNoteLink(releaseName, row, true, isRolling)}{releaseNoteLink(releaseName, row, false, isRolling)}
+ +

+ {getReleaseStatus(rows) === 'unsupported' ? ( + <> + Support has ended + + ) : ( + <> + Improvements and new features will end + {' '} + {impAndNewFeatEndDate} +
+ Bug fixes and security fixes will end + {' '} + {rows.securityEndDate} + + )} +

+
+
+ ); +} diff --git a/src/components/SupportedReleasesWP/index.tsx b/src/components/SupportedReleasesWP/index.tsx new file mode 100644 index 0000000000..b1fc291670 --- /dev/null +++ b/src/components/SupportedReleasesWP/index.tsx @@ -0,0 +1,78 @@ +/** + * Copyright (c) Moodle Pty Ltd. + * + * Moodle is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Moodle is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Moodle. If not, see . + */ + +import React from 'react'; +import { MDXProvider } from '@mdx-js/react'; +import styles from './styles.module.css'; +import { + type majorVersionData, + getSupportedReleases, + getReleaseStatus, + getLatestRelease, + getReleaseStatusLabel, + getVersionLabel, +} from '@site/src/utils/SupportedReleasesWP'; + +export { + styles, +}; + +export default function SupportedReleasesWP(): JSX.Element { + const rows = getSupportedReleases() + .filter((versionData: majorVersionData) => versionData.hidden !== true) + .map((versionData: majorVersionData) => { + const releaseStatus = getReleaseStatus(versionData); + return { + name: versionData.name, + version: getVersionLabel(versionData.name, versionData.isLTS, versionData.isRolling), + latestRelease: getLatestRelease(versionData), + generalSupportEnds: versionData.generalEndDate, + securitySupportEnds: versionData.securityEndDate, + improvementsandnewfeaturesEndDate: versionData.improvementsandnewfeaturesEndDate, + releaseStatusLabel: getReleaseStatusLabel(releaseStatus), + }; + }); + + return ( + + + + + + + + + + + + + {rows.map((row) => ( + + + + + + + + ))} + +
VersionLatest ReleaseImprovements and new featuresBug fixesSecurity fixes
{row.version}{row.latestRelease}{row.improvementsandnewfeaturesEndDate}{row.generalSupportEnds}{row.securitySupportEnds}
+
+ ); +} diff --git a/src/components/SupportedReleasesWP/styles.module.css b/src/components/SupportedReleasesWP/styles.module.css new file mode 100644 index 0000000000..019e0798c8 --- /dev/null +++ b/src/components/SupportedReleasesWP/styles.module.css @@ -0,0 +1,3 @@ +.moodle-workplace-release { + background-color: #b7d5e7; +} diff --git a/src/utils/SupportedReleasesWP.ts b/src/utils/SupportedReleasesWP.ts new file mode 100644 index 0000000000..39763351fd --- /dev/null +++ b/src/utils/SupportedReleasesWP.ts @@ -0,0 +1,188 @@ +/** + * Copyright (c) Moodle Pty Ltd. + * + * Moodle is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Moodle is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Moodle. If not, see . + */ + +import VersionData from '@site/data/wp_versions.json'; + +const Versions = VersionData.versions; +const today = new Date(); + +export interface versionInfo { + name: string, + releaseDate: string, + version: boolean | number, + notes?: string, + releaseNoteUrl?: boolean | string, + upgradePath?: boolean | string, +} + +export interface majorVersionData { + name: string, + hidden?: boolean, + codeFreezeDate?: string, + releaseDate: string, + improvementsandnewfeaturesEndDate: string, + generalEndDate: string, + securityEndDate: string, + extendedSecurityEndDate?: string, + isLTS: boolean, + isRolling: boolean, + isExperimental: boolean, + releases?: Array +} + +export const isSupported = (versionData: majorVersionData): boolean => { + if (versionData.extendedSecurityEndDate) { + return (new Date(versionData.extendedSecurityEndDate)) > today; + } else if (versionData.isExperimental) { + // Do not display experimental releases in the version support info. + return false; + } + + return (new Date(versionData.securityEndDate)) > today; +}; + +export const getReleaseStatus = (versionData: majorVersionData, releaseName: string = null): string => { + if (releaseName && releaseName.split('.').length > 2) { + const releaseData = versionData?.releases.find((release) => release.name === releaseName); + if (!releaseData) { + // If there is a releaseName for a minor release, but no release data for it, + // then it has not yet been added and is a future relesae. + return 'future-stable'; + } + + if ((new Date(releaseData.releaseDate)) > today) { + return 'future-stable'; + } + } + + if ((new Date(versionData.releaseDate)) > today) { + return 'future'; + } + + if ((new Date(versionData.generalEndDate)) > today) { + return 'current'; + } + + if ((new Date(versionData.securityEndDate)) > today) { + return 'security'; + } + + if (versionData.extendedSecurityEndDate && (new Date(versionData.extendedSecurityEndDate)) > today) { + return 'security'; + } + + return 'unsupported'; +}; + +export const getReleaseStatusLabel = (status: string): string => { + if (status === 'future') { + return 'Future release'; + } + + if (status === 'current') { + return 'Current stable'; + } + + if (status === 'security') { + return 'Current security'; + } + + return 'Not supported'; +}; + +export const getTitle = (majorVersion: string, versionData: majorVersionData): string => { + if (versionData.isLTS) { + return `Moodle Workplace ${majorVersion} (LTS)`; + } + + if (versionData.isRolling) { + return `Moodle Workplace ${majorVersion} Rolling`; + } + + return `Moodle Workplace ${majorVersion}`; +}; + +export const getVersionTitle = (versionName: string, isLTS: boolean = false, isRolling: boolean = false): string => { + if (isLTS) { + return `Moodle Workplace ${versionName} (LTS)`; + } + + if (isRolling) { + return `Moodle Workplace ${versionName} Rolling`; + } + + return `Moodle Workplace ${versionName}`; +}; + +export const getVersionLabel = (versionName: string, isLTS: boolean = false, isRolling: boolean = false): string => { + if (isLTS) { + return `${versionName} (LTS)`; + } + + if (isRolling) { + return `${versionName} Rolling`; + } + + return versionName; +}; + +export const getAllVersions = (): Array => Array(...Versions).map((version) => { + version.releases = version?.releases?.map((release) => ({ + releaseNoteUrl: null, + upgradePath: null, + ...release, + })); + + return version; +}); + +export const getSupportedReleases = (): Array => ( + getAllVersions().filter((versionData: majorVersionData) => isSupported(versionData)) +); + +export const getVersion = (versionName: string, isRolling: boolean): majorVersionData => { + const [major, release] = versionName.split('.'); + const majorVersion = `${major}.${release}`; + return getAllVersions().find((version) => version.name === majorVersion && version.isRolling === isRolling); +}; + +export const getRelease = (versionName: string): versionInfo | null => { + const [major, release] = versionName.split('.'); + const majorVersionName = `${major}.${release}`; + const majorVersion = getAllVersions().find((version) => version.name === majorVersionName); + + if (!majorVersion) { + return null; + } + + return majorVersion.releases.find((versionInfo) => versionInfo.name === versionName); +}; + +export const getLatestRelease = (versionData: majorVersionData): string => { + if (!versionData?.releases || versionData.releases.length === 0) { + return ''; + } + + const latestRelease = versionData.releases.reduce((latest, current) => { + if (new Date(current.releaseDate) > new Date(latest.releaseDate)) { + return current; + } + return latest; + }, versionData.releases[0]); + + return latestRelease.releaseDate; +}; diff --git a/static/schema/wp_versions.json b/static/schema/wp_versions.json new file mode 100644 index 0000000000..5a2a23e3ca --- /dev/null +++ b/static/schema/wp_versions.json @@ -0,0 +1,122 @@ +{ + "title": "JSON schema for the Moodle Workplace Release Data", + "$id": "https://moodledev.io/schema/wp_versions.json", + "$schema": "https://json-schema.org/draft/2019-09/schema", + "type": "object", + "properties": { + "versions": { + "type": "array", + "items": { + "$ref": "#/$defs/version" + } + } + }, + "required": [ + "versions" + ], + "$defs": { + "version": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "releaseDate": { + "type": "string" + }, + "codeFreezeDate": { + "type": "string" + }, + "improvementsandnewfeaturesEndDate": { + "type": "string" + }, + "generalEndDate": { + "type": "string" + }, + "securityEndDate": { + "type": "string" + }, + "extendedSecurityEndDate": { + "type": "string" + }, + "isLTS": { + "type": "boolean" + }, + "isRolling": { + "type": "boolean" + }, + "isExperimental": { + "type": "boolean" + }, + "releases": { + "type": "array", + "items": { + "$ref": "#/$defs/release" + } + }, + "hidden": { + "type": "boolean" + } + }, + "required": [ + "name", + "releaseDate", + "generalEndDate", + "securityEndDate" + ], + "additionalProperties": false, + "unevaluatedProperties": false + }, + "release": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "releaseDate": { + "type": "string" + }, + "version": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "notes": { + "type": "string" + }, + "upgradePath": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "boolean" + } + ] + }, + "releaseNoteUrl": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "boolean" + } + ] + } + }, + "required": [ + "name", + "releaseDate", + "version" + ], + "additionalProperties": false, + "unevaluatedProperties": false + } + } +}