From 73c00032cb4704708faf55e1994bdf130af17132 Mon Sep 17 00:00:00 2001 From: James Wald Date: Thu, 28 May 2026 20:25:42 -0400 Subject: [PATCH 1/8] Use Azul metadata API --- __tests__/data/zulu-linux.json | 724 +++++++++++++---- __tests__/data/zulu-releases-default.json | 700 +++++++++++++---- __tests__/data/zulu-windows.json | 726 ++++++++++++++---- __tests__/distributors/zulu-installer.test.ts | 41 +- .../distributors/zulu-linux-installer.test.ts | 41 +- .../zulu-windows-installer.test.ts | 41 +- src/distributions/zulu/installer.ts | 44 +- src/distributions/zulu/models.ts | 12 +- 8 files changed, 1800 insertions(+), 529 deletions(-) diff --git a/__tests__/data/zulu-linux.json b/__tests__/data/zulu-linux.json index 1f2fa271..94f89b63 100644 --- a/__tests__/data/zulu-linux.json +++ b/__tests__/data/zulu-linux.json @@ -1,254 +1,686 @@ -[ +[ { - "id": 10996, - "url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_05-8.1.0.10-linux.tar.gz", + "package_uuid": "test-uuid-10996", "name": "zulu1.8.0_05-8.1.0.10-linux.tar.gz", - "zulu_version": [8, 1, 0, 10], - "jdk_version": [8, 0, 5, 13] + "download_url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_05-8.1.0.10-linux.tar.gz", + "java_version": [ + 8, + 0, + 5, + 13 + ], + "distro_version": [ + 8, + 1, + 0, + 10 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10997, - "url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_11-8.2.0.1-linux.tar.gz", + "package_uuid": "test-uuid-10997", "name": "zulu1.8.0_11-8.2.0.1-linux.tar.gz", - "zulu_version": [8, 2, 0, 1], - "jdk_version": [8, 0, 11, 12] + "download_url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_11-8.2.0.1-linux.tar.gz", + "java_version": [ + 8, + 0, + 11, + 12 + ], + "distro_version": [ + 8, + 2, + 0, + 1 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10346, - "url": "https://cdn.azul.com/zulu/bin/zulu8.21.0.1-jdk8.0.131-linux_x64.tar.gz", + "package_uuid": "test-uuid-10346", "name": "zulu8.21.0.1-jdk8.0.131-linux_x64.tar.gz", - "zulu_version": [8, 21, 0, 1], - "jdk_version": [8, 0, 131, 11] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.21.0.1-jdk8.0.131-linux_x64.tar.gz", + "java_version": [ + 8, + 0, + 131, + 11 + ], + "distro_version": [ + 8, + 21, + 0, + 1 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10362, - "url": "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-linux_x64.tar.gz", + "package_uuid": "test-uuid-10362", "name": "zulu8.23.0.3-jdk8.0.144-linux_x64.tar.gz", - "zulu_version": [8, 23, 0, 3], - "jdk_version": [8, 0, 144, 1] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-linux_x64.tar.gz", + "java_version": [ + 8, + 0, + 144, + 1 + ], + "distro_version": [ + 8, + 23, + 0, + 3 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10399, - "url": "https://cdn.azul.com/zulu/bin/zulu8.25.0.1-jdk8.0.152-linux_x64.tar.gz", + "package_uuid": "test-uuid-10399", "name": "zulu8.25.0.1-jdk8.0.152-linux_x64.tar.gz", - "zulu_version": [8, 25, 0, 1], - "jdk_version": [8, 0, 152, 16] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.25.0.1-jdk8.0.152-linux_x64.tar.gz", + "java_version": [ + 8, + 0, + 152, + 16 + ], + "distro_version": [ + 8, + 25, + 0, + 1 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11355, - "url": "https://cdn.azul.com/zulu/bin/zulu8.46.0.19-ca-jdk8.0.252-linux_x64.tar.gz", + "package_uuid": "test-uuid-11355", "name": "zulu8.46.0.19-ca-jdk8.0.252-linux_x64.tar.gz", - "zulu_version": [8, 46, 0, 19], - "jdk_version": [8, 0, 252, 14] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.46.0.19-ca-jdk8.0.252-linux_x64.tar.gz", + "java_version": [ + 8, + 0, + 252, + 14 + ], + "distro_version": [ + 8, + 46, + 0, + 19 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11481, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.47-ca-jdk8.0.262-linux_x64.tar.gz", + "package_uuid": "test-uuid-11481", "name": "zulu8.48.0.47-ca-jdk8.0.262-linux_x64.tar.gz", - "zulu_version": [8, 48, 0, 47], - "jdk_version": [8, 0, 262, 17] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.47-ca-jdk8.0.262-linux_x64.tar.gz", + "java_version": [ + 8, + 0, + 262, + 17 + ], + "distro_version": [ + 8, + 48, + 0, + 47 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11622, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.51-ca-jdk8.0.262-linux_x64.tar.gz", + "package_uuid": "test-uuid-11622", "name": "zulu8.48.0.51-ca-jdk8.0.262-linux_x64.tar.gz", - "zulu_version": [8, 48, 0, 51], - "jdk_version": [8, 0, 262, 19] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.51-ca-jdk8.0.262-linux_x64.tar.gz", + "java_version": [ + 8, + 0, + 262, + 19 + ], + "distro_version": [ + 8, + 48, + 0, + 51 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11535, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.49-ca-jdk8.0.262-linux_x64.tar.gz", + "package_uuid": "test-uuid-11535", "name": "zulu8.48.0.49-ca-jdk8.0.262-linux_x64.tar.gz", - "zulu_version": [8, 48, 0, 49], - "jdk_version": [8, 0, 262, 18] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.49-ca-jdk8.0.262-linux_x64.tar.gz", + "java_version": [ + 8, + 0, + 262, + 18 + ], + "distro_version": [ + 8, + 48, + 0, + 49 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12424, - "url": "https://cdn.azul.com/zulu/bin/zulu8.52.0.23-ca-jdk8.0.282-linux_x64.tar.gz", + "package_uuid": "test-uuid-12424", "name": "zulu8.52.0.23-ca-jdk8.0.282-linux_x64.tar.gz", - "zulu_version": [8, 52, 0, 23], - "jdk_version": [8, 0, 282, 8] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.52.0.23-ca-jdk8.0.282-linux_x64.tar.gz", + "java_version": [ + 8, + 0, + 282, + 8 + ], + "distro_version": [ + 8, + 52, + 0, + 23 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10383, - "url": "https://cdn.azul.com/zulu/bin/zulu9.0.0.15-jdk9.0.0-linux_x64.tar.gz", + "package_uuid": "test-uuid-10383", "name": "zulu9.0.0.15-jdk9.0.0-linux_x64.tar.gz", - "zulu_version": [9, 0, 0, 15], - "jdk_version": [9, 0, 0, 0] + "download_url": "https://cdn.azul.com/zulu/bin/zulu9.0.0.15-jdk9.0.0-linux_x64.tar.gz", + "java_version": [ + 9, + 0, + 0, + 0 + ], + "distro_version": [ + 9, + 0, + 0, + 15 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10413, - "url": "https://cdn.azul.com/zulu/bin/zulu9.0.1.3-jdk9.0.1-linux_x64.tar.gz", + "package_uuid": "test-uuid-10413", "name": "zulu9.0.1.3-jdk9.0.1-linux_x64.tar.gz", - "zulu_version": [9, 0, 1, 3], - "jdk_version": [9, 0, 1, 0] + "download_url": "https://cdn.azul.com/zulu/bin/zulu9.0.1.3-jdk9.0.1-linux_x64.tar.gz", + "java_version": [ + 9, + 0, + 1, + 0 + ], + "distro_version": [ + 9, + 0, + 1, + 3 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10503, - "url": "https://cdn.azul.com/zulu/bin/zulu10.2+3-jdk10.0.1-linux_x64.tar.gz", + "package_uuid": "test-uuid-10503", "name": "zulu10.2+3-jdk10.0.1-linux_x64.tar.gz", - "zulu_version": [10, 2, 3, 0], - "jdk_version": [10, 0, 1, 9] + "download_url": "https://cdn.azul.com/zulu/bin/zulu10.2+3-jdk10.0.1-linux_x64.tar.gz", + "java_version": [ + 10, + 0, + 1, + 9 + ], + "distro_version": [ + 10, + 2, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10541, - "url": "https://cdn.azul.com/zulu/bin/zulu10.3+5-jdk10.0.2-linux_x64.tar.gz", + "package_uuid": "test-uuid-10541", "name": "zulu10.3+5-jdk10.0.2-linux_x64.tar.gz", - "zulu_version": [10, 3, 5, 0], - "jdk_version": [10, 0, 2, 13] + "download_url": "https://cdn.azul.com/zulu/bin/zulu10.3+5-jdk10.0.2-linux_x64.tar.gz", + "java_version": [ + 10, + 0, + 2, + 13 + ], + "distro_version": [ + 10, + 3, + 5, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10576, - "url": "https://cdn.azul.com/zulu/bin/zulu11.2.3-jdk11.0.1-linux_x64.tar.gz", + "package_uuid": "test-uuid-10576", "name": "zulu11.2.3-jdk11.0.1-linux_x64.tar.gz", - "zulu_version": [11, 2, 3, 0], - "jdk_version": [11, 0, 1, 13] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.2.3-jdk11.0.1-linux_x64.tar.gz", + "java_version": [ + 11, + 0, + 1, + 13 + ], + "distro_version": [ + 11, + 2, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10604, - "url": "https://cdn.azul.com/zulu/bin/zulu11.29.3-ca-jdk11.0.2-linux_x64.tar.gz", + "package_uuid": "test-uuid-10604", "name": "zulu11.29.3-ca-jdk11.0.2-linux_x64.tar.gz", - "zulu_version": [11, 29, 3, 0], - "jdk_version": [11, 0, 2, 7] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.29.3-ca-jdk11.0.2-linux_x64.tar.gz", + "java_version": [ + 11, + 0, + 2, + 7 + ], + "distro_version": [ + 11, + 29, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10687, - "url": "https://cdn.azul.com/zulu/bin/zulu11.31.11-ca-jdk11.0.3-linux_x64.tar.gz", + "package_uuid": "test-uuid-10687", "name": "zulu11.31.11-ca-jdk11.0.3-linux_x64.tar.gz", - "zulu_version": [11, 31, 11, 0], - "jdk_version": [11, 0, 3, 7] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.31.11-ca-jdk11.0.3-linux_x64.tar.gz", + "java_version": [ + 11, + 0, + 3, + 7 + ], + "distro_version": [ + 11, + 31, + 11, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10856, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.13-ca-jdk11.0.5-linux_x64.tar.gz", + "package_uuid": "test-uuid-10856", "name": "zulu11.35.13-ca-jdk11.0.5-linux_x64.tar.gz", - "zulu_version": [11, 35, 13, 0], - "jdk_version": [11, 0, 5, 10] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.35.13-ca-jdk11.0.5-linux_x64.tar.gz", + "java_version": [ + 11, + 0, + 5, + 10 + ], + "distro_version": [ + 11, + 35, + 13, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10933, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.15-ca-jdk11.0.5-linux_x64.tar.gz", + "package_uuid": "test-uuid-10933", "name": "zulu11.35.15-ca-jdk11.0.5-linux_x64.tar.gz", - "zulu_version": [11, 35, 15, 0], - "jdk_version": [11, 0, 5, 10] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.35.15-ca-jdk11.0.5-linux_x64.tar.gz", + "java_version": [ + 11, + 0, + 5, + 10 + ], + "distro_version": [ + 11, + 35, + 15, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10933, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.11-ca-jdk11.0.5-linux_x64.tar.gz", + "package_uuid": "test-uuid-10933", "name": "zulu11.35.15-ca-jdk11.0.5-linux_x64.tar.gz", - "zulu_version": [11, 35, 11, 0], - "jdk_version": [11, 0, 5, 10] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.35.11-ca-jdk11.0.5-linux_x64.tar.gz", + "java_version": [ + 11, + 0, + 5, + 10 + ], + "distro_version": [ + 11, + 35, + 11, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12397, - "url": "https://cdn.azul.com/zulu/bin/zulu11.45.27-ca-jdk11.0.10-linux_x64.tar.gz", + "package_uuid": "test-uuid-12397", "name": "zulu11.45.27-ca-jdk11.0.10-linux_x64.tar.gz", - "zulu_version": [11, 45, 27, 0], - "jdk_version": [11, 0, 10, 9] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.45.27-ca-jdk11.0.10-linux_x64.tar.gz", + "java_version": [ + 11, + 0, + 10, + 9 + ], + "distro_version": [ + 11, + 45, + 27, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10667, - "url": "https://cdn.azul.com/zulu/bin/zulu12.1.3-ca-jdk12.0.0-linux_x64.tar.gz", + "package_uuid": "test-uuid-10667", "name": "zulu12.1.3-ca-jdk12.0.0-linux_x64.tar.gz", - "zulu_version": [12, 1, 3, 0], - "jdk_version": [12, 0, 0, 33] + "download_url": "https://cdn.azul.com/zulu/bin/zulu12.1.3-ca-jdk12.0.0-linux_x64.tar.gz", + "java_version": [ + 12, + 0, + 0, + 33 + ], + "distro_version": [ + 12, + 1, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10710, - "url": "https://cdn.azul.com/zulu/bin/zulu12.2.3-ca-jdk12.0.1-linux_x64.tar.gz", + "package_uuid": "test-uuid-10710", "name": "zulu12.2.3-ca-jdk12.0.1-linux_x64.tar.gz", - "zulu_version": [12, 2, 3, 0], - "jdk_version": [12, 0, 1, 12] + "download_url": "https://cdn.azul.com/zulu/bin/zulu12.2.3-ca-jdk12.0.1-linux_x64.tar.gz", + "java_version": [ + 12, + 0, + 1, + 12 + ], + "distro_version": [ + 12, + 2, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10780, - "url": "https://cdn.azul.com/zulu/bin/zulu12.3.11-ca-jdk12.0.2-linux_x64.tar.gz", + "package_uuid": "test-uuid-10780", "name": "zulu12.3.11-ca-jdk12.0.2-linux_x64.tar.gz", - "zulu_version": [12, 3, 11, 0], - "jdk_version": [12, 0, 2, 3] + "download_url": "https://cdn.azul.com/zulu/bin/zulu12.3.11-ca-jdk12.0.2-linux_x64.tar.gz", + "java_version": [ + 12, + 0, + 2, + 3 + ], + "distro_version": [ + 12, + 3, + 11, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10846, - "url": "https://cdn.azul.com/zulu/bin/zulu13.27.9-ca-jdk13.0.0-linux_x64.tar.gz", + "package_uuid": "test-uuid-10846", "name": "zulu13.27.9-ca-jdk13.0.0-linux_x64.tar.gz", - "zulu_version": [13, 27, 9, 0], - "jdk_version": [13, 0, 0, 33] + "download_url": "https://cdn.azul.com/zulu/bin/zulu13.27.9-ca-jdk13.0.0-linux_x64.tar.gz", + "java_version": [ + 13, + 0, + 0, + 33 + ], + "distro_version": [ + 13, + 27, + 9, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10888, - "url": "https://cdn.azul.com/zulu/bin/zulu13.28.11-ca-jdk13.0.1-linux_x64.tar.gz", + "package_uuid": "test-uuid-10888", "name": "zulu13.28.11-ca-jdk13.0.1-linux_x64.tar.gz", - "zulu_version": [13, 28, 11, 0], - "jdk_version": [13, 0, 1, 10] + "download_url": "https://cdn.azul.com/zulu/bin/zulu13.28.11-ca-jdk13.0.1-linux_x64.tar.gz", + "java_version": [ + 13, + 0, + 1, + 10 + ], + "distro_version": [ + 13, + 28, + 11, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11073, - "url": "https://cdn.azul.com/zulu/bin/zulu13.29.9-ca-jdk13.0.2-linux_x64.tar.gz", + "package_uuid": "test-uuid-11073", "name": "zulu13.29.9-ca-jdk13.0.2-linux_x64.tar.gz", - "zulu_version": [13, 29, 9, 0], - "jdk_version": [13, 0, 2, 6] + "download_url": "https://cdn.azul.com/zulu/bin/zulu13.29.9-ca-jdk13.0.2-linux_x64.tar.gz", + "java_version": [ + 13, + 0, + 2, + 6 + ], + "distro_version": [ + 13, + 29, + 9, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12408, - "url": "https://cdn.azul.com/zulu/bin/zulu13.37.21-ca-jdk13.0.6-linux_x64.tar.gz", + "package_uuid": "test-uuid-12408", "name": "zulu13.37.21-ca-jdk13.0.6-linux_x64.tar.gz", - "zulu_version": [13, 37, 21, 0], - "jdk_version": [13, 0, 6, 5] + "download_url": "https://cdn.azul.com/zulu/bin/zulu13.37.21-ca-jdk13.0.6-linux_x64.tar.gz", + "java_version": [ + 13, + 0, + 6, + 5 + ], + "distro_version": [ + 13, + 37, + 21, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11236, - "url": "https://cdn.azul.com/zulu/bin/zulu14.27.1-ca-jdk14.0.0-linux_x64.tar.gz", + "package_uuid": "test-uuid-11236", "name": "zulu14.27.1-ca-jdk14.0.0-linux_x64.tar.gz", - "zulu_version": [14, 27, 1, 0], - "jdk_version": [14, 0, 0, 36] + "download_url": "https://cdn.azul.com/zulu/bin/zulu14.27.1-ca-jdk14.0.0-linux_x64.tar.gz", + "java_version": [ + 14, + 0, + 0, + 36 + ], + "distro_version": [ + 14, + 27, + 1, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11349, - "url": "https://cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz", + "package_uuid": "test-uuid-11349", "name": "zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz", - "zulu_version": [14, 28, 21, 0], - "jdk_version": [14, 0, 1, 8] + "download_url": "https://cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz", + "java_version": [ + 14, + 0, + 1, + 8 + ], + "distro_version": [ + 14, + 28, + 21, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11513, - "url": "https://cdn.azul.com/zulu/bin/zulu14.29.23-ca-jdk14.0.2-linux_x64.tar.gz", + "package_uuid": "test-uuid-11513", "name": "zulu14.29.23-ca-jdk14.0.2-linux_x64.tar.gz", - "zulu_version": [14, 29, 23, 0], - "jdk_version": [14, 0, 2, 12] + "download_url": "https://cdn.azul.com/zulu/bin/zulu14.29.23-ca-jdk14.0.2-linux_x64.tar.gz", + "java_version": [ + 14, + 0, + 2, + 12 + ], + "distro_version": [ + 14, + 29, + 23, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11780, - "url": "https://cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-linux_x64.tar.gz", + "package_uuid": "test-uuid-11780", "name": "zulu15.27.17-ca-jdk15.0.0-linux_x64.tar.gz", - "zulu_version": [15, 27, 17, 0], - "jdk_version": [15, 0, 0, 36] + "download_url": "https://cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-linux_x64.tar.gz", + "java_version": [ + 15, + 0, + 0, + 36 + ], + "distro_version": [ + 15, + 27, + 17, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11924, - "url": "https://cdn.azul.com/zulu/bin/zulu15.28.13-ca-jdk15.0.1-linux_x64.tar.gz", + "package_uuid": "test-uuid-11924", "name": "zulu15.28.13-ca-jdk15.0.1-linux_x64.tar.gz", - "zulu_version": [15, 28, 13, 0], - "jdk_version": [15, 0, 1, 8] + "download_url": "https://cdn.azul.com/zulu/bin/zulu15.28.13-ca-jdk15.0.1-linux_x64.tar.gz", + "java_version": [ + 15, + 0, + 1, + 8 + ], + "distro_version": [ + 15, + 28, + 13, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12101, - "url": "https://cdn.azul.com/zulu/bin/zulu15.28.51-ca-jdk15.0.1-linux_x64.tar.gz", + "package_uuid": "test-uuid-12101", "name": "zulu15.28.51-ca-jdk15.0.1-linux_x64.tar.gz", - "zulu_version": [15, 28, 51, 0], - "jdk_version": [15, 0, 1, 9] + "download_url": "https://cdn.azul.com/zulu/bin/zulu15.28.51-ca-jdk15.0.1-linux_x64.tar.gz", + "java_version": [ + 15, + 0, + 1, + 9 + ], + "distro_version": [ + 15, + 28, + 51, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12445, - "url": "https://cdn.azul.com/zulu/bin/zulu15.29.15-ca-jdk15.0.2-linux_x64.tar.gz", + "package_uuid": "test-uuid-12445", "name": "zulu15.29.15-ca-jdk15.0.2-linux_x64.tar.gz", - "zulu_version": [15, 29, 15, 0], - "jdk_version": [15, 0, 2, 7] + "download_url": "https://cdn.azul.com/zulu/bin/zulu15.29.15-ca-jdk15.0.2-linux_x64.tar.gz", + "java_version": [ + 15, + 0, + 2, + 7 + ], + "distro_version": [ + 15, + 29, + 15, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12447, - "url": "https://cdn.azul.com/zulu/bin/zulu21.32.17-ca-jdk21.0.2-linux_aarch64.tar.gz", + "package_uuid": "test-uuid-12447", "name": "zulu21.32.17-ca-jdk21.0.2-linux_aarch64.tar.gz", - "zulu_version": [21, 32, 17, 0], - "jdk_version": [21, 0, 2, 6] + "download_url": "https://cdn.azul.com/zulu/bin/zulu21.32.17-ca-jdk21.0.2-linux_aarch64.tar.gz", + "java_version": [ + 21, + 0, + 2, + 6 + ], + "distro_version": [ + 21, + 32, + 17, + 0 + ], + "latest": false, + "availability_type": "ca" } -] \ No newline at end of file +] diff --git a/__tests__/data/zulu-releases-default.json b/__tests__/data/zulu-releases-default.json index f23a87d4..52a61367 100644 --- a/__tests__/data/zulu-releases-default.json +++ b/__tests__/data/zulu-releases-default.json @@ -1,247 +1,667 @@ [ { - "id": 10996, - "url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_05-8.1.0.10-macosx.tar.gz", + "package_uuid": "test-uuid-10996", "name": "zulu1.8.0_05-8.1.0.10-macosx.tar.gz", - "zulu_version": [8, 1, 0, 10], - "jdk_version": [8, 0, 5, 13] + "download_url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_05-8.1.0.10-macosx.tar.gz", + "java_version": [ + 8, + 0, + 5, + 13 + ], + "distro_version": [ + 8, + 1, + 0, + 10 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10997, - "url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_11-8.2.0.1-macosx.tar.gz", + "package_uuid": "test-uuid-10997", "name": "zulu1.8.0_11-8.2.0.1-macosx.tar.gz", - "zulu_version": [8, 2, 0, 1], - "jdk_version": [8, 0, 11, 12] + "download_url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_11-8.2.0.1-macosx.tar.gz", + "java_version": [ + 8, + 0, + 11, + 12 + ], + "distro_version": [ + 8, + 2, + 0, + 1 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10346, - "url": "https://cdn.azul.com/zulu/bin/zulu8.21.0.1-jdk8.0.131-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10346", "name": "zulu8.21.0.1-jdk8.0.131-macosx_x64.tar.gz", - "zulu_version": [8, 21, 0, 1], - "jdk_version": [8, 0, 131, 11] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.21.0.1-jdk8.0.131-macosx_x64.tar.gz", + "java_version": [ + 8, + 0, + 131, + 11 + ], + "distro_version": [ + 8, + 21, + 0, + 1 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10362, - "url": "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10362", "name": "zulu8.23.0.3-jdk8.0.144-macosx_x64.tar.gz", - "zulu_version": [8, 23, 0, 3], - "jdk_version": [8, 0, 144, 1] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-macosx_x64.tar.gz", + "java_version": [ + 8, + 0, + 144, + 1 + ], + "distro_version": [ + 8, + 23, + 0, + 3 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10399, - "url": "https://cdn.azul.com/zulu/bin/zulu8.25.0.1-jdk8.0.152-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10399", "name": "zulu8.25.0.1-jdk8.0.152-macosx_x64.tar.gz", - "zulu_version": [8, 25, 0, 1], - "jdk_version": [8, 0, 152, 16] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.25.0.1-jdk8.0.152-macosx_x64.tar.gz", + "java_version": [ + 8, + 0, + 152, + 16 + ], + "distro_version": [ + 8, + 25, + 0, + 1 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11355, - "url": "https://cdn.azul.com/zulu/bin/zulu8.46.0.19-ca-jdk8.0.252-macosx_x64.tar.gz", + "package_uuid": "test-uuid-11355", "name": "zulu8.46.0.19-ca-jdk8.0.252-macosx_x64.tar.gz", - "zulu_version": [8, 46, 0, 19], - "jdk_version": [8, 0, 252, 14] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.46.0.19-ca-jdk8.0.252-macosx_x64.tar.gz", + "java_version": [ + 8, + 0, + 252, + 14 + ], + "distro_version": [ + 8, + 46, + 0, + 19 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11481, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.47-ca-jdk8.0.262-macosx_x64.tar.gz", + "package_uuid": "test-uuid-11481", "name": "zulu8.48.0.47-ca-jdk8.0.262-macosx_x64.tar.gz", - "zulu_version": [8, 48, 0, 47], - "jdk_version": [8, 0, 262, 17] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.47-ca-jdk8.0.262-macosx_x64.tar.gz", + "java_version": [ + 8, + 0, + 262, + 17 + ], + "distro_version": [ + 8, + 48, + 0, + 47 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11622, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.51-ca-jdk8.0.262-macosx_x64.tar.gz", + "package_uuid": "test-uuid-11622", "name": "zulu8.48.0.51-ca-jdk8.0.262-macosx_x64.tar.gz", - "zulu_version": [8, 48, 0, 51], - "jdk_version": [8, 0, 262, 19] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.51-ca-jdk8.0.262-macosx_x64.tar.gz", + "java_version": [ + 8, + 0, + 262, + 19 + ], + "distro_version": [ + 8, + 48, + 0, + 51 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11535, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.49-ca-jdk8.0.262-macosx_x64.tar.gz", + "package_uuid": "test-uuid-11535", "name": "zulu8.48.0.49-ca-jdk8.0.262-macosx_x64.tar.gz", - "zulu_version": [8, 48, 0, 49], - "jdk_version": [8, 0, 262, 18] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.49-ca-jdk8.0.262-macosx_x64.tar.gz", + "java_version": [ + 8, + 0, + 262, + 18 + ], + "distro_version": [ + 8, + 48, + 0, + 49 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12424, - "url": "https://cdn.azul.com/zulu/bin/zulu8.52.0.23-ca-jdk8.0.282-macosx_x64.tar.gz", + "package_uuid": "test-uuid-12424", "name": "zulu8.52.0.23-ca-jdk8.0.282-macosx_x64.tar.gz", - "zulu_version": [8, 52, 0, 23], - "jdk_version": [8, 0, 282, 8] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.52.0.23-ca-jdk8.0.282-macosx_x64.tar.gz", + "java_version": [ + 8, + 0, + 282, + 8 + ], + "distro_version": [ + 8, + 52, + 0, + 23 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10383, - "url": "https://cdn.azul.com/zulu/bin/zulu9.0.0.15-jdk9.0.0-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10383", "name": "zulu9.0.0.15-jdk9.0.0-macosx_x64.tar.gz", - "zulu_version": [9, 0, 0, 15], - "jdk_version": [9, 0, 0, 0] + "download_url": "https://cdn.azul.com/zulu/bin/zulu9.0.0.15-jdk9.0.0-macosx_x64.tar.gz", + "java_version": [ + 9, + 0, + 0, + 0 + ], + "distro_version": [ + 9, + 0, + 0, + 15 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10413, - "url": "https://cdn.azul.com/zulu/bin/zulu9.0.1.3-jdk9.0.1-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10413", "name": "zulu9.0.1.3-jdk9.0.1-macosx_x64.tar.gz", - "zulu_version": [9, 0, 1, 3], - "jdk_version": [9, 0, 1, 0] + "download_url": "https://cdn.azul.com/zulu/bin/zulu9.0.1.3-jdk9.0.1-macosx_x64.tar.gz", + "java_version": [ + 9, + 0, + 1, + 0 + ], + "distro_version": [ + 9, + 0, + 1, + 3 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10503, - "url": "https://cdn.azul.com/zulu/bin/zulu10.2+3-jdk10.0.1-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10503", "name": "zulu10.2+3-jdk10.0.1-macosx_x64.tar.gz", - "zulu_version": [10, 2, 3, 0], - "jdk_version": [10, 0, 1, 9] + "download_url": "https://cdn.azul.com/zulu/bin/zulu10.2+3-jdk10.0.1-macosx_x64.tar.gz", + "java_version": [ + 10, + 0, + 1, + 9 + ], + "distro_version": [ + 10, + 2, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10541, - "url": "https://cdn.azul.com/zulu/bin/zulu10.3+5-jdk10.0.2-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10541", "name": "zulu10.3+5-jdk10.0.2-macosx_x64.tar.gz", - "zulu_version": [10, 3, 5, 0], - "jdk_version": [10, 0, 2, 13] + "download_url": "https://cdn.azul.com/zulu/bin/zulu10.3+5-jdk10.0.2-macosx_x64.tar.gz", + "java_version": [ + 10, + 0, + 2, + 13 + ], + "distro_version": [ + 10, + 3, + 5, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10576, - "url": "https://cdn.azul.com/zulu/bin/zulu11.2.3-jdk11.0.1-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10576", "name": "zulu11.2.3-jdk11.0.1-macosx_x64.tar.gz", - "zulu_version": [11, 2, 3, 0], - "jdk_version": [11, 0, 1, 13] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.2.3-jdk11.0.1-macosx_x64.tar.gz", + "java_version": [ + 11, + 0, + 1, + 13 + ], + "distro_version": [ + 11, + 2, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10604, - "url": "https://cdn.azul.com/zulu/bin/zulu11.29.3-ca-jdk11.0.2-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10604", "name": "zulu11.29.3-ca-jdk11.0.2-macosx_x64.tar.gz", - "zulu_version": [11, 29, 3, 0], - "jdk_version": [11, 0, 2, 7] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.29.3-ca-jdk11.0.2-macosx_x64.tar.gz", + "java_version": [ + 11, + 0, + 2, + 7 + ], + "distro_version": [ + 11, + 29, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10687, - "url": "https://cdn.azul.com/zulu/bin/zulu11.31.11-ca-jdk11.0.3-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10687", "name": "zulu11.31.11-ca-jdk11.0.3-macosx_x64.tar.gz", - "zulu_version": [11, 31, 11, 0], - "jdk_version": [11, 0, 3, 7] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.31.11-ca-jdk11.0.3-macosx_x64.tar.gz", + "java_version": [ + 11, + 0, + 3, + 7 + ], + "distro_version": [ + 11, + 31, + 11, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10856, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.13-ca-jdk11.0.5-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10856", "name": "zulu11.35.13-ca-jdk11.0.5-macosx_x64.tar.gz", - "zulu_version": [11, 35, 13, 0], - "jdk_version": [11, 0, 5, 10] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.35.13-ca-jdk11.0.5-macosx_x64.tar.gz", + "java_version": [ + 11, + 0, + 5, + 10 + ], + "distro_version": [ + 11, + 35, + 13, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10933, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.15-ca-jdk11.0.5-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10933", "name": "zulu11.35.15-ca-jdk11.0.5-macosx_x64.tar.gz", - "zulu_version": [11, 35, 15, 0], - "jdk_version": [11, 0, 5, 10] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.35.15-ca-jdk11.0.5-macosx_x64.tar.gz", + "java_version": [ + 11, + 0, + 5, + 10 + ], + "distro_version": [ + 11, + 35, + 15, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10933, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.11-ca-jdk11.0.5-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10933", "name": "zulu11.35.15-ca-jdk11.0.5-macosx_x64.tar.gz", - "zulu_version": [11, 35, 11, 0], - "jdk_version": [11, 0, 5, 10] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.35.11-ca-jdk11.0.5-macosx_x64.tar.gz", + "java_version": [ + 11, + 0, + 5, + 10 + ], + "distro_version": [ + 11, + 35, + 11, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12397, - "url": "https://cdn.azul.com/zulu/bin/zulu11.45.27-ca-jdk11.0.10-macosx_x64.tar.gz", + "package_uuid": "test-uuid-12397", "name": "zulu11.45.27-ca-jdk11.0.10-macosx_x64.tar.gz", - "zulu_version": [11, 45, 27, 0], - "jdk_version": [11, 0, 10, 9] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.45.27-ca-jdk11.0.10-macosx_x64.tar.gz", + "java_version": [ + 11, + 0, + 10, + 9 + ], + "distro_version": [ + 11, + 45, + 27, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10667, - "url": "https://cdn.azul.com/zulu/bin/zulu12.1.3-ca-jdk12.0.0-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10667", "name": "zulu12.1.3-ca-jdk12.0.0-macosx_x64.tar.gz", - "zulu_version": [12, 1, 3, 0], - "jdk_version": [12, 0, 0, 33] + "download_url": "https://cdn.azul.com/zulu/bin/zulu12.1.3-ca-jdk12.0.0-macosx_x64.tar.gz", + "java_version": [ + 12, + 0, + 0, + 33 + ], + "distro_version": [ + 12, + 1, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10710, - "url": "https://cdn.azul.com/zulu/bin/zulu12.2.3-ca-jdk12.0.1-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10710", "name": "zulu12.2.3-ca-jdk12.0.1-macosx_x64.tar.gz", - "zulu_version": [12, 2, 3, 0], - "jdk_version": [12, 0, 1, 12] + "download_url": "https://cdn.azul.com/zulu/bin/zulu12.2.3-ca-jdk12.0.1-macosx_x64.tar.gz", + "java_version": [ + 12, + 0, + 1, + 12 + ], + "distro_version": [ + 12, + 2, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10780, - "url": "https://cdn.azul.com/zulu/bin/zulu12.3.11-ca-jdk12.0.2-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10780", "name": "zulu12.3.11-ca-jdk12.0.2-macosx_x64.tar.gz", - "zulu_version": [12, 3, 11, 0], - "jdk_version": [12, 0, 2, 3] + "download_url": "https://cdn.azul.com/zulu/bin/zulu12.3.11-ca-jdk12.0.2-macosx_x64.tar.gz", + "java_version": [ + 12, + 0, + 2, + 3 + ], + "distro_version": [ + 12, + 3, + 11, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10846, - "url": "https://cdn.azul.com/zulu/bin/zulu13.27.9-ca-jdk13.0.0-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10846", "name": "zulu13.27.9-ca-jdk13.0.0-macosx_x64.tar.gz", - "zulu_version": [13, 27, 9, 0], - "jdk_version": [13, 0, 0, 33] + "download_url": "https://cdn.azul.com/zulu/bin/zulu13.27.9-ca-jdk13.0.0-macosx_x64.tar.gz", + "java_version": [ + 13, + 0, + 0, + 33 + ], + "distro_version": [ + 13, + 27, + 9, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10888, - "url": "https://cdn.azul.com/zulu/bin/zulu13.28.11-ca-jdk13.0.1-macosx_x64.tar.gz", + "package_uuid": "test-uuid-10888", "name": "zulu13.28.11-ca-jdk13.0.1-macosx_x64.tar.gz", - "zulu_version": [13, 28, 11, 0], - "jdk_version": [13, 0, 1, 10] + "download_url": "https://cdn.azul.com/zulu/bin/zulu13.28.11-ca-jdk13.0.1-macosx_x64.tar.gz", + "java_version": [ + 13, + 0, + 1, + 10 + ], + "distro_version": [ + 13, + 28, + 11, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11073, - "url": "https://cdn.azul.com/zulu/bin/zulu13.29.9-ca-jdk13.0.2-macosx_x64.tar.gz", + "package_uuid": "test-uuid-11073", "name": "zulu13.29.9-ca-jdk13.0.2-macosx_x64.tar.gz", - "zulu_version": [13, 29, 9, 0], - "jdk_version": [13, 0, 2, 6] + "download_url": "https://cdn.azul.com/zulu/bin/zulu13.29.9-ca-jdk13.0.2-macosx_x64.tar.gz", + "java_version": [ + 13, + 0, + 2, + 6 + ], + "distro_version": [ + 13, + 29, + 9, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12408, - "url": "https://cdn.azul.com/zulu/bin/zulu13.37.21-ca-jdk13.0.6-macosx_x64.tar.gz", + "package_uuid": "test-uuid-12408", "name": "zulu13.37.21-ca-jdk13.0.6-macosx_x64.tar.gz", - "zulu_version": [13, 37, 21, 0], - "jdk_version": [13, 0, 6, 5] + "download_url": "https://cdn.azul.com/zulu/bin/zulu13.37.21-ca-jdk13.0.6-macosx_x64.tar.gz", + "java_version": [ + 13, + 0, + 6, + 5 + ], + "distro_version": [ + 13, + 37, + 21, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11236, - "url": "https://cdn.azul.com/zulu/bin/zulu14.27.1-ca-jdk14.0.0-macosx_x64.tar.gz", + "package_uuid": "test-uuid-11236", "name": "zulu14.27.1-ca-jdk14.0.0-macosx_x64.tar.gz", - "zulu_version": [14, 27, 1, 0], - "jdk_version": [14, 0, 0, 36] + "download_url": "https://cdn.azul.com/zulu/bin/zulu14.27.1-ca-jdk14.0.0-macosx_x64.tar.gz", + "java_version": [ + 14, + 0, + 0, + 36 + ], + "distro_version": [ + 14, + 27, + 1, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11349, - "url": "https://cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-macosx_x64.tar.gz", + "package_uuid": "test-uuid-11349", "name": "zulu14.28.21-ca-jdk14.0.1-macosx_x64.tar.gz", - "zulu_version": [14, 28, 21, 0], - "jdk_version": [14, 0, 1, 8] + "download_url": "https://cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-macosx_x64.tar.gz", + "java_version": [ + 14, + 0, + 1, + 8 + ], + "distro_version": [ + 14, + 28, + 21, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11513, - "url": "https://cdn.azul.com/zulu/bin/zulu14.29.23-ca-jdk14.0.2-macosx_x64.tar.gz", + "package_uuid": "test-uuid-11513", "name": "zulu14.29.23-ca-jdk14.0.2-macosx_x64.tar.gz", - "zulu_version": [14, 29, 23, 0], - "jdk_version": [14, 0, 2, 12] + "download_url": "https://cdn.azul.com/zulu/bin/zulu14.29.23-ca-jdk14.0.2-macosx_x64.tar.gz", + "java_version": [ + 14, + 0, + 2, + 12 + ], + "distro_version": [ + 14, + 29, + 23, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11780, - "url": "https://cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-macosx_x64.tar.gz", + "package_uuid": "test-uuid-11780", "name": "zulu15.27.17-ca-jdk15.0.0-macosx_x64.tar.gz", - "zulu_version": [15, 27, 17, 0], - "jdk_version": [15, 0, 0, 36] + "download_url": "https://cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-macosx_x64.tar.gz", + "java_version": [ + 15, + 0, + 0, + 36 + ], + "distro_version": [ + 15, + 27, + 17, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11924, - "url": "https://cdn.azul.com/zulu/bin/zulu15.28.13-ca-jdk15.0.1-macosx_x64.tar.gz", + "package_uuid": "test-uuid-11924", "name": "zulu15.28.13-ca-jdk15.0.1-macosx_x64.tar.gz", - "zulu_version": [15, 28, 13, 0], - "jdk_version": [15, 0, 1, 8] + "download_url": "https://cdn.azul.com/zulu/bin/zulu15.28.13-ca-jdk15.0.1-macosx_x64.tar.gz", + "java_version": [ + 15, + 0, + 1, + 8 + ], + "distro_version": [ + 15, + 28, + 13, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12101, - "url": "https://cdn.azul.com/zulu/bin/zulu15.28.51-ca-jdk15.0.1-macosx_x64.tar.gz", + "package_uuid": "test-uuid-12101", "name": "zulu15.28.51-ca-jdk15.0.1-macosx_x64.tar.gz", - "zulu_version": [15, 28, 51, 0], - "jdk_version": [15, 0, 1, 9] + "download_url": "https://cdn.azul.com/zulu/bin/zulu15.28.51-ca-jdk15.0.1-macosx_x64.tar.gz", + "java_version": [ + 15, + 0, + 1, + 9 + ], + "distro_version": [ + 15, + 28, + 51, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12445, - "url": "https://cdn.azul.com/zulu/bin/zulu15.29.15-ca-jdk15.0.2-macosx_x64.tar.gz", + "package_uuid": "test-uuid-12445", "name": "zulu15.29.15-ca-jdk15.0.2-macosx_x64.tar.gz", - "zulu_version": [15, 29, 15, 0], - "jdk_version": [15, 0, 2, 7] + "download_url": "https://cdn.azul.com/zulu/bin/zulu15.29.15-ca-jdk15.0.2-macosx_x64.tar.gz", + "java_version": [ + 15, + 0, + 2, + 7 + ], + "distro_version": [ + 15, + 29, + 15, + 0 + ], + "latest": false, + "availability_type": "ca" } ] diff --git a/__tests__/data/zulu-windows.json b/__tests__/data/zulu-windows.json index 0ec1a0df..5252af16 100644 --- a/__tests__/data/zulu-windows.json +++ b/__tests__/data/zulu-windows.json @@ -1,254 +1,686 @@ -[ +[ { - "id": 10996, - "url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_05-8.1.0.10-windows.tar.gz", + "package_uuid": "test-uuid-10996", "name": "zulu1.8.0_05-8.1.0.10-windows.tar.gz", - "zulu_version": [8, 1, 0, 10], - "jdk_version": [8, 0, 5, 13] + "download_url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_05-8.1.0.10-windows.tar.gz", + "java_version": [ + 8, + 0, + 5, + 13 + ], + "distro_version": [ + 8, + 1, + 0, + 10 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10997, - "url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_11-8.2.0.1-windows.tar.gz", + "package_uuid": "test-uuid-10997", "name": "zulu1.8.0_11-8.2.0.1-windows.tar.gz", - "zulu_version": [8, 2, 0, 1], - "jdk_version": [8, 0, 11, 12] + "download_url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_11-8.2.0.1-windows.tar.gz", + "java_version": [ + 8, + 0, + 11, + 12 + ], + "distro_version": [ + 8, + 2, + 0, + 1 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10346, - "url": "https://cdn.azul.com/zulu/bin/zulu8.21.0.1-jdk8.0.131-windows_x64.tar.gz", + "package_uuid": "test-uuid-10346", "name": "zulu8.21.0.1-jdk8.0.131-windows_x64.tar.gz", - "zulu_version": [8, 21, 0, 1], - "jdk_version": [8, 0, 131, 11] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.21.0.1-jdk8.0.131-windows_x64.tar.gz", + "java_version": [ + 8, + 0, + 131, + 11 + ], + "distro_version": [ + 8, + 21, + 0, + 1 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10362, - "url": "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-windows_x64.tar.gz", + "package_uuid": "test-uuid-10362", "name": "zulu8.23.0.3-jdk8.0.144-windows_x64.tar.gz", - "zulu_version": [8, 23, 0, 3], - "jdk_version": [8, 0, 144, 1] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-windows_x64.tar.gz", + "java_version": [ + 8, + 0, + 144, + 1 + ], + "distro_version": [ + 8, + 23, + 0, + 3 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10399, - "url": "https://cdn.azul.com/zulu/bin/zulu8.25.0.1-jdk8.0.152-windows_x64.tar.gz", + "package_uuid": "test-uuid-10399", "name": "zulu8.25.0.1-jdk8.0.152-windows_x64.tar.gz", - "zulu_version": [8, 25, 0, 1], - "jdk_version": [8, 0, 152, 16] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.25.0.1-jdk8.0.152-windows_x64.tar.gz", + "java_version": [ + 8, + 0, + 152, + 16 + ], + "distro_version": [ + 8, + 25, + 0, + 1 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11355, - "url": "https://cdn.azul.com/zulu/bin/zulu8.46.0.19-ca-jdk8.0.252-windows_x64.tar.gz", + "package_uuid": "test-uuid-11355", "name": "zulu8.46.0.19-ca-jdk8.0.252-windows_x64.tar.gz", - "zulu_version": [8, 46, 0, 19], - "jdk_version": [8, 0, 252, 14] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.46.0.19-ca-jdk8.0.252-windows_x64.tar.gz", + "java_version": [ + 8, + 0, + 252, + 14 + ], + "distro_version": [ + 8, + 46, + 0, + 19 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11481, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.47-ca-jdk8.0.262-windows_x64.tar.gz", + "package_uuid": "test-uuid-11481", "name": "zulu8.48.0.47-ca-jdk8.0.262-windows_x64.tar.gz", - "zulu_version": [8, 48, 0, 47], - "jdk_version": [8, 0, 262, 17] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.47-ca-jdk8.0.262-windows_x64.tar.gz", + "java_version": [ + 8, + 0, + 262, + 17 + ], + "distro_version": [ + 8, + 48, + 0, + 47 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11622, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.51-ca-jdk8.0.262-windows_x64.tar.gz", + "package_uuid": "test-uuid-11622", "name": "zulu8.48.0.51-ca-jdk8.0.262-windows_x64.tar.gz", - "zulu_version": [8, 48, 0, 51], - "jdk_version": [8, 0, 262, 19] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.51-ca-jdk8.0.262-windows_x64.tar.gz", + "java_version": [ + 8, + 0, + 262, + 19 + ], + "distro_version": [ + 8, + 48, + 0, + 51 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11535, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.49-ca-jdk8.0.262-windows_x64.tar.gz", + "package_uuid": "test-uuid-11535", "name": "zulu8.48.0.49-ca-jdk8.0.262-windows_x64.tar.gz", - "zulu_version": [8, 48, 0, 49], - "jdk_version": [8, 0, 262, 18] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.49-ca-jdk8.0.262-windows_x64.tar.gz", + "java_version": [ + 8, + 0, + 262, + 18 + ], + "distro_version": [ + 8, + 48, + 0, + 49 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12424, - "url": "https://cdn.azul.com/zulu/bin/zulu8.52.0.23-ca-jdk8.0.282-windows_x64.tar.gz", + "package_uuid": "test-uuid-12424", "name": "zulu8.52.0.23-ca-jdk8.0.282-windows_x64.tar.gz", - "zulu_version": [8, 52, 0, 23], - "jdk_version": [8, 0, 282, 8] + "download_url": "https://cdn.azul.com/zulu/bin/zulu8.52.0.23-ca-jdk8.0.282-windows_x64.tar.gz", + "java_version": [ + 8, + 0, + 282, + 8 + ], + "distro_version": [ + 8, + 52, + 0, + 23 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10383, - "url": "https://cdn.azul.com/zulu/bin/zulu9.0.0.15-jdk9.0.0-windows_x64.tar.gz", + "package_uuid": "test-uuid-10383", "name": "zulu9.0.0.15-jdk9.0.0-windows_x64.tar.gz", - "zulu_version": [9, 0, 0, 15], - "jdk_version": [9, 0, 0, 0] + "download_url": "https://cdn.azul.com/zulu/bin/zulu9.0.0.15-jdk9.0.0-windows_x64.tar.gz", + "java_version": [ + 9, + 0, + 0, + 0 + ], + "distro_version": [ + 9, + 0, + 0, + 15 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10413, - "url": "https://cdn.azul.com/zulu/bin/zulu9.0.1.3-jdk9.0.1-windows_x64.tar.gz", + "package_uuid": "test-uuid-10413", "name": "zulu9.0.1.3-jdk9.0.1-windows_x64.tar.gz", - "zulu_version": [9, 0, 1, 3], - "jdk_version": [9, 0, 1, 0] + "download_url": "https://cdn.azul.com/zulu/bin/zulu9.0.1.3-jdk9.0.1-windows_x64.tar.gz", + "java_version": [ + 9, + 0, + 1, + 0 + ], + "distro_version": [ + 9, + 0, + 1, + 3 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10503, - "url": "https://cdn.azul.com/zulu/bin/zulu10.2+3-jdk10.0.1-windows_x64.tar.gz", + "package_uuid": "test-uuid-10503", "name": "zulu10.2+3-jdk10.0.1-windows_x64.tar.gz", - "zulu_version": [10, 2, 3, 0], - "jdk_version": [10, 0, 1, 9] + "download_url": "https://cdn.azul.com/zulu/bin/zulu10.2+3-jdk10.0.1-windows_x64.tar.gz", + "java_version": [ + 10, + 0, + 1, + 9 + ], + "distro_version": [ + 10, + 2, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10541, - "url": "https://cdn.azul.com/zulu/bin/zulu10.3+5-jdk10.0.2-windows_x64.tar.gz", + "package_uuid": "test-uuid-10541", "name": "zulu10.3+5-jdk10.0.2-windows_x64.tar.gz", - "zulu_version": [10, 3, 5, 0], - "jdk_version": [10, 0, 2, 13] + "download_url": "https://cdn.azul.com/zulu/bin/zulu10.3+5-jdk10.0.2-windows_x64.tar.gz", + "java_version": [ + 10, + 0, + 2, + 13 + ], + "distro_version": [ + 10, + 3, + 5, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10576, - "url": "https://cdn.azul.com/zulu/bin/zulu11.2.3-jdk11.0.1-windows_x64.tar.gz", + "package_uuid": "test-uuid-10576", "name": "zulu11.2.3-jdk11.0.1-windows_x64.tar.gz", - "zulu_version": [11, 2, 3, 0], - "jdk_version": [11, 0, 1, 13] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.2.3-jdk11.0.1-windows_x64.tar.gz", + "java_version": [ + 11, + 0, + 1, + 13 + ], + "distro_version": [ + 11, + 2, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10604, - "url": "https://cdn.azul.com/zulu/bin/zulu11.29.3-ca-jdk11.0.2-windows_x64.tar.gz", + "package_uuid": "test-uuid-10604", "name": "zulu11.29.3-ca-jdk11.0.2-windows_x64.tar.gz", - "zulu_version": [11, 29, 3, 0], - "jdk_version": [11, 0, 2, 7] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.29.3-ca-jdk11.0.2-windows_x64.tar.gz", + "java_version": [ + 11, + 0, + 2, + 7 + ], + "distro_version": [ + 11, + 29, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10687, - "url": "https://cdn.azul.com/zulu/bin/zulu11.31.11-ca-jdk11.0.3-windows_x64.tar.gz", + "package_uuid": "test-uuid-10687", "name": "zulu11.31.11-ca-jdk11.0.3-windows_x64.tar.gz", - "zulu_version": [11, 31, 11, 0], - "jdk_version": [11, 0, 3, 7] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.31.11-ca-jdk11.0.3-windows_x64.tar.gz", + "java_version": [ + 11, + 0, + 3, + 7 + ], + "distro_version": [ + 11, + 31, + 11, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10856, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.13-ca-jdk11.0.5-windows_x64.tar.gz", + "package_uuid": "test-uuid-10856", "name": "zulu11.35.13-ca-jdk11.0.5-windows_x64.tar.gz", - "zulu_version": [11, 35, 13, 0], - "jdk_version": [11, 0, 5, 10] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.35.13-ca-jdk11.0.5-windows_x64.tar.gz", + "java_version": [ + 11, + 0, + 5, + 10 + ], + "distro_version": [ + 11, + 35, + 13, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10933, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.15-ca-jdk11.0.5-windows_x64.tar.gz", + "package_uuid": "test-uuid-10933", "name": "zulu11.35.15-ca-jdk11.0.5-windows_x64.tar.gz", - "zulu_version": [11, 35, 15, 0], - "jdk_version": [11, 0, 5, 10] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.35.15-ca-jdk11.0.5-windows_x64.tar.gz", + "java_version": [ + 11, + 0, + 5, + 10 + ], + "distro_version": [ + 11, + 35, + 15, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10933, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.11-ca-jdk11.0.5-windows_x64.tar.gz", + "package_uuid": "test-uuid-10933", "name": "zulu11.35.15-ca-jdk11.0.5-windows_x64.tar.gz", - "zulu_version": [11, 35, 11, 0], - "jdk_version": [11, 0, 5, 10] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.35.11-ca-jdk11.0.5-windows_x64.tar.gz", + "java_version": [ + 11, + 0, + 5, + 10 + ], + "distro_version": [ + 11, + 35, + 11, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12397, - "url": "https://cdn.azul.com/zulu/bin/zulu11.45.27-ca-jdk11.0.10-windows_x64.tar.gz", + "package_uuid": "test-uuid-12397", "name": "zulu11.45.27-ca-jdk11.0.10-windows_x64.tar.gz", - "zulu_version": [11, 45, 27, 0], - "jdk_version": [11, 0, 10, 9] + "download_url": "https://cdn.azul.com/zulu/bin/zulu11.45.27-ca-jdk11.0.10-windows_x64.tar.gz", + "java_version": [ + 11, + 0, + 10, + 9 + ], + "distro_version": [ + 11, + 45, + 27, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10667, - "url": "https://cdn.azul.com/zulu/bin/zulu12.1.3-ca-jdk12.0.0-windows_x64.tar.gz", + "package_uuid": "test-uuid-10667", "name": "zulu12.1.3-ca-jdk12.0.0-windows_x64.tar.gz", - "zulu_version": [12, 1, 3, 0], - "jdk_version": [12, 0, 0, 33] + "download_url": "https://cdn.azul.com/zulu/bin/zulu12.1.3-ca-jdk12.0.0-windows_x64.tar.gz", + "java_version": [ + 12, + 0, + 0, + 33 + ], + "distro_version": [ + 12, + 1, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10710, - "url": "https://cdn.azul.com/zulu/bin/zulu12.2.3-ca-jdk12.0.1-windows_x64.tar.gz", + "package_uuid": "test-uuid-10710", "name": "zulu12.2.3-ca-jdk12.0.1-windows_x64.tar.gz", - "zulu_version": [12, 2, 3, 0], - "jdk_version": [12, 0, 1, 12] + "download_url": "https://cdn.azul.com/zulu/bin/zulu12.2.3-ca-jdk12.0.1-windows_x64.tar.gz", + "java_version": [ + 12, + 0, + 1, + 12 + ], + "distro_version": [ + 12, + 2, + 3, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10780, - "url": "https://cdn.azul.com/zulu/bin/zulu12.3.11-ca-jdk12.0.2-windows_x64.tar.gz", + "package_uuid": "test-uuid-10780", "name": "zulu12.3.11-ca-jdk12.0.2-windows_x64.tar.gz", - "zulu_version": [12, 3, 11, 0], - "jdk_version": [12, 0, 2, 3] + "download_url": "https://cdn.azul.com/zulu/bin/zulu12.3.11-ca-jdk12.0.2-windows_x64.tar.gz", + "java_version": [ + 12, + 0, + 2, + 3 + ], + "distro_version": [ + 12, + 3, + 11, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10846, - "url": "https://cdn.azul.com/zulu/bin/zulu13.27.9-ca-jdk13.0.0-windows_x64.tar.gz", + "package_uuid": "test-uuid-10846", "name": "zulu13.27.9-ca-jdk13.0.0-windows_x64.tar.gz", - "zulu_version": [13, 27, 9, 0], - "jdk_version": [13, 0, 0, 33] + "download_url": "https://cdn.azul.com/zulu/bin/zulu13.27.9-ca-jdk13.0.0-windows_x64.tar.gz", + "java_version": [ + 13, + 0, + 0, + 33 + ], + "distro_version": [ + 13, + 27, + 9, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 10888, - "url": "https://cdn.azul.com/zulu/bin/zulu13.28.11-ca-jdk13.0.1-windows_x64.tar.gz", + "package_uuid": "test-uuid-10888", "name": "zulu13.28.11-ca-jdk13.0.1-windows_x64.tar.gz", - "zulu_version": [13, 28, 11, 0], - "jdk_version": [13, 0, 1, 10] + "download_url": "https://cdn.azul.com/zulu/bin/zulu13.28.11-ca-jdk13.0.1-windows_x64.tar.gz", + "java_version": [ + 13, + 0, + 1, + 10 + ], + "distro_version": [ + 13, + 28, + 11, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11073, - "url": "https://cdn.azul.com/zulu/bin/zulu13.29.9-ca-jdk13.0.2-windows_x64.tar.gz", + "package_uuid": "test-uuid-11073", "name": "zulu13.29.9-ca-jdk13.0.2-windows_x64.tar.gz", - "zulu_version": [13, 29, 9, 0], - "jdk_version": [13, 0, 2, 6] + "download_url": "https://cdn.azul.com/zulu/bin/zulu13.29.9-ca-jdk13.0.2-windows_x64.tar.gz", + "java_version": [ + 13, + 0, + 2, + 6 + ], + "distro_version": [ + 13, + 29, + 9, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12408, - "url": "https://cdn.azul.com/zulu/bin/zulu13.37.21-ca-jdk13.0.6-windows_x64.tar.gz", + "package_uuid": "test-uuid-12408", "name": "zulu13.37.21-ca-jdk13.0.6-windows_x64.tar.gz", - "zulu_version": [13, 37, 21, 0], - "jdk_version": [13, 0, 6, 5] + "download_url": "https://cdn.azul.com/zulu/bin/zulu13.37.21-ca-jdk13.0.6-windows_x64.tar.gz", + "java_version": [ + 13, + 0, + 6, + 5 + ], + "distro_version": [ + 13, + 37, + 21, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11236, - "url": "https://cdn.azul.com/zulu/bin/zulu14.27.1-ca-jdk14.0.0-windows_x64.tar.gz", + "package_uuid": "test-uuid-11236", "name": "zulu14.27.1-ca-jdk14.0.0-windows_x64.tar.gz", - "zulu_version": [14, 27, 1, 0], - "jdk_version": [14, 0, 0, 36] + "download_url": "https://cdn.azul.com/zulu/bin/zulu14.27.1-ca-jdk14.0.0-windows_x64.tar.gz", + "java_version": [ + 14, + 0, + 0, + 36 + ], + "distro_version": [ + 14, + 27, + 1, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11349, - "url": "https://cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-windows_x64.tar.gz", + "package_uuid": "test-uuid-11349", "name": "zulu14.28.21-ca-jdk14.0.1-windows_x64.tar.gz", - "zulu_version": [14, 28, 21, 0], - "jdk_version": [14, 0, 1, 8] + "download_url": "https://cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-windows_x64.tar.gz", + "java_version": [ + 14, + 0, + 1, + 8 + ], + "distro_version": [ + 14, + 28, + 21, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11513, - "url": "https://cdn.azul.com/zulu/bin/zulu14.29.23-ca-jdk14.0.2-windows_x64.tar.gz", + "package_uuid": "test-uuid-11513", "name": "zulu14.29.23-ca-jdk14.0.2-windows_x64.tar.gz", - "zulu_version": [14, 29, 23, 0], - "jdk_version": [14, 0, 2, 12] + "download_url": "https://cdn.azul.com/zulu/bin/zulu14.29.23-ca-jdk14.0.2-windows_x64.tar.gz", + "java_version": [ + 14, + 0, + 2, + 12 + ], + "distro_version": [ + 14, + 29, + 23, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11780, - "url": "https://cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-windows_x64.tar.gz", + "package_uuid": "test-uuid-11780", "name": "zulu15.27.17-ca-jdk15.0.0-windows_x64.tar.gz", - "zulu_version": [15, 27, 17, 0], - "jdk_version": [15, 0, 0, 36] + "download_url": "https://cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-windows_x64.tar.gz", + "java_version": [ + 15, + 0, + 0, + 36 + ], + "distro_version": [ + 15, + 27, + 17, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 11924, - "url": "https://cdn.azul.com/zulu/bin/zulu15.28.13-ca-jdk15.0.1-windows_x64.tar.gz", + "package_uuid": "test-uuid-11924", "name": "zulu15.28.13-ca-jdk15.0.1-windows_x64.tar.gz", - "zulu_version": [15, 28, 13, 0], - "jdk_version": [15, 0, 1, 8] + "download_url": "https://cdn.azul.com/zulu/bin/zulu15.28.13-ca-jdk15.0.1-windows_x64.tar.gz", + "java_version": [ + 15, + 0, + 1, + 8 + ], + "distro_version": [ + 15, + 28, + 13, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12101, - "url": "https://cdn.azul.com/zulu/bin/zulu15.28.51-ca-jdk15.0.1-windows_x64.tar.gz", + "package_uuid": "test-uuid-12101", "name": "zulu15.28.51-ca-jdk15.0.1-windows_x64.tar.gz", - "zulu_version": [15, 28, 51, 0], - "jdk_version": [15, 0, 1, 9] + "download_url": "https://cdn.azul.com/zulu/bin/zulu15.28.51-ca-jdk15.0.1-windows_x64.tar.gz", + "java_version": [ + 15, + 0, + 1, + 9 + ], + "distro_version": [ + 15, + 28, + 51, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12445, - "url": "https://cdn.azul.com/zulu/bin/zulu15.29.15-ca-jdk15.0.2-windows_x64.tar.gz", + "package_uuid": "test-uuid-12445", "name": "zulu15.29.15-ca-jdk15.0.2-windows_x64.tar.gz", - "zulu_version": [15, 29, 15, 0], - "jdk_version": [15, 0, 2, 7] + "download_url": "https://cdn.azul.com/zulu/bin/zulu15.29.15-ca-jdk15.0.2-windows_x64.tar.gz", + "java_version": [ + 15, + 0, + 2, + 7 + ], + "distro_version": [ + 15, + 29, + 15, + 0 + ], + "latest": false, + "availability_type": "ca" }, { - "id": 12446, - "url": "https://cdn.azul.com/zulu/bin/zulu17.48.15-ca-jdk17.0.10-windows_aarch64.zip", - "name": "zulu17.48.15-ca-jdk17.0.10-win_aarch4.zip", - "zulu_version": [17, 48, 15, 0], - "jdk_version": [17, 0, 10, 7] + "package_uuid": "test-uuid-12446", + "name": "zulu17.48.15-ca-jdk17.0.10-win_aarhc4.zip", + "download_url": "https://cdn.azul.com/zulu/bin/zulu17.48.15-ca-jdk17.0.10-windows_aarch64.zip", + "java_version": [ + 17, + 0, + 10, + 7 + ], + "distro_version": [ + 17, + 48, + 15, + 0 + ], + "latest": false, + "availability_type": "ca" } -] \ No newline at end of file +] diff --git a/__tests__/distributors/zulu-installer.test.ts b/__tests__/distributors/zulu-installer.test.ts index 0a46983b..50976b37 100644 --- a/__tests__/distributors/zulu-installer.test.ts +++ b/__tests__/distributors/zulu-installer.test.ts @@ -45,7 +45,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&ext=tar.gz&bundle_type=jdk&javafx=false&arch=x86&hw_bitness=32&release_status=ga' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -54,7 +54,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&ext=tar.gz&bundle_type=jdk&javafx=false&arch=x86&hw_bitness=32&release_status=ea' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=1000' ], [ { @@ -63,7 +63,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&ext=tar.gz&bundle_type=jdk&javafx=false&arch=x86&hw_bitness=64&release_status=ga' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -72,7 +72,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=macos&ext=tar.gz&bundle_type=jre&javafx=false&arch=x86&hw_bitness=64&release_status=ga' + '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -81,7 +81,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=macos&ext=tar.gz&bundle_type=jdk&javafx=true&arch=x86&hw_bitness=64&release_status=ga&features=fx' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -90,7 +90,7 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=macos&ext=tar.gz&bundle_type=jre&javafx=true&arch=x86&hw_bitness=64&release_status=ga&features=fx' + '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -99,7 +99,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&ext=tar.gz&bundle_type=jdk&javafx=false&arch=arm&hw_bitness=64&release_status=ga' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -108,12 +108,12 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&ext=tar.gz&bundle_type=jdk&javafx=false&arch=arm&hw_bitness=&release_status=ga' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=1000' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); distribution['getPlatformOption'] = () => 'macos'; - const buildUrl = `https://api.azul.com/zulu/download/community/v1.0/bundles/${parsedUrl}`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/${parsedUrl}`; await distribution['getAvailableVersions'](); @@ -121,16 +121,12 @@ describe('getAvailableVersions', () => { expect(spyHttpClient.mock.calls[0][0]).toBe(buildUrl); }); - type DistroArch = { - bitness: string; - arch: string; - }; it.each([ - ['amd64', {bitness: '64', arch: 'x86'}], - ['arm64', {bitness: '64', arch: 'arm'}] + ['amd64', 'x64'], + ['arm64', 'aarch64'] ])( 'defaults to os.arch(): %s mapped to distro arch: %s', - async (osArch: string, distroArch: DistroArch) => { + async (osArch: string, distroArch: string) => { jest .spyOn(os, 'arch') .mockReturnValue(osArch as ReturnType); @@ -142,7 +138,7 @@ describe('getAvailableVersions', () => { checkLatest: false }); distribution['getPlatformOption'] = () => 'macos'; - const buildUrl = `https://api.azul.com/zulu/download/community/v1.0/bundles/?os=macos&ext=tar.gz&bundle_type=jdk&javafx=false&arch=${distroArch.arch}&hw_bitness=${distroArch.bitness}&release_status=ga`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=1000`; await distribution['getAvailableVersions'](); @@ -165,10 +161,11 @@ describe('getAvailableVersions', () => { describe('getArchitectureOptions', () => { it.each([ - [{architecture: 'x64'}, {arch: 'x86', hw_bitness: '64', abi: ''}], - [{architecture: 'x86'}, {arch: 'x86', hw_bitness: '32', abi: ''}], - [{architecture: 'x32'}, {arch: 'x32', hw_bitness: '', abi: ''}], - [{architecture: 'arm'}, {arch: 'arm', hw_bitness: '', abi: ''}] + [{architecture: 'x64'}, 'x64'], + [{architecture: 'x86'}, 'x86'], + [{architecture: 'aarch64'}, 'aarch64'], + [{architecture: 'arm64'}, 'aarch64'], + [{architecture: 'arm'}, 'arm'] ])('%s -> %s', (input, expected) => { const distribution = new ZuluDistribution({ version: '11', @@ -176,7 +173,7 @@ describe('getArchitectureOptions', () => { packageType: 'jdk', checkLatest: false }); - expect(distribution['getArchitectureOptions']()).toEqual(expected); + expect(distribution['getArchitectureOptions']()).toBe(expected); }); }); diff --git a/__tests__/distributors/zulu-linux-installer.test.ts b/__tests__/distributors/zulu-linux-installer.test.ts index b3ca6fa1..e3bbea0f 100644 --- a/__tests__/distributors/zulu-linux-installer.test.ts +++ b/__tests__/distributors/zulu-linux-installer.test.ts @@ -46,7 +46,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&ext=zip&bundle_type=jdk&javafx=false&arch=x86&hw_bitness=32&release_status=ga' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -55,7 +55,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&ext=zip&bundle_type=jdk&javafx=false&arch=x86&hw_bitness=32&release_status=ea' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=1000' ], [ { @@ -64,7 +64,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&ext=zip&bundle_type=jdk&javafx=false&arch=x86&hw_bitness=64&release_status=ga' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -73,7 +73,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=linux&ext=zip&bundle_type=jre&javafx=false&arch=x86&hw_bitness=64&release_status=ga' + '?os=linux&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -82,7 +82,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=linux&ext=zip&bundle_type=jdk&javafx=true&arch=x86&hw_bitness=64&release_status=ga&features=fx' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -91,7 +91,7 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=linux&ext=zip&bundle_type=jre&javafx=true&arch=x86&hw_bitness=64&release_status=ga&features=fx' + '?os=linux&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -100,7 +100,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&ext=zip&bundle_type=jdk&javafx=false&arch=arm&hw_bitness=64&release_status=ga' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -109,12 +109,12 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&ext=zip&bundle_type=jdk&javafx=false&arch=arm&hw_bitness=&release_status=ga' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=1000' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); distribution['getPlatformOption'] = () => 'linux'; - const buildUrl = `https://api.azul.com/zulu/download/community/v1.0/bundles/${parsedUrl}`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/${parsedUrl}`; await distribution['getAvailableVersions'](); @@ -122,16 +122,12 @@ describe('getAvailableVersions', () => { expect(spyHttpClient.mock.calls[0][0]).toBe(buildUrl); }); - type DistroArch = { - bitness: string; - arch: string; - }; it.each([ - ['amd64', {bitness: '64', arch: 'x86'}], - ['arm64', {bitness: '64', arch: 'arm'}] + ['amd64', 'x64'], + ['arm64', 'aarch64'] ])( 'defaults to os.arch(): %s mapped to distro arch: %s', - async (osArch: string, distroArch: DistroArch) => { + async (osArch: string, distroArch: string) => { jest .spyOn(os, 'arch') .mockReturnValue(osArch as ReturnType); @@ -145,7 +141,7 @@ describe('getAvailableVersions', () => { distribution['getPlatformOption'] = () => 'linux'; // Override extension for linux default arch case to match util behavior spyUtilGetDownloadArchiveExtension.mockReturnValue('tar.gz'); - const buildUrl = `https://api.azul.com/zulu/download/community/v1.0/bundles/?os=linux&ext=tar.gz&bundle_type=jdk&javafx=false&arch=${distroArch.arch}&hw_bitness=${distroArch.bitness}&release_status=ga`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=linux&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=1000`; await distribution['getAvailableVersions'](); @@ -168,10 +164,11 @@ describe('getAvailableVersions', () => { describe('getArchitectureOptions', () => { it.each([ - [{architecture: 'x64'}, {arch: 'x86', hw_bitness: '64', abi: ''}], - [{architecture: 'x86'}, {arch: 'x86', hw_bitness: '32', abi: ''}], - [{architecture: 'x32'}, {arch: 'x32', hw_bitness: '', abi: ''}], - [{architecture: 'arm'}, {arch: 'arm', hw_bitness: '', abi: ''}] + [{architecture: 'x64'}, 'x64'], + [{architecture: 'x86'}, 'x86'], + [{architecture: 'aarch64'}, 'aarch64'], + [{architecture: 'arm64'}, 'aarch64'], + [{architecture: 'arm'}, 'arm'] ])('%s -> %s', (input, expected) => { const distribution = new ZuluDistribution({ version: '11', @@ -179,7 +176,7 @@ describe('getArchitectureOptions', () => { packageType: 'jdk', checkLatest: false }); - expect(distribution['getArchitectureOptions']()).toEqual(expected); + expect(distribution['getArchitectureOptions']()).toBe(expected); }); }); diff --git a/__tests__/distributors/zulu-windows-installer.test.ts b/__tests__/distributors/zulu-windows-installer.test.ts index 37435e8d..bc454c99 100644 --- a/__tests__/distributors/zulu-windows-installer.test.ts +++ b/__tests__/distributors/zulu-windows-installer.test.ts @@ -46,7 +46,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&ext=zip&bundle_type=jdk&javafx=false&arch=x86&hw_bitness=32&release_status=ga' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -55,7 +55,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&ext=zip&bundle_type=jdk&javafx=false&arch=x86&hw_bitness=32&release_status=ea' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=1000' ], [ { @@ -64,7 +64,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&ext=zip&bundle_type=jdk&javafx=false&arch=x86&hw_bitness=64&release_status=ga' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -73,7 +73,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=windows&ext=zip&bundle_type=jre&javafx=false&arch=x86&hw_bitness=64&release_status=ga' + '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -82,7 +82,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=windows&ext=zip&bundle_type=jdk&javafx=true&arch=x86&hw_bitness=64&release_status=ga&features=fx' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -91,7 +91,7 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=windows&ext=zip&bundle_type=jre&javafx=true&arch=x86&hw_bitness=64&release_status=ga&features=fx' + '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -100,7 +100,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&ext=zip&bundle_type=jdk&javafx=false&arch=arm&hw_bitness=64&release_status=ga' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=1000' ], [ { @@ -109,12 +109,12 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&ext=zip&bundle_type=jdk&javafx=false&arch=arm&hw_bitness=&release_status=ga' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=1000' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); distribution['getPlatformOption'] = () => 'windows'; - const buildUrl = `https://api.azul.com/zulu/download/community/v1.0/bundles/${parsedUrl}`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/${parsedUrl}`; await distribution['getAvailableVersions'](); @@ -122,16 +122,12 @@ describe('getAvailableVersions', () => { expect(spyHttpClient.mock.calls[0][0]).toBe(buildUrl); }); - type DistroArch = { - bitness: string; - arch: string; - }; it.each([ - ['amd64', {bitness: '64', arch: 'x86'}], - ['arm64', {bitness: '64', arch: 'arm'}] + ['amd64', 'x64'], + ['arm64', 'aarch64'] ])( 'defaults to os.arch(): %s mapped to distro arch: %s', - async (osArch: string, distroArch: DistroArch) => { + async (osArch: string, distroArch: string) => { jest .spyOn(os, 'arch') .mockReturnValue(osArch as ReturnType); @@ -143,7 +139,7 @@ describe('getAvailableVersions', () => { checkLatest: false }); distribution['getPlatformOption'] = () => 'windows'; - const buildUrl = `https://api.azul.com/zulu/download/community/v1.0/bundles/?os=windows&ext=zip&bundle_type=jdk&javafx=false&arch=${distroArch.arch}&hw_bitness=${distroArch.bitness}&release_status=ga`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=1000`; await distribution['getAvailableVersions'](); @@ -166,10 +162,11 @@ describe('getAvailableVersions', () => { describe('getArchitectureOptions', () => { it.each([ - [{architecture: 'x64'}, {arch: 'x86', hw_bitness: '64', abi: ''}], - [{architecture: 'x86'}, {arch: 'x86', hw_bitness: '32', abi: ''}], - [{architecture: 'x32'}, {arch: 'x32', hw_bitness: '', abi: ''}], - [{architecture: 'arm'}, {arch: 'arm', hw_bitness: '', abi: ''}] + [{architecture: 'x64'}, 'x64'], + [{architecture: 'x86'}, 'x86'], + [{architecture: 'aarch64'}, 'aarch64'], + [{architecture: 'arm64'}, 'aarch64'], + [{architecture: 'arm'}, 'arm'] ])('%s -> %s', (input, expected) => { const distribution = new ZuluDistribution({ version: '11', @@ -177,7 +174,7 @@ describe('getArchitectureOptions', () => { packageType: 'jdk', checkLatest: false }); - expect(distribution['getArchitectureOptions']()).toEqual(expected); + expect(distribution['getArchitectureOptions']()).toBe(expected); }); }); diff --git a/src/distributions/zulu/installer.ts b/src/distributions/zulu/installer.ts index 83f87946..60274ce6 100644 --- a/src/distributions/zulu/installer.ts +++ b/src/distributions/zulu/installer.ts @@ -31,16 +31,16 @@ export class ZuluDistribution extends JavaBase { const availableVersionsRaw = await this.getAvailableVersions(); const availableVersions = availableVersionsRaw.map(item => { return { - version: convertVersionToSemver(item.jdk_version), - url: item.url, - zuluVersion: convertVersionToSemver(item.zulu_version) + version: convertVersionToSemver(item.java_version), + url: item.download_url, + zuluVersion: convertVersionToSemver(item.distro_version) }; }); const satisfiedVersions = availableVersions .filter(item => isVersionSatisfies(version, item.version)) .sort((a, b) => { - // Azul provides two versions: jdk_version and azul_version + // Azul provides two versions: java_version and distro_version // we should sort by both fields by descending return ( -semver.compareBuild(a.version, b.version) || @@ -95,7 +95,7 @@ export class ZuluDistribution extends JavaBase { } private async getAvailableVersions(): Promise { - const {arch, hw_bitness, abi} = this.getArchitectureOptions(); + const arch = this.getArchitectureOptions(); const [bundleType, features] = this.packageType.split('+'); const platform = this.getPlatformOption(); const extension = getDownloadArchiveExtension(); @@ -108,19 +108,17 @@ export class ZuluDistribution extends JavaBase { const requestArguments = [ `os=${platform}`, - `ext=${extension}`, - `bundle_type=${bundleType}`, - `javafx=${javafx}`, + `archive_type=${extension}`, + `java_package_type=${bundleType}`, + `javafx_bundled=${javafx}`, `arch=${arch}`, - `hw_bitness=${hw_bitness}`, `release_status=${releaseStatus}`, - abi ? `abi=${abi}` : null, - features ? `features=${features}` : null - ] - .filter(Boolean) - .join('&'); + `availability_types=ca`, + `page=1`, + `page_size=1000` + ].join('&'); - const availableVersionsUrl = `https://api.azul.com/zulu/download/community/v1.0/bundles/?${requestArguments}`; + const availableVersionsUrl = `https://api.azul.com/metadata/v1/zulu/packages/?${requestArguments}`; core.debug(`Gathering available versions from '${availableVersionsUrl}'`); @@ -133,7 +131,7 @@ export class ZuluDistribution extends JavaBase { console.timeEnd('Retrieving available versions for Zulu took'); // eslint-disable-line no-console core.debug(`Available versions: [${availableVersions.length}]`); core.debug( - availableVersions.map(item => item.jdk_version.join('.')).join(', ') + availableVersions.map(item => item.java_version.join('.')).join(', ') ); core.endGroup(); } @@ -141,22 +139,18 @@ export class ZuluDistribution extends JavaBase { return availableVersions; } - private getArchitectureOptions(): { - arch: string; - hw_bitness: string; - abi: string; - } { + private getArchitectureOptions(): string { const arch = this.distributionArchitecture(); switch (arch) { case 'x64': - return {arch: 'x86', hw_bitness: '64', abi: ''}; + return 'x64'; case 'x86': - return {arch: 'x86', hw_bitness: '32', abi: ''}; + return 'x86'; case 'aarch64': case 'arm64': - return {arch: 'arm', hw_bitness: '64', abi: ''}; + return 'aarch64'; default: - return {arch: arch, hw_bitness: '', abi: ''}; + return arch; } } diff --git a/src/distributions/zulu/models.ts b/src/distributions/zulu/models.ts index a97406f0..92808cd5 100644 --- a/src/distributions/zulu/models.ts +++ b/src/distributions/zulu/models.ts @@ -1,9 +1,11 @@ -// Models from https://app.swaggerhub.com/apis-docs/azul/zulu-download-community/1.0 +// Models from https://app.swaggerhub.com/apis/azul/metadata/1.0 export interface IZuluVersions { - id: number; + package_uuid: string; name: string; - url: string; - jdk_version: Array; - zulu_version: Array; + download_url: string; + java_version: Array; + distro_version: Array; + latest: boolean; + availability_type: string; } From 9b714461d6e5987bf8d40660ca66ff690948c339 Mon Sep 17 00:00:00 2001 From: James Wald Date: Thu, 28 May 2026 20:40:24 -0400 Subject: [PATCH 2/8] Document arm64 -> aarch64 mapping in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 50147b5a..42ceeee2 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ Currently, the following distributions are supported: > [!NOTE] > - The different distributors can provide discrepant list of available versions / supported configurations. Please refer to the official documentation to see the list of supported versions. > - AdoptOpenJDK got moved to Eclipse Temurin and won't be updated anymore. It is highly recommended to migrate workflows from `adopt` and `adopt-openj9`, to `temurin` and `semeru` respectively, to keep receiving software and security updates. See more details in the [Good-bye AdoptOpenJDK post](https://blog.adoptopenjdk.net/2021/08/goodbye-adoptopenjdk-hello-adoptium/). -> - For Azul Zulu OpenJDK architectures x64 and arm64 are mapped to x86 / arm with proper hw_bitness. +> - For Azul Zulu OpenJDK, architecture `arm64` is mapped to `aarch64` when querying the Azul Metadata API. > - To comply with the GraalVM Free Terms and Conditions (GFTC) license, it is recommended to use GraalVM JDK 17 version 17.0.12, as this is the only version of GraalVM JDK 17 available under the GFTC license. Additionally, it is encouraged to consider upgrading to GraalVM JDK 21, which offers the latest features and improvements. **NOTE:** Oracle JDK 17 licensing varies by patch level. As shown on the [JDK 17 Archive](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) (versions up to 17.0.12 are under the [NFTC](https://www.oracle.com/downloads/licenses/no-fee-license.html) license) and the [JDK 17.0.13+ Archive](https://www.oracle.com/java/technologies/javase/jdk17-0-13-later-archive-downloads.html) (versions 17.0.13 and later are under the [OTN](https://www.oracle.com/downloads/licenses/javase-license1.html) license). To stay on the free NFTC license, use `distribution: 'oracle'` with `java-version: '17.0.12'` (or earlier) instead of the floating `'17'`. Alternatively, upgrade to Oracle JDK 21+, which remains under the NFTC license. From 5130540fc599ff31bc0054be33917a3225d6d668 Mon Sep 17 00:00:00 2001 From: James Wald Date: Thu, 28 May 2026 21:03:20 -0400 Subject: [PATCH 3/8] Paginate through all available versions --- __tests__/distributors/zulu-installer.test.ts | 32 +++++++++++------ .../distributors/zulu-linux-installer.test.ts | 32 +++++++++++------ .../zulu-windows-installer.test.ts | 32 +++++++++++------ src/distributions/zulu/installer.ts | 34 ++++++++++++++----- 4 files changed, 91 insertions(+), 39 deletions(-) diff --git a/__tests__/distributors/zulu-installer.test.ts b/__tests__/distributors/zulu-installer.test.ts index 50976b37..95e7e436 100644 --- a/__tests__/distributors/zulu-installer.test.ts +++ b/__tests__/distributors/zulu-installer.test.ts @@ -17,7 +17,7 @@ describe('getAvailableVersions', () => { spyHttpClient.mockReturnValue({ statusCode: 200, headers: {}, - result: manifestData as IZuluVersions[] + result: [] as IZuluVersions[] }); spyUtilGetDownloadArchiveExtension = jest.spyOn( @@ -45,7 +45,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -54,7 +54,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' ], [ { @@ -63,7 +63,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -72,7 +72,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -81,7 +81,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -90,7 +90,7 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -99,7 +99,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -108,7 +108,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); @@ -138,7 +138,7 @@ describe('getAvailableVersions', () => { checkLatest: false }); distribution['getPlatformOption'] = () => 'macos'; - const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=1000`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; await distribution['getAvailableVersions'](); @@ -148,6 +148,18 @@ describe('getAvailableVersions', () => { ); it('load available versions', async () => { + spyHttpClient + .mockReturnValueOnce({ + statusCode: 200, + headers: {}, + result: manifestData as IZuluVersions[] + }) + .mockReturnValueOnce({ + statusCode: 200, + headers: {}, + result: [] as IZuluVersions[] + }); + const distribution = new ZuluDistribution({ version: '11', architecture: 'x86', diff --git a/__tests__/distributors/zulu-linux-installer.test.ts b/__tests__/distributors/zulu-linux-installer.test.ts index e3bbea0f..46f1bae9 100644 --- a/__tests__/distributors/zulu-linux-installer.test.ts +++ b/__tests__/distributors/zulu-linux-installer.test.ts @@ -18,7 +18,7 @@ describe('getAvailableVersions', () => { spyHttpClient.mockReturnValue({ statusCode: 200, headers: {}, - result: manifestData as IZuluVersions[] + result: [] as IZuluVersions[] }); spyUtilGetDownloadArchiveExtension = jest.spyOn( @@ -46,7 +46,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -55,7 +55,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' ], [ { @@ -64,7 +64,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -73,7 +73,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -82,7 +82,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -91,7 +91,7 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -100,7 +100,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -109,7 +109,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); @@ -141,7 +141,7 @@ describe('getAvailableVersions', () => { distribution['getPlatformOption'] = () => 'linux'; // Override extension for linux default arch case to match util behavior spyUtilGetDownloadArchiveExtension.mockReturnValue('tar.gz'); - const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=linux&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=1000`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=linux&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; await distribution['getAvailableVersions'](); @@ -151,6 +151,18 @@ describe('getAvailableVersions', () => { ); it('load available versions', async () => { + spyHttpClient + .mockReturnValueOnce({ + statusCode: 200, + headers: {}, + result: manifestData as IZuluVersions[] + }) + .mockReturnValueOnce({ + statusCode: 200, + headers: {}, + result: [] as IZuluVersions[] + }); + const distribution = new ZuluDistribution({ version: '11', architecture: 'x86', diff --git a/__tests__/distributors/zulu-windows-installer.test.ts b/__tests__/distributors/zulu-windows-installer.test.ts index bc454c99..441c0cdc 100644 --- a/__tests__/distributors/zulu-windows-installer.test.ts +++ b/__tests__/distributors/zulu-windows-installer.test.ts @@ -18,7 +18,7 @@ describe('getAvailableVersions', () => { spyHttpClient.mockReturnValue({ statusCode: 200, headers: {}, - result: manifestData as IZuluVersions[] + result: [] as IZuluVersions[] }); spyUtilGetDownloadArchiveExtension = jest.spyOn( @@ -46,7 +46,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -55,7 +55,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' ], [ { @@ -64,7 +64,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -73,7 +73,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -82,7 +82,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -91,7 +91,7 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -100,7 +100,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -109,7 +109,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=1000' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); @@ -139,7 +139,7 @@ describe('getAvailableVersions', () => { checkLatest: false }); distribution['getPlatformOption'] = () => 'windows'; - const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=1000`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; await distribution['getAvailableVersions'](); @@ -149,6 +149,18 @@ describe('getAvailableVersions', () => { ); it('load available versions', async () => { + spyHttpClient + .mockReturnValueOnce({ + statusCode: 200, + headers: {}, + result: manifestData as IZuluVersions[] + }) + .mockReturnValueOnce({ + statusCode: 200, + headers: {}, + result: [] as IZuluVersions[] + }); + const distribution = new ZuluDistribution({ version: '11', architecture: 'x86', diff --git a/src/distributions/zulu/installer.ts b/src/distributions/zulu/installer.ts index 60274ce6..d37caf94 100644 --- a/src/distributions/zulu/installer.ts +++ b/src/distributions/zulu/installer.ts @@ -106,25 +106,41 @@ export class ZuluDistribution extends JavaBase { console.time('Retrieving available versions for Zulu took'); // eslint-disable-line no-console } - const requestArguments = [ + const baseRequestArguments = [ `os=${platform}`, `archive_type=${extension}`, `java_package_type=${bundleType}`, `javafx_bundled=${javafx}`, `arch=${arch}`, `release_status=${releaseStatus}`, - `availability_types=ca`, - `page=1`, - `page_size=1000` + `availability_types=ca` ].join('&'); - const availableVersionsUrl = `https://api.azul.com/metadata/v1/zulu/packages/?${requestArguments}`; + // need to iterate through all pages to retrieve the list of all versions + // Azul API doesn't provide a way to retrieve the count of pages so use an infinity loop + let page_index = 1; + const availableVersions: IZuluVersions[] = []; + while (true) { + const requestArguments = `${baseRequestArguments}&page=${page_index}&page_size=100`; + const availableVersionsUrl = `https://api.azul.com/metadata/v1/zulu/packages/?${requestArguments}`; + if (core.isDebug() && page_index === 1) { + // url is identical except page_index so print it once for debug + core.debug( + `Gathering available versions from '${availableVersionsUrl}'` + ); + } - core.debug(`Gathering available versions from '${availableVersionsUrl}'`); + const paginationPage = ( + await this.http.getJson(availableVersionsUrl) + ).result; + if (paginationPage === null || paginationPage.length === 0) { + // break infinity loop because we have reached end of pagination + break; + } - const availableVersions = - (await this.http.getJson>(availableVersionsUrl)) - .result ?? []; + availableVersions.push(...paginationPage); + page_index++; + } if (core.isDebug()) { core.startGroup('Print information about available versions'); From 47eb4375f237c7d203cc6c981321fa6813100e3b Mon Sep 17 00:00:00 2001 From: James Wald Date: Thu, 28 May 2026 21:11:15 -0400 Subject: [PATCH 4/8] Fix typo: win_aarhc4 --- __tests__/data/zulu-windows.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/data/zulu-windows.json b/__tests__/data/zulu-windows.json index 5252af16..7e44242f 100644 --- a/__tests__/data/zulu-windows.json +++ b/__tests__/data/zulu-windows.json @@ -666,7 +666,7 @@ }, { "package_uuid": "test-uuid-12446", - "name": "zulu17.48.15-ca-jdk17.0.10-win_aarhc4.zip", + "name": "zulu17.48.15-ca-jdk17.0.10-win_aarch64.zip", "download_url": "https://cdn.azul.com/zulu/bin/zulu17.48.15-ca-jdk17.0.10-windows_aarch64.zip", "java_version": [ 17, From 7793aaa6a66f0446bf22fe843177d6445c41f22e Mon Sep 17 00:00:00 2001 From: James Wald Date: Fri, 29 May 2026 07:28:09 -0400 Subject: [PATCH 5/8] Only query for linux_glibc packages --- .../distributors/zulu-linux-installer.test.ts | 22 +++++++++---------- src/distributions/zulu/installer.ts | 4 ++++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/__tests__/distributors/zulu-linux-installer.test.ts b/__tests__/distributors/zulu-linux-installer.test.ts index 46f1bae9..897497f9 100644 --- a/__tests__/distributors/zulu-linux-installer.test.ts +++ b/__tests__/distributors/zulu-linux-installer.test.ts @@ -46,7 +46,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -55,7 +55,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' ], [ { @@ -64,7 +64,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -73,7 +73,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -82,7 +82,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -91,7 +91,7 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -100,7 +100,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -109,11 +109,11 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); - distribution['getPlatformOption'] = () => 'linux'; + distribution['getPlatformOption'] = () => 'linux_glibc'; const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/${parsedUrl}`; await distribution['getAvailableVersions'](); @@ -138,10 +138,10 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }); - distribution['getPlatformOption'] = () => 'linux'; + distribution['getPlatformOption'] = () => 'linux_glibc'; // Override extension for linux default arch case to match util behavior spyUtilGetDownloadArchiveExtension.mockReturnValue('tar.gz'); - const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=linux&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=linux_glibc&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; await distribution['getAvailableVersions'](); diff --git a/src/distributions/zulu/installer.ts b/src/distributions/zulu/installer.ts index d37caf94..61ad9019 100644 --- a/src/distributions/zulu/installer.ts +++ b/src/distributions/zulu/installer.ts @@ -177,6 +177,10 @@ export class ZuluDistribution extends JavaBase { return 'macos'; case 'win32': return 'windows'; + case 'linux': + // The new Metadata API's "linux" value returns both glibc and musl packages; + // use "linux_glibc" to target only glibc, which is what standard runners use. + return 'linux_glibc'; default: return process.platform; } From d62bb2d1064bb2a46c454b2ac5d88387884905cb Mon Sep 17 00:00:00 2001 From: Bruno Borges Date: Mon, 22 Jun 2026 14:03:56 -0400 Subject: [PATCH 6/8] Add Zulu CRaC package support to metadata migration Fold CRaC-related work into the Zulu metadata API migration by wiring crac_supported query handling, extending Zulu package docs, and updating installer tests for jdk+crac/jre+crac behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- README.md | 2 +- __tests__/distributors/zulu-installer.test.ts | 27 ++++++++++++------- .../distributors/zulu-linux-installer.test.ts | 27 ++++++++++++------- .../zulu-windows-installer.test.ts | 27 ++++++++++++------- action.yml | 2 +- docs/advanced-usage.md | 2 +- src/distributions/zulu/installer.ts | 2 ++ 7 files changed, 59 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 42ceeee2..878ee610 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ For information about the latest releases, recent updates, and newly supported d - `distribution`: _(required)_ Java [distribution](#supported-distributions). - - `java-package`: The packaging variant of the chosen distribution. Possible values: `jdk`, `jre`, `jdk+fx`, `jre+fx`. Default value: `jdk`. + - `java-package`: The packaging variant of the chosen distribution. Possible values: `jdk`, `jre`, `jdk+fx`, `jre+fx`. For Azul Zulu, `jdk+crac` and `jre+crac` are also supported. Default value: `jdk`. - `architecture`: The target architecture of the package. Possible values: `x86`, `x64`, `armv7`, `aarch64`, `ppc64le`. Default value: Derived from the runner machine. diff --git a/__tests__/distributors/zulu-installer.test.ts b/__tests__/distributors/zulu-installer.test.ts index 95e7e436..16f4c63f 100644 --- a/__tests__/distributors/zulu-installer.test.ts +++ b/__tests__/distributors/zulu-installer.test.ts @@ -45,7 +45,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -54,7 +54,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' ], [ { @@ -63,7 +63,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -72,7 +72,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=false&crac_supported=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -81,7 +81,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=true&crac_supported=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -90,7 +90,16 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=macos&archive_type=tar.gz&java_package_type=jre&javafx_bundled=true&crac_supported=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + ], + [ + { + version: '8', + architecture: 'x64', + packageType: 'jdk+crac', + checkLatest: false + }, + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&crac_supported=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -99,7 +108,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -108,7 +117,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); @@ -138,7 +147,7 @@ describe('getAvailableVersions', () => { checkLatest: false }); distribution['getPlatformOption'] = () => 'macos'; - const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=macos&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; await distribution['getAvailableVersions'](); diff --git a/__tests__/distributors/zulu-linux-installer.test.ts b/__tests__/distributors/zulu-linux-installer.test.ts index 897497f9..470de81e 100644 --- a/__tests__/distributors/zulu-linux-installer.test.ts +++ b/__tests__/distributors/zulu-linux-installer.test.ts @@ -46,7 +46,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -55,7 +55,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' ], [ { @@ -64,7 +64,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -73,7 +73,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=linux_glibc&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jre&javafx_bundled=false&crac_supported=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -82,7 +82,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=true&crac_supported=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -91,7 +91,16 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=linux_glibc&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jre&javafx_bundled=true&crac_supported=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + ], + [ + { + version: '8', + architecture: 'x64', + packageType: 'jdk+crac', + checkLatest: false + }, + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -100,7 +109,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -109,7 +118,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=linux_glibc&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); @@ -141,7 +150,7 @@ describe('getAvailableVersions', () => { distribution['getPlatformOption'] = () => 'linux_glibc'; // Override extension for linux default arch case to match util behavior spyUtilGetDownloadArchiveExtension.mockReturnValue('tar.gz'); - const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=linux_glibc&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=linux_glibc&archive_type=tar.gz&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; await distribution['getAvailableVersions'](); diff --git a/__tests__/distributors/zulu-windows-installer.test.ts b/__tests__/distributors/zulu-windows-installer.test.ts index 441c0cdc..a54f55fe 100644 --- a/__tests__/distributors/zulu-windows-installer.test.ts +++ b/__tests__/distributors/zulu-windows-installer.test.ts @@ -46,7 +46,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=x86&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -55,7 +55,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=x86&release_status=ea&availability_types=ca&page=1&page_size=100' ], [ { @@ -64,7 +64,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -73,7 +73,7 @@ describe('getAvailableVersions', () => { packageType: 'jre', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=false&crac_supported=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -82,7 +82,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk+fx', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=true&crac_supported=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -91,7 +91,16 @@ describe('getAvailableVersions', () => { packageType: 'jre+fx', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=windows&archive_type=zip&java_package_type=jre&javafx_bundled=true&crac_supported=false&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' + ], + [ + { + version: '8', + architecture: 'x64', + packageType: 'jdk+crac', + checkLatest: false + }, + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=true&arch=x64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -100,7 +109,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=aarch64&release_status=ga&availability_types=ca&page=1&page_size=100' ], [ { @@ -109,7 +118,7 @@ describe('getAvailableVersions', () => { packageType: 'jdk', checkLatest: false }, - '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' + '?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=arm&release_status=ga&availability_types=ca&page=1&page_size=100' ] ])('build correct url for %s -> %s', async (input, parsedUrl) => { const distribution = new ZuluDistribution(input); @@ -139,7 +148,7 @@ describe('getAvailableVersions', () => { checkLatest: false }); distribution['getPlatformOption'] = () => 'windows'; - const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; + const buildUrl = `https://api.azul.com/metadata/v1/zulu/packages/?os=windows&archive_type=zip&java_package_type=jdk&javafx_bundled=false&crac_supported=false&arch=${distroArch}&release_status=ga&availability_types=ca&page=1&page_size=100`; await distribution['getAvailableVersions'](); diff --git a/action.yml b/action.yml index d5f46bbe..dee0ccb7 100644 --- a/action.yml +++ b/action.yml @@ -13,7 +13,7 @@ inputs: description: 'Java distribution. See the list of supported distributions in README file' required: true java-package: - description: 'The package type (jdk, jre, jdk+fx, jre+fx)' + description: 'The package type (jdk, jre, jdk+fx, jre+fx, jdk+crac, jre+crac)' required: false default: 'jdk' architecture: diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index 1b1e4fee..80835876 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -61,7 +61,7 @@ steps: with: distribution: 'zulu' java-version: '21' - java-package: jdk # optional (jdk, jre, jdk+fx or jre+fx) - defaults to jdk + java-package: jdk # optional (jdk, jre, jdk+fx, jre+fx, jdk+crac or jre+crac) - defaults to jdk - run: java -cp java HelloWorldApp ``` diff --git a/src/distributions/zulu/installer.ts b/src/distributions/zulu/installer.ts index 61ad9019..8155010b 100644 --- a/src/distributions/zulu/installer.ts +++ b/src/distributions/zulu/installer.ts @@ -100,6 +100,7 @@ export class ZuluDistribution extends JavaBase { const platform = this.getPlatformOption(); const extension = getDownloadArchiveExtension(); const javafx = features?.includes('fx') ?? false; + const crac = features?.includes('crac') ?? false; const releaseStatus = this.stable ? 'ga' : 'ea'; if (core.isDebug()) { @@ -111,6 +112,7 @@ export class ZuluDistribution extends JavaBase { `archive_type=${extension}`, `java_package_type=${bundleType}`, `javafx_bundled=${javafx}`, + `crac_supported=${crac}`, `arch=${arch}`, `release_status=${releaseStatus}`, `availability_types=ca` From 4c33a67a01aa6006fa7102003a34b60be057f96b Mon Sep 17 00:00:00 2001 From: Bruno Borges Date: Mon, 22 Jun 2026 14:16:50 -0400 Subject: [PATCH 7/8] Harden Zulu metadata pagination with safety cap - Stop paginating on a short page to avoid an extra empty request - Guard against undefined results (not just null) - Cap iterations at 100 pages and warn if the limit is hit to prevent a runaway loop if the API misbehaves Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- dist/cleanup/index.js | 415 ++++++++++++++++------- dist/setup/index.js | 490 ++++++++++++++++++++-------- src/distributions/zulu/installer.ts | 35 +- 3 files changed, 686 insertions(+), 254 deletions(-) diff --git a/dist/cleanup/index.js b/dist/cleanup/index.js index 5a1db963..0c327816 100644 --- a/dist/cleanup/index.js +++ b/dist/cleanup/index.js @@ -28337,8 +28337,6 @@ function defaultFactory (origin, opts) { class Agent extends DispatcherBase { constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { - super() - if (typeof factory !== 'function') { throw new InvalidArgumentError('factory must be a function.') } @@ -28351,6 +28349,8 @@ class Agent extends DispatcherBase { throw new InvalidArgumentError('maxRedirections must be a positive number') } + super(options) + if (connect && typeof connect !== 'function') { connect = { ...connect } } @@ -28724,6 +28724,9 @@ const EMPTY_BUF = Buffer.alloc(0) const FastBuffer = Buffer[Symbol.species] const addListener = util.addListener const removeAllListeners = util.removeAllListeners +const kIdleSocketValidation = Symbol('kIdleSocketValidation') +const kIdleSocketValidationTimeout = Symbol('kIdleSocketValidationTimeout') +const kSocketUsed = Symbol('kSocketUsed') let extractBody @@ -28946,29 +28949,71 @@ class Parser { const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)) - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true - socket.unshift(data.slice(offset)) - } else if (ret !== constants.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr) - let message = '' - /* istanbul ignore else: difficult to make a test case for */ - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0) - message = - 'Response does not match the HTTP/1.1 protocol (' + - Buffer.from(llhttp.memory.buffer, ptr, len).toString() + - ')' + if (ret !== constants.ERROR.OK) { + const body = data.subarray(offset) + + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(body) + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true + socket.unshift(body) + } else { + throw this.createError(ret, body) } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) } } catch (err) { util.destroy(socket, err) } } + finish () { + assert(currentParser === null) + assert(this.ptr != null) + assert(!this.paused) + + const { llhttp } = this + + let ret + + try { + currentParser = this + ret = llhttp.llhttp_finish(this.ptr) + } finally { + currentParser = null + } + + if (ret === constants.ERROR.OK) { + return null + } + + if (ret === constants.ERROR.PAUSED || ret === constants.ERROR.PAUSED_UPGRADE) { + this.paused = true + return null + } + + return this.createError(ret, EMPTY_BUF) + } + + createError (ret, data) { + const { llhttp, contentLength, bytesRead } = this + + if (contentLength && bytesRead !== parseInt(contentLength, 10)) { + return new ResponseContentLengthMismatchError() + } + + const ptr = llhttp.llhttp_get_error_reason(this.ptr) + let message = '' + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0) + message = + 'Response does not match the HTTP/1.1 protocol (' + + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + + ')' + } + + return new HTTPParserError(message, constants.ERROR[ret], data) + } + destroy () { assert(this.ptr != null) assert(currentParser == null) @@ -28996,6 +29041,11 @@ class Parser { return -1 } + if (client[kRunning] === 0) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) + return -1 + } + const request = client[kQueue][client[kRunningIdx]] if (!request) { return -1 @@ -29099,6 +29149,11 @@ class Parser { return -1 } + if (client[kRunning] === 0) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) + return -1 + } + const request = client[kQueue][client[kRunningIdx]] /* istanbul ignore next: difficult to make a test case for */ @@ -29272,6 +29327,7 @@ class Parser { request.onComplete(headers) client[kQueue][client[kRunningIdx]++] = null + socket[kSocketUsed] = true if (socket[kWriting]) { assert(client[kRunning] === 0) @@ -29330,6 +29386,9 @@ async function connectH1 (client, socket) { socket[kWriting] = false socket[kReset] = false socket[kBlocking] = false + socket[kIdleSocketValidation] = 0 + socket[kIdleSocketValidationTimeout] = null + socket[kSocketUsed] = false socket[kParser] = new Parser(client, socket, llhttpInstance) addListener(socket, 'error', function (err) { @@ -29340,8 +29399,11 @@ async function connectH1 (client, socket) { // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded // to the user. if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so for as a valid response. - parser.onMessageComplete() + const parserErr = parser.finish() + if (parserErr) { + this[kError] = parserErr + this[kClient][kOnError](parserErr) + } return } @@ -29360,8 +29422,10 @@ async function connectH1 (client, socket) { const parser = this[kParser] if (parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete() + const parserErr = parser.finish() + if (parserErr) { + util.destroy(this, parserErr) + } return } @@ -29371,10 +29435,11 @@ async function connectH1 (client, socket) { const client = this[kClient] const parser = this[kParser] + clearIdleSocketValidation(this) + if (parser) { if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete() + this[kError] = parser.finish() || this[kError] } this[kParser].destroy() @@ -29437,7 +29502,7 @@ async function connectH1 (client, socket) { return socket.destroyed }, busy (request) { - if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { + if (socket[kWriting] || socket[kReset] || socket[kBlocking] || socket[kIdleSocketValidation] === 1) { return true } @@ -29475,6 +29540,31 @@ async function connectH1 (client, socket) { } } +function clearIdleSocketValidation (socket) { + if (socket[kIdleSocketValidationTimeout]) { + clearTimeout(socket[kIdleSocketValidationTimeout]) + socket[kIdleSocketValidationTimeout] = null + } + + socket[kIdleSocketValidation] = 0 +} + +function scheduleIdleSocketValidation (client, socket) { + socket[kIdleSocketValidation] = 1 + socket[kIdleSocketValidationTimeout] = setTimeout(() => { + socket[kIdleSocketValidationTimeout] = null + socket[kIdleSocketValidation] = 2 + + if (client[kSocket] === socket && !socket.destroyed) { + client[kResume]() + } + }, 0) + socket[kIdleSocketValidationTimeout].unref?.() +} + +/** + * @param {import('./client.js')} client + */ function resumeH1 (client) { const socket = client[kSocket] @@ -29489,6 +29579,32 @@ function resumeH1 (client) { socket[kNoRef] = false } + if (client[kRunning] === 0 && client[kPending] > 0 && socket[kSocketUsed]) { + if (socket[kIdleSocketValidation] === 0) { + scheduleIdleSocketValidation(client, socket) + socket[kParser].readMore() + if (socket.destroyed) { + return + } + return + } + + if (socket[kIdleSocketValidation] === 1) { + socket[kParser].readMore() + if (socket.destroyed) { + return + } + return + } + } + + if (client[kRunning] === 0) { + socket[kParser].readMore() + if (socket.destroyed) { + return + } + } + if (client[kSize] === 0) { if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) { socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE) @@ -29582,6 +29698,7 @@ function writeH1 (client, request) { } const socket = client[kSocket] + clearIdleSocketValidation(socket) const abort = (err) => { if (request.aborted || request.completed) { @@ -30903,9 +31020,10 @@ class Client extends DispatcherBase { autoSelectFamilyAttemptTimeout, // h2 maxConcurrentStreams, - allowH2 + allowH2, + webSocket } = {}) { - super() + super({ webSocket }) if (keepAlive !== undefined) { throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') @@ -31438,15 +31556,24 @@ const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = __nc const kOnDestroyed = Symbol('onDestroyed') const kOnClosed = Symbol('onClosed') const kInterceptedDispatch = Symbol('Intercepted Dispatch') +const kWebSocketOptions = Symbol('webSocketOptions') class DispatcherBase extends Dispatcher { - constructor () { + constructor (opts) { super() this[kDestroyed] = false this[kOnDestroyed] = null this[kClosed] = false this[kOnClosed] = [] + this[kWebSocketOptions] = opts?.webSocket ?? {} + } + + get webSocketOptions () { + return { + maxFragments: this[kWebSocketOptions].maxFragments ?? 131072, + maxPayloadSize: this[kWebSocketOptions].maxPayloadSize ?? 128 * 1024 * 1024 + } } get destroyed () { @@ -32010,8 +32137,8 @@ const kRemoveClient = Symbol('remove client') const kStats = Symbol('stats') class PoolBase extends DispatcherBase { - constructor () { - super() + constructor (opts) { + super(opts) this[kQueue] = new FixedQueue() this[kClients] = [] @@ -32271,8 +32398,6 @@ class Pool extends PoolBase { allowH2, ...options } = {}) { - super() - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { throw new InvalidArgumentError('invalid connections') } @@ -32297,6 +32422,8 @@ class Pool extends PoolBase { }) } + super(options) + this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool) ? options.interceptors.Pool : [] @@ -37381,32 +37508,25 @@ function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) // If the attribute-name case-insensitively matches the string // "SameSite", the user agent MUST process the cookie-av as follows: - // 1. Let enforcement be "Default". - let enforcement = 'Default' - const attributeValueLowercase = attributeValue.toLowerCase() - // 2. If cookie-av's attribute-value is a case-insensitive match for - // "None", set enforcement to "None". - if (attributeValueLowercase.includes('none')) { - enforcement = 'None' - } - // 3. If cookie-av's attribute-value is a case-insensitive match for - // "Strict", set enforcement to "Strict". - if (attributeValueLowercase.includes('strict')) { - enforcement = 'Strict' + // 1. If cookie-av's attribute-value is a case-insensitive match for + // "None", append an attribute to the cookie-attribute-list with an + // attribute-name of "SameSite" and an attribute-value of "None". + if (attributeValueLowercase === 'none') { + cookieAttributeList.sameSite = 'None' + } else if (attributeValueLowercase === 'strict') { + // 2. If cookie-av's attribute-value is a case-insensitive match for + // "Strict", append an attribute to the cookie-attribute-list with + // an attribute-name of "SameSite" and an attribute-value of + // "Strict". + cookieAttributeList.sameSite = 'Strict' + } else if (attributeValueLowercase === 'lax') { + // 3. If cookie-av's attribute-value is a case-insensitive match for + // "Lax", append an attribute to the cookie-attribute-list with an + // attribute-name of "SameSite" and an attribute-value of "Lax". + cookieAttributeList.sameSite = 'Lax' } - - // 4. If cookie-av's attribute-value is a case-insensitive match for - // "Lax", set enforcement to "Lax". - if (attributeValueLowercase.includes('lax')) { - enforcement = 'Lax' - } - - // 5. Append an attribute to the cookie-attribute-list with an - // attribute-name of "SameSite" and an attribute-value of - // enforcement. - cookieAttributeList.sameSite = enforcement } else { cookieAttributeList.unparsed ??= [] @@ -50112,40 +50232,35 @@ const tail = Buffer.from([0x00, 0x00, 0xff, 0xff]) const kBuffer = Symbol('kBuffer') const kLength = Symbol('kLength') -// Default maximum decompressed message size: 4 MB -const kDefaultMaxDecompressedSize = 4 * 1024 * 1024 - class PerMessageDeflate { /** @type {import('node:zlib').InflateRaw} */ #inflate #options = {} - /** @type {boolean} */ - #aborted = false - - /** @type {Function|null} */ - #currentCallback = null + #maxPayloadSize = 0 /** * @param {Map} extensions */ - constructor (extensions) { + constructor (extensions, options) { this.#options.serverNoContextTakeover = extensions.has('server_no_context_takeover') this.#options.serverMaxWindowBits = extensions.get('server_max_window_bits') + + this.#maxPayloadSize = options.maxPayloadSize } + /** + * Decompress a compressed payload. + * @param {Buffer} chunk Compressed data + * @param {boolean} fin Final fragment flag + * @param {Function} callback Callback function + */ decompress (chunk, fin, callback) { // An endpoint uses the following algorithm to decompress a message. // 1. Append 4 octets of 0x00 0x00 0xff 0xff to the tail end of the // payload of the message. // 2. Decompress the resulting data using DEFLATE. - - if (this.#aborted) { - callback(new MessageSizeExceededError()) - return - } - if (!this.#inflate) { let windowBits = Z_DEFAULT_WINDOWBITS @@ -50168,23 +50283,12 @@ class PerMessageDeflate { this.#inflate[kLength] = 0 this.#inflate.on('data', (data) => { - if (this.#aborted) { - return - } - this.#inflate[kLength] += data.length - if (this.#inflate[kLength] > kDefaultMaxDecompressedSize) { - this.#aborted = true + if (this.#maxPayloadSize > 0 && this.#inflate[kLength] > this.#maxPayloadSize) { + callback(new MessageSizeExceededError()) this.#inflate.removeAllListeners() - this.#inflate.destroy() this.#inflate = null - - if (this.#currentCallback) { - const cb = this.#currentCallback - this.#currentCallback = null - cb(new MessageSizeExceededError()) - } return } @@ -50197,14 +50301,13 @@ class PerMessageDeflate { }) } - this.#currentCallback = callback this.#inflate.write(chunk) if (fin) { this.#inflate.write(tail) } this.#inflate.flush(() => { - if (this.#aborted || !this.#inflate) { + if (!this.#inflate) { return } @@ -50212,7 +50315,6 @@ class PerMessageDeflate { this.#inflate[kBuffer].length = 0 this.#inflate[kLength] = 0 - this.#currentCallback = null callback(null, full) }) @@ -50248,6 +50350,12 @@ const { const { WebsocketFrameSend } = __nccwpck_require__(3264) const { closeWebSocketConnection } = __nccwpck_require__(86897) const { PerMessageDeflate } = __nccwpck_require__(19469) +const { MessageSizeExceededError } = __nccwpck_require__(68707) + +function failWebsocketConnectionWithCode (ws, code, reason) { + closeWebSocketConnection(ws, code, reason, Buffer.byteLength(reason)) + failWebsocketConnection(ws, reason) +} // This code was influenced by ws released under the MIT license. // Copyright (c) 2011 Einar Otto Stangvik @@ -50256,6 +50364,7 @@ const { PerMessageDeflate } = __nccwpck_require__(19469) class ByteParser extends Writable { #buffers = [] + #fragmentsBytes = 0 #byteOffset = 0 #loop = false @@ -50267,18 +50376,27 @@ class ByteParser extends Writable { /** @type {Map} */ #extensions + /** @type {number} */ + #maxFragments + + /** @type {number} */ + #maxPayloadSize + /** * @param {import('./websocket').WebSocket} ws * @param {Map|null} extensions + * @param {{ maxFragments?: number, maxPayloadSize?: number }} [options] */ - constructor (ws, extensions) { + constructor (ws, extensions, options = {}) { super() this.ws = ws this.#extensions = extensions == null ? new Map() : extensions + this.#maxFragments = options.maxFragments ?? 0 + this.#maxPayloadSize = options.maxPayloadSize ?? 0 if (this.#extensions.has('permessage-deflate')) { - this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions)) + this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions, options)) } } @@ -50294,6 +50412,19 @@ class ByteParser extends Writable { this.run(callback) } + #validatePayloadLength () { + if ( + this.#maxPayloadSize > 0 && + !isControlFrame(this.#info.opcode) && + this.#info.payloadLength + this.#fragmentsBytes > this.#maxPayloadSize + ) { + failWebsocketConnectionWithCode(this.ws, 1009, 'Payload size exceeds maximum allowed size') + return false + } + + return true + } + /** * Runs whenever a new chunk is received. * Callback is called whenever there are no more chunks buffering, @@ -50382,6 +50513,10 @@ class ByteParser extends Writable { if (payloadLength <= 125) { this.#info.payloadLength = payloadLength this.#state = parserStates.READ_DATA + + if (!this.#validatePayloadLength()) { + return + } } else if (payloadLength === 126) { this.#state = parserStates.PAYLOADLENGTH_16 } else if (payloadLength === 127) { @@ -50406,6 +50541,10 @@ class ByteParser extends Writable { this.#info.payloadLength = buffer.readUInt16BE(0) this.#state = parserStates.READ_DATA + + if (!this.#validatePayloadLength()) { + return + } } else if (this.#state === parserStates.PAYLOADLENGTH_64) { if (this.#byteOffset < 8) { return callback() @@ -50428,6 +50567,10 @@ class ByteParser extends Writable { this.#info.payloadLength = lower this.#state = parserStates.READ_DATA + + if (!this.#validatePayloadLength()) { + return + } } else if (this.#state === parserStates.READ_DATA) { if (this.#byteOffset < this.#info.payloadLength) { return callback() @@ -50440,42 +50583,58 @@ class ByteParser extends Writable { this.#state = parserStates.INFO } else { if (!this.#info.compressed) { - this.#fragments.push(body) + if (!this.writeFragments(body)) { + return + } + + if (this.#maxPayloadSize > 0 && this.#fragmentsBytes > this.#maxPayloadSize) { + failWebsocketConnectionWithCode(this.ws, 1009, new MessageSizeExceededError().message) + return + } // If the frame is not fragmented, a message has been received. // If the frame is fragmented, it will terminate with a fin bit set // and an opcode of 0 (continuation), therefore we handle that when // parsing continuation frames, not here. if (!this.#info.fragmented && this.#info.fin) { - const fullMessage = Buffer.concat(this.#fragments) - websocketMessageReceived(this.ws, this.#info.binaryType, fullMessage) - this.#fragments.length = 0 + websocketMessageReceived(this.ws, this.#info.binaryType, this.consumeFragments()) } this.#state = parserStates.INFO } else { - this.#extensions.get('permessage-deflate').decompress(body, this.#info.fin, (error, data) => { - if (error) { - failWebsocketConnection(this.ws, error.message) - return - } + this.#extensions.get('permessage-deflate').decompress( + body, + this.#info.fin, + (error, data) => { + if (error) { + const code = error instanceof MessageSizeExceededError ? 1009 : 1007 + failWebsocketConnectionWithCode(this.ws, code, error.message) + return + } - this.#fragments.push(data) + if (!this.writeFragments(data)) { + return + } + + if (this.#maxPayloadSize > 0 && this.#fragmentsBytes > this.#maxPayloadSize) { + failWebsocketConnectionWithCode(this.ws, 1009, new MessageSizeExceededError().message) + return + } + + if (!this.#info.fin) { + this.#state = parserStates.INFO + this.#loop = true + this.run(callback) + return + } + + websocketMessageReceived(this.ws, this.#info.binaryType, this.consumeFragments()) - if (!this.#info.fin) { - this.#state = parserStates.INFO this.#loop = true + this.#state = parserStates.INFO this.run(callback) - return } - - websocketMessageReceived(this.ws, this.#info.binaryType, Buffer.concat(this.#fragments)) - - this.#loop = true - this.#state = parserStates.INFO - this.#fragments.length = 0 - this.run(callback) - }) + ) this.#loop = false break @@ -50527,6 +50686,35 @@ class ByteParser extends Writable { return buffer } + writeFragments (fragment) { + if ( + this.#maxFragments > 0 && + this.#fragments.length === this.#maxFragments + ) { + failWebsocketConnectionWithCode(this.ws, 1008, 'Too many message fragments') + return false + } + + this.#fragmentsBytes += fragment.length + this.#fragments.push(fragment) + return true + } + + consumeFragments () { + const fragments = this.#fragments + + if (fragments.length === 1) { + this.#fragmentsBytes = 0 + return fragments.shift() + } + + const output = Buffer.concat(fragments, this.#fragmentsBytes) + this.#fragments = [] + this.#fragmentsBytes = 0 + + return output + } + parseCloseBody (data) { assert(data.length !== 1) @@ -51562,7 +51750,14 @@ class WebSocket extends EventTarget { // once this happens, the connection is open this[kResponse] = response - const parser = new ByteParser(this, parsedExtensions) + const webSocketOptions = this[kController]?.dispatcher?.webSocketOptions + const maxFragments = webSocketOptions?.maxFragments + const maxPayloadSize = webSocketOptions?.maxPayloadSize + + const parser = new ByteParser(this, parsedExtensions, { + maxFragments, + maxPayloadSize + }) parser.on('drain', onParserDrain) parser.on('error', onParserError.bind(this)) diff --git a/dist/setup/index.js b/dist/setup/index.js index 43403904..b4eff3af 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -54063,8 +54063,6 @@ function defaultFactory (origin, opts) { class Agent extends DispatcherBase { constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { - super() - if (typeof factory !== 'function') { throw new InvalidArgumentError('factory must be a function.') } @@ -54077,6 +54075,8 @@ class Agent extends DispatcherBase { throw new InvalidArgumentError('maxRedirections must be a positive number') } + super(options) + if (connect && typeof connect !== 'function') { connect = { ...connect } } @@ -54450,6 +54450,9 @@ const EMPTY_BUF = Buffer.alloc(0) const FastBuffer = Buffer[Symbol.species] const addListener = util.addListener const removeAllListeners = util.removeAllListeners +const kIdleSocketValidation = Symbol('kIdleSocketValidation') +const kIdleSocketValidationTimeout = Symbol('kIdleSocketValidationTimeout') +const kSocketUsed = Symbol('kSocketUsed') let extractBody @@ -54672,29 +54675,71 @@ class Parser { const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)) - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true - socket.unshift(data.slice(offset)) - } else if (ret !== constants.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr) - let message = '' - /* istanbul ignore else: difficult to make a test case for */ - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0) - message = - 'Response does not match the HTTP/1.1 protocol (' + - Buffer.from(llhttp.memory.buffer, ptr, len).toString() + - ')' + if (ret !== constants.ERROR.OK) { + const body = data.subarray(offset) + + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(body) + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true + socket.unshift(body) + } else { + throw this.createError(ret, body) } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) } } catch (err) { util.destroy(socket, err) } } + finish () { + assert(currentParser === null) + assert(this.ptr != null) + assert(!this.paused) + + const { llhttp } = this + + let ret + + try { + currentParser = this + ret = llhttp.llhttp_finish(this.ptr) + } finally { + currentParser = null + } + + if (ret === constants.ERROR.OK) { + return null + } + + if (ret === constants.ERROR.PAUSED || ret === constants.ERROR.PAUSED_UPGRADE) { + this.paused = true + return null + } + + return this.createError(ret, EMPTY_BUF) + } + + createError (ret, data) { + const { llhttp, contentLength, bytesRead } = this + + if (contentLength && bytesRead !== parseInt(contentLength, 10)) { + return new ResponseContentLengthMismatchError() + } + + const ptr = llhttp.llhttp_get_error_reason(this.ptr) + let message = '' + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0) + message = + 'Response does not match the HTTP/1.1 protocol (' + + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + + ')' + } + + return new HTTPParserError(message, constants.ERROR[ret], data) + } + destroy () { assert(this.ptr != null) assert(currentParser == null) @@ -54722,6 +54767,11 @@ class Parser { return -1 } + if (client[kRunning] === 0) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) + return -1 + } + const request = client[kQueue][client[kRunningIdx]] if (!request) { return -1 @@ -54825,6 +54875,11 @@ class Parser { return -1 } + if (client[kRunning] === 0) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) + return -1 + } + const request = client[kQueue][client[kRunningIdx]] /* istanbul ignore next: difficult to make a test case for */ @@ -54998,6 +55053,7 @@ class Parser { request.onComplete(headers) client[kQueue][client[kRunningIdx]++] = null + socket[kSocketUsed] = true if (socket[kWriting]) { assert(client[kRunning] === 0) @@ -55056,6 +55112,9 @@ async function connectH1 (client, socket) { socket[kWriting] = false socket[kReset] = false socket[kBlocking] = false + socket[kIdleSocketValidation] = 0 + socket[kIdleSocketValidationTimeout] = null + socket[kSocketUsed] = false socket[kParser] = new Parser(client, socket, llhttpInstance) addListener(socket, 'error', function (err) { @@ -55066,8 +55125,11 @@ async function connectH1 (client, socket) { // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded // to the user. if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so for as a valid response. - parser.onMessageComplete() + const parserErr = parser.finish() + if (parserErr) { + this[kError] = parserErr + this[kClient][kOnError](parserErr) + } return } @@ -55086,8 +55148,10 @@ async function connectH1 (client, socket) { const parser = this[kParser] if (parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete() + const parserErr = parser.finish() + if (parserErr) { + util.destroy(this, parserErr) + } return } @@ -55097,10 +55161,11 @@ async function connectH1 (client, socket) { const client = this[kClient] const parser = this[kParser] + clearIdleSocketValidation(this) + if (parser) { if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete() + this[kError] = parser.finish() || this[kError] } this[kParser].destroy() @@ -55163,7 +55228,7 @@ async function connectH1 (client, socket) { return socket.destroyed }, busy (request) { - if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { + if (socket[kWriting] || socket[kReset] || socket[kBlocking] || socket[kIdleSocketValidation] === 1) { return true } @@ -55201,6 +55266,31 @@ async function connectH1 (client, socket) { } } +function clearIdleSocketValidation (socket) { + if (socket[kIdleSocketValidationTimeout]) { + clearTimeout(socket[kIdleSocketValidationTimeout]) + socket[kIdleSocketValidationTimeout] = null + } + + socket[kIdleSocketValidation] = 0 +} + +function scheduleIdleSocketValidation (client, socket) { + socket[kIdleSocketValidation] = 1 + socket[kIdleSocketValidationTimeout] = setTimeout(() => { + socket[kIdleSocketValidationTimeout] = null + socket[kIdleSocketValidation] = 2 + + if (client[kSocket] === socket && !socket.destroyed) { + client[kResume]() + } + }, 0) + socket[kIdleSocketValidationTimeout].unref?.() +} + +/** + * @param {import('./client.js')} client + */ function resumeH1 (client) { const socket = client[kSocket] @@ -55215,6 +55305,32 @@ function resumeH1 (client) { socket[kNoRef] = false } + if (client[kRunning] === 0 && client[kPending] > 0 && socket[kSocketUsed]) { + if (socket[kIdleSocketValidation] === 0) { + scheduleIdleSocketValidation(client, socket) + socket[kParser].readMore() + if (socket.destroyed) { + return + } + return + } + + if (socket[kIdleSocketValidation] === 1) { + socket[kParser].readMore() + if (socket.destroyed) { + return + } + return + } + } + + if (client[kRunning] === 0) { + socket[kParser].readMore() + if (socket.destroyed) { + return + } + } + if (client[kSize] === 0) { if (socket[kParser].timeoutType !== TIMEOUT_KEEP_ALIVE) { socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_KEEP_ALIVE) @@ -55308,6 +55424,7 @@ function writeH1 (client, request) { } const socket = client[kSocket] + clearIdleSocketValidation(socket) const abort = (err) => { if (request.aborted || request.completed) { @@ -56629,9 +56746,10 @@ class Client extends DispatcherBase { autoSelectFamilyAttemptTimeout, // h2 maxConcurrentStreams, - allowH2 + allowH2, + webSocket } = {}) { - super() + super({ webSocket }) if (keepAlive !== undefined) { throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') @@ -57164,15 +57282,24 @@ const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = __nc const kOnDestroyed = Symbol('onDestroyed') const kOnClosed = Symbol('onClosed') const kInterceptedDispatch = Symbol('Intercepted Dispatch') +const kWebSocketOptions = Symbol('webSocketOptions') class DispatcherBase extends Dispatcher { - constructor () { + constructor (opts) { super() this[kDestroyed] = false this[kOnDestroyed] = null this[kClosed] = false this[kOnClosed] = [] + this[kWebSocketOptions] = opts?.webSocket ?? {} + } + + get webSocketOptions () { + return { + maxFragments: this[kWebSocketOptions].maxFragments ?? 131072, + maxPayloadSize: this[kWebSocketOptions].maxPayloadSize ?? 128 * 1024 * 1024 + } } get destroyed () { @@ -57736,8 +57863,8 @@ const kRemoveClient = Symbol('remove client') const kStats = Symbol('stats') class PoolBase extends DispatcherBase { - constructor () { - super() + constructor (opts) { + super(opts) this[kQueue] = new FixedQueue() this[kClients] = [] @@ -57997,8 +58124,6 @@ class Pool extends PoolBase { allowH2, ...options } = {}) { - super() - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { throw new InvalidArgumentError('invalid connections') } @@ -58023,6 +58148,8 @@ class Pool extends PoolBase { }) } + super(options) + this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool) ? options.interceptors.Pool : [] @@ -63107,32 +63234,25 @@ function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) // If the attribute-name case-insensitively matches the string // "SameSite", the user agent MUST process the cookie-av as follows: - // 1. Let enforcement be "Default". - let enforcement = 'Default' - const attributeValueLowercase = attributeValue.toLowerCase() - // 2. If cookie-av's attribute-value is a case-insensitive match for - // "None", set enforcement to "None". - if (attributeValueLowercase.includes('none')) { - enforcement = 'None' - } - // 3. If cookie-av's attribute-value is a case-insensitive match for - // "Strict", set enforcement to "Strict". - if (attributeValueLowercase.includes('strict')) { - enforcement = 'Strict' + // 1. If cookie-av's attribute-value is a case-insensitive match for + // "None", append an attribute to the cookie-attribute-list with an + // attribute-name of "SameSite" and an attribute-value of "None". + if (attributeValueLowercase === 'none') { + cookieAttributeList.sameSite = 'None' + } else if (attributeValueLowercase === 'strict') { + // 2. If cookie-av's attribute-value is a case-insensitive match for + // "Strict", append an attribute to the cookie-attribute-list with + // an attribute-name of "SameSite" and an attribute-value of + // "Strict". + cookieAttributeList.sameSite = 'Strict' + } else if (attributeValueLowercase === 'lax') { + // 3. If cookie-av's attribute-value is a case-insensitive match for + // "Lax", append an attribute to the cookie-attribute-list with an + // attribute-name of "SameSite" and an attribute-value of "Lax". + cookieAttributeList.sameSite = 'Lax' } - - // 4. If cookie-av's attribute-value is a case-insensitive match for - // "Lax", set enforcement to "Lax". - if (attributeValueLowercase.includes('lax')) { - enforcement = 'Lax' - } - - // 5. Append an attribute to the cookie-attribute-list with an - // attribute-name of "SameSite" and an attribute-value of - // enforcement. - cookieAttributeList.sameSite = enforcement } else { cookieAttributeList.unparsed ??= [] @@ -75838,40 +75958,35 @@ const tail = Buffer.from([0x00, 0x00, 0xff, 0xff]) const kBuffer = Symbol('kBuffer') const kLength = Symbol('kLength') -// Default maximum decompressed message size: 4 MB -const kDefaultMaxDecompressedSize = 4 * 1024 * 1024 - class PerMessageDeflate { /** @type {import('node:zlib').InflateRaw} */ #inflate #options = {} - /** @type {boolean} */ - #aborted = false - - /** @type {Function|null} */ - #currentCallback = null + #maxPayloadSize = 0 /** * @param {Map} extensions */ - constructor (extensions) { + constructor (extensions, options) { this.#options.serverNoContextTakeover = extensions.has('server_no_context_takeover') this.#options.serverMaxWindowBits = extensions.get('server_max_window_bits') + + this.#maxPayloadSize = options.maxPayloadSize } + /** + * Decompress a compressed payload. + * @param {Buffer} chunk Compressed data + * @param {boolean} fin Final fragment flag + * @param {Function} callback Callback function + */ decompress (chunk, fin, callback) { // An endpoint uses the following algorithm to decompress a message. // 1. Append 4 octets of 0x00 0x00 0xff 0xff to the tail end of the // payload of the message. // 2. Decompress the resulting data using DEFLATE. - - if (this.#aborted) { - callback(new MessageSizeExceededError()) - return - } - if (!this.#inflate) { let windowBits = Z_DEFAULT_WINDOWBITS @@ -75894,23 +76009,12 @@ class PerMessageDeflate { this.#inflate[kLength] = 0 this.#inflate.on('data', (data) => { - if (this.#aborted) { - return - } - this.#inflate[kLength] += data.length - if (this.#inflate[kLength] > kDefaultMaxDecompressedSize) { - this.#aborted = true + if (this.#maxPayloadSize > 0 && this.#inflate[kLength] > this.#maxPayloadSize) { + callback(new MessageSizeExceededError()) this.#inflate.removeAllListeners() - this.#inflate.destroy() this.#inflate = null - - if (this.#currentCallback) { - const cb = this.#currentCallback - this.#currentCallback = null - cb(new MessageSizeExceededError()) - } return } @@ -75923,14 +76027,13 @@ class PerMessageDeflate { }) } - this.#currentCallback = callback this.#inflate.write(chunk) if (fin) { this.#inflate.write(tail) } this.#inflate.flush(() => { - if (this.#aborted || !this.#inflate) { + if (!this.#inflate) { return } @@ -75938,7 +76041,6 @@ class PerMessageDeflate { this.#inflate[kBuffer].length = 0 this.#inflate[kLength] = 0 - this.#currentCallback = null callback(null, full) }) @@ -75974,6 +76076,12 @@ const { const { WebsocketFrameSend } = __nccwpck_require__(3264) const { closeWebSocketConnection } = __nccwpck_require__(86897) const { PerMessageDeflate } = __nccwpck_require__(19469) +const { MessageSizeExceededError } = __nccwpck_require__(68707) + +function failWebsocketConnectionWithCode (ws, code, reason) { + closeWebSocketConnection(ws, code, reason, Buffer.byteLength(reason)) + failWebsocketConnection(ws, reason) +} // This code was influenced by ws released under the MIT license. // Copyright (c) 2011 Einar Otto Stangvik @@ -75982,6 +76090,7 @@ const { PerMessageDeflate } = __nccwpck_require__(19469) class ByteParser extends Writable { #buffers = [] + #fragmentsBytes = 0 #byteOffset = 0 #loop = false @@ -75993,18 +76102,27 @@ class ByteParser extends Writable { /** @type {Map} */ #extensions + /** @type {number} */ + #maxFragments + + /** @type {number} */ + #maxPayloadSize + /** * @param {import('./websocket').WebSocket} ws * @param {Map|null} extensions + * @param {{ maxFragments?: number, maxPayloadSize?: number }} [options] */ - constructor (ws, extensions) { + constructor (ws, extensions, options = {}) { super() this.ws = ws this.#extensions = extensions == null ? new Map() : extensions + this.#maxFragments = options.maxFragments ?? 0 + this.#maxPayloadSize = options.maxPayloadSize ?? 0 if (this.#extensions.has('permessage-deflate')) { - this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions)) + this.#extensions.set('permessage-deflate', new PerMessageDeflate(extensions, options)) } } @@ -76020,6 +76138,19 @@ class ByteParser extends Writable { this.run(callback) } + #validatePayloadLength () { + if ( + this.#maxPayloadSize > 0 && + !isControlFrame(this.#info.opcode) && + this.#info.payloadLength + this.#fragmentsBytes > this.#maxPayloadSize + ) { + failWebsocketConnectionWithCode(this.ws, 1009, 'Payload size exceeds maximum allowed size') + return false + } + + return true + } + /** * Runs whenever a new chunk is received. * Callback is called whenever there are no more chunks buffering, @@ -76108,6 +76239,10 @@ class ByteParser extends Writable { if (payloadLength <= 125) { this.#info.payloadLength = payloadLength this.#state = parserStates.READ_DATA + + if (!this.#validatePayloadLength()) { + return + } } else if (payloadLength === 126) { this.#state = parserStates.PAYLOADLENGTH_16 } else if (payloadLength === 127) { @@ -76132,6 +76267,10 @@ class ByteParser extends Writable { this.#info.payloadLength = buffer.readUInt16BE(0) this.#state = parserStates.READ_DATA + + if (!this.#validatePayloadLength()) { + return + } } else if (this.#state === parserStates.PAYLOADLENGTH_64) { if (this.#byteOffset < 8) { return callback() @@ -76154,6 +76293,10 @@ class ByteParser extends Writable { this.#info.payloadLength = lower this.#state = parserStates.READ_DATA + + if (!this.#validatePayloadLength()) { + return + } } else if (this.#state === parserStates.READ_DATA) { if (this.#byteOffset < this.#info.payloadLength) { return callback() @@ -76166,42 +76309,58 @@ class ByteParser extends Writable { this.#state = parserStates.INFO } else { if (!this.#info.compressed) { - this.#fragments.push(body) + if (!this.writeFragments(body)) { + return + } + + if (this.#maxPayloadSize > 0 && this.#fragmentsBytes > this.#maxPayloadSize) { + failWebsocketConnectionWithCode(this.ws, 1009, new MessageSizeExceededError().message) + return + } // If the frame is not fragmented, a message has been received. // If the frame is fragmented, it will terminate with a fin bit set // and an opcode of 0 (continuation), therefore we handle that when // parsing continuation frames, not here. if (!this.#info.fragmented && this.#info.fin) { - const fullMessage = Buffer.concat(this.#fragments) - websocketMessageReceived(this.ws, this.#info.binaryType, fullMessage) - this.#fragments.length = 0 + websocketMessageReceived(this.ws, this.#info.binaryType, this.consumeFragments()) } this.#state = parserStates.INFO } else { - this.#extensions.get('permessage-deflate').decompress(body, this.#info.fin, (error, data) => { - if (error) { - failWebsocketConnection(this.ws, error.message) - return - } + this.#extensions.get('permessage-deflate').decompress( + body, + this.#info.fin, + (error, data) => { + if (error) { + const code = error instanceof MessageSizeExceededError ? 1009 : 1007 + failWebsocketConnectionWithCode(this.ws, code, error.message) + return + } - this.#fragments.push(data) + if (!this.writeFragments(data)) { + return + } + + if (this.#maxPayloadSize > 0 && this.#fragmentsBytes > this.#maxPayloadSize) { + failWebsocketConnectionWithCode(this.ws, 1009, new MessageSizeExceededError().message) + return + } + + if (!this.#info.fin) { + this.#state = parserStates.INFO + this.#loop = true + this.run(callback) + return + } + + websocketMessageReceived(this.ws, this.#info.binaryType, this.consumeFragments()) - if (!this.#info.fin) { - this.#state = parserStates.INFO this.#loop = true + this.#state = parserStates.INFO this.run(callback) - return } - - websocketMessageReceived(this.ws, this.#info.binaryType, Buffer.concat(this.#fragments)) - - this.#loop = true - this.#state = parserStates.INFO - this.#fragments.length = 0 - this.run(callback) - }) + ) this.#loop = false break @@ -76253,6 +76412,35 @@ class ByteParser extends Writable { return buffer } + writeFragments (fragment) { + if ( + this.#maxFragments > 0 && + this.#fragments.length === this.#maxFragments + ) { + failWebsocketConnectionWithCode(this.ws, 1008, 'Too many message fragments') + return false + } + + this.#fragmentsBytes += fragment.length + this.#fragments.push(fragment) + return true + } + + consumeFragments () { + const fragments = this.#fragments + + if (fragments.length === 1) { + this.#fragmentsBytes = 0 + return fragments.shift() + } + + const output = Buffer.concat(fragments, this.#fragmentsBytes) + this.#fragments = [] + this.#fragmentsBytes = 0 + + return output + } + parseCloseBody (data) { assert(data.length !== 1) @@ -77288,7 +77476,14 @@ class WebSocket extends EventTarget { // once this happens, the connection is open this[kResponse] = response - const parser = new ByteParser(this, parsedExtensions) + const webSocketOptions = this[kController]?.dispatcher?.webSocketOptions + const maxFragments = webSocketOptions?.maxFragments + const maxPayloadSize = webSocketOptions?.maxPayloadSize + + const parser = new ByteParser(this, parsedExtensions, { + maxFragments, + maxPayloadSize + }) parser.on('drain', onParserDrain) parser.on('error', onParserError.bind(this)) @@ -80497,15 +80692,15 @@ class ZuluDistribution extends base_installer_1.JavaBase { const availableVersionsRaw = yield this.getAvailableVersions(); const availableVersions = availableVersionsRaw.map(item => { return { - version: (0, util_1.convertVersionToSemver)(item.jdk_version), - url: item.url, - zuluVersion: (0, util_1.convertVersionToSemver)(item.zulu_version) + version: (0, util_1.convertVersionToSemver)(item.java_version), + url: item.download_url, + zuluVersion: (0, util_1.convertVersionToSemver)(item.distro_version) }; }); const satisfiedVersions = availableVersions .filter(item => (0, util_1.isVersionSatisfies)(version, item.version)) .sort((a, b) => { - // Azul provides two versions: jdk_version and azul_version + // Azul provides two versions: java_version and distro_version // we should sort by both fields by descending return (-semver_1.default.compareBuild(a.version, b.version) || -semver_1.default.compareBuild(a.zuluVersion, b.zuluVersion)); @@ -80543,37 +80738,60 @@ class ZuluDistribution extends base_installer_1.JavaBase { getAvailableVersions() { var _a, _b; return __awaiter(this, void 0, void 0, function* () { - const { arch, hw_bitness, abi } = this.getArchitectureOptions(); + const arch = this.getArchitectureOptions(); const [bundleType, features] = this.packageType.split('+'); const platform = this.getPlatformOption(); const extension = (0, util_1.getDownloadArchiveExtension)(); const javafx = (_a = features === null || features === void 0 ? void 0 : features.includes('fx')) !== null && _a !== void 0 ? _a : false; + const crac = (_b = features === null || features === void 0 ? void 0 : features.includes('crac')) !== null && _b !== void 0 ? _b : false; const releaseStatus = this.stable ? 'ga' : 'ea'; if (core.isDebug()) { console.time('Retrieving available versions for Zulu took'); // eslint-disable-line no-console } - const requestArguments = [ + const baseRequestArguments = [ `os=${platform}`, - `ext=${extension}`, - `bundle_type=${bundleType}`, - `javafx=${javafx}`, + `archive_type=${extension}`, + `java_package_type=${bundleType}`, + `javafx_bundled=${javafx}`, + `crac_supported=${crac}`, `arch=${arch}`, - `hw_bitness=${hw_bitness}`, `release_status=${releaseStatus}`, - abi ? `abi=${abi}` : null, - features ? `features=${features}` : null - ] - .filter(Boolean) - .join('&'); - const availableVersionsUrl = `https://api.azul.com/zulu/download/community/v1.0/bundles/?${requestArguments}`; - core.debug(`Gathering available versions from '${availableVersionsUrl}'`); - const availableVersions = (_b = (yield this.http.getJson(availableVersionsUrl)) - .result) !== null && _b !== void 0 ? _b : []; + `availability_types=ca` + ].join('&'); + // Need to iterate through all pages to retrieve the list of all versions. + // The Azul API doesn't return a total page count, so paginate until a page + // comes back empty (or short), guarding against a runaway loop with a cap. + const pageSize = 100; + const maxPages = 100; + let pageIndex = 1; + const availableVersions = []; + while (pageIndex <= maxPages) { + const requestArguments = `${baseRequestArguments}&page=${pageIndex}&page_size=${pageSize}`; + const availableVersionsUrl = `https://api.azul.com/metadata/v1/zulu/packages/?${requestArguments}`; + if (core.isDebug() && pageIndex === 1) { + // the url is identical except for the page number, so print it once for debug + core.debug(`Gathering available versions from '${availableVersionsUrl}'`); + } + const paginationPage = (yield this.http.getJson(availableVersionsUrl)).result; + if (!paginationPage || paginationPage.length === 0) { + // stop paginating because we have reached the end of the results + break; + } + availableVersions.push(...paginationPage); + if (paginationPage.length < pageSize) { + // a short page means this was the last one; avoid an extra empty request + break; + } + pageIndex++; + } + if (pageIndex > maxPages) { + core.warning(`Reached the maximum of ${maxPages} pages while listing Zulu versions; results may be truncated.`); + } if (core.isDebug()) { core.startGroup('Print information about available versions'); console.timeEnd('Retrieving available versions for Zulu took'); // eslint-disable-line no-console core.debug(`Available versions: [${availableVersions.length}]`); - core.debug(availableVersions.map(item => item.jdk_version.join('.')).join(', ')); + core.debug(availableVersions.map(item => item.java_version.join('.')).join(', ')); core.endGroup(); } return availableVersions; @@ -80583,14 +80801,14 @@ class ZuluDistribution extends base_installer_1.JavaBase { const arch = this.distributionArchitecture(); switch (arch) { case 'x64': - return { arch: 'x86', hw_bitness: '64', abi: '' }; + return 'x64'; case 'x86': - return { arch: 'x86', hw_bitness: '32', abi: '' }; + return 'x86'; case 'aarch64': case 'arm64': - return { arch: 'arm', hw_bitness: '64', abi: '' }; + return 'aarch64'; default: - return { arch: arch, hw_bitness: '', abi: '' }; + return arch; } } getPlatformOption() { @@ -80600,6 +80818,10 @@ class ZuluDistribution extends base_installer_1.JavaBase { return 'macos'; case 'win32': return 'windows'; + case 'linux': + // The new Metadata API's "linux" value returns both glibc and musl packages; + // use "linux_glibc" to target only glibc, which is what standard runners use. + return 'linux_glibc'; default: return process.platform; } diff --git a/src/distributions/zulu/installer.ts b/src/distributions/zulu/installer.ts index 8155010b..622c3d34 100644 --- a/src/distributions/zulu/installer.ts +++ b/src/distributions/zulu/installer.ts @@ -118,15 +118,18 @@ export class ZuluDistribution extends JavaBase { `availability_types=ca` ].join('&'); - // need to iterate through all pages to retrieve the list of all versions - // Azul API doesn't provide a way to retrieve the count of pages so use an infinity loop - let page_index = 1; + // Need to iterate through all pages to retrieve the list of all versions. + // The Azul API doesn't return a total page count, so paginate until a page + // comes back empty (or short), guarding against a runaway loop with a cap. + const pageSize = 100; + const maxPages = 100; + let pageIndex = 1; const availableVersions: IZuluVersions[] = []; - while (true) { - const requestArguments = `${baseRequestArguments}&page=${page_index}&page_size=100`; + while (pageIndex <= maxPages) { + const requestArguments = `${baseRequestArguments}&page=${pageIndex}&page_size=${pageSize}`; const availableVersionsUrl = `https://api.azul.com/metadata/v1/zulu/packages/?${requestArguments}`; - if (core.isDebug() && page_index === 1) { - // url is identical except page_index so print it once for debug + if (core.isDebug() && pageIndex === 1) { + // the url is identical except for the page number, so print it once for debug core.debug( `Gathering available versions from '${availableVersionsUrl}'` ); @@ -135,13 +138,25 @@ export class ZuluDistribution extends JavaBase { const paginationPage = ( await this.http.getJson(availableVersionsUrl) ).result; - if (paginationPage === null || paginationPage.length === 0) { - // break infinity loop because we have reached end of pagination + if (!paginationPage || paginationPage.length === 0) { + // stop paginating because we have reached the end of the results break; } availableVersions.push(...paginationPage); - page_index++; + + if (paginationPage.length < pageSize) { + // a short page means this was the last one; avoid an extra empty request + break; + } + + pageIndex++; + } + + if (pageIndex > maxPages) { + core.warning( + `Reached the maximum of ${maxPages} pages while listing Zulu versions; results may be truncated.` + ); } if (core.isDebug()) { From 12c069fb55ae55a5fc71504bbd6316d637d6b0d0 Mon Sep 17 00:00:00 2001 From: Bruno Borges Date: Mon, 22 Jun 2026 14:49:35 -0400 Subject: [PATCH 8/8] Preserve JDK build number from Azul Metadata API The Azul Metadata API returns java_version as a 3-element array (e.g. [17,0,7]) and reports the build number separately in openjdk_build_number. The migration mapped version directly from java_version, dropping the build and breaking exact-version lookups like 17.0.7+7 (e2e failure: "No matching version found for SemVer"). Add openjdk_build_number to IZuluVersions and append it to java_version before converting to semver so resolved versions retain the build (e.g. 17.0.7+7). Update the zulu test fixtures to mirror the real API shape (3-element java_version plus openjdk_build_number) so unit tests exercise the actual response format, and rebuild dist. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- __tests__/data/zulu-linux.json | 142 +++++++++++----------- __tests__/data/zulu-releases-default.json | 138 ++++++++++----------- __tests__/data/zulu-windows.json | 142 +++++++++++----------- dist/setup/index.js | 8 +- src/distributions/zulu/installer.ts | 9 +- src/distributions/zulu/models.ts | 1 + 6 files changed, 227 insertions(+), 213 deletions(-) diff --git a/__tests__/data/zulu-linux.json b/__tests__/data/zulu-linux.json index 94f89b63..c74487e2 100644 --- a/__tests__/data/zulu-linux.json +++ b/__tests__/data/zulu-linux.json @@ -6,9 +6,9 @@ "java_version": [ 8, 0, - 5, - 13 + 5 ], + "openjdk_build_number": 13, "distro_version": [ 8, 1, @@ -25,9 +25,9 @@ "java_version": [ 8, 0, - 11, - 12 + 11 ], + "openjdk_build_number": 12, "distro_version": [ 8, 2, @@ -44,9 +44,9 @@ "java_version": [ 8, 0, - 131, - 11 + 131 ], + "openjdk_build_number": 11, "distro_version": [ 8, 21, @@ -63,9 +63,9 @@ "java_version": [ 8, 0, - 144, - 1 + 144 ], + "openjdk_build_number": 1, "distro_version": [ 8, 23, @@ -82,9 +82,9 @@ "java_version": [ 8, 0, - 152, - 16 + 152 ], + "openjdk_build_number": 16, "distro_version": [ 8, 25, @@ -101,9 +101,9 @@ "java_version": [ 8, 0, - 252, - 14 + 252 ], + "openjdk_build_number": 14, "distro_version": [ 8, 46, @@ -120,9 +120,9 @@ "java_version": [ 8, 0, - 262, - 17 + 262 ], + "openjdk_build_number": 17, "distro_version": [ 8, 48, @@ -139,9 +139,9 @@ "java_version": [ 8, 0, - 262, - 19 + 262 ], + "openjdk_build_number": 19, "distro_version": [ 8, 48, @@ -158,9 +158,9 @@ "java_version": [ 8, 0, - 262, - 18 + 262 ], + "openjdk_build_number": 18, "distro_version": [ 8, 48, @@ -177,9 +177,9 @@ "java_version": [ 8, 0, - 282, - 8 + 282 ], + "openjdk_build_number": 8, "distro_version": [ 8, 52, @@ -196,9 +196,9 @@ "java_version": [ 9, 0, - 0, 0 ], + "openjdk_build_number": 0, "distro_version": [ 9, 0, @@ -215,9 +215,9 @@ "java_version": [ 9, 0, - 1, - 0 + 1 ], + "openjdk_build_number": 0, "distro_version": [ 9, 0, @@ -234,9 +234,9 @@ "java_version": [ 10, 0, - 1, - 9 + 1 ], + "openjdk_build_number": 9, "distro_version": [ 10, 2, @@ -253,9 +253,9 @@ "java_version": [ 10, 0, - 2, - 13 + 2 ], + "openjdk_build_number": 13, "distro_version": [ 10, 3, @@ -272,9 +272,9 @@ "java_version": [ 11, 0, - 1, - 13 + 1 ], + "openjdk_build_number": 13, "distro_version": [ 11, 2, @@ -291,9 +291,9 @@ "java_version": [ 11, 0, - 2, - 7 + 2 ], + "openjdk_build_number": 7, "distro_version": [ 11, 29, @@ -310,9 +310,9 @@ "java_version": [ 11, 0, - 3, - 7 + 3 ], + "openjdk_build_number": 7, "distro_version": [ 11, 31, @@ -329,9 +329,9 @@ "java_version": [ 11, 0, - 5, - 10 + 5 ], + "openjdk_build_number": 10, "distro_version": [ 11, 35, @@ -348,9 +348,9 @@ "java_version": [ 11, 0, - 5, - 10 + 5 ], + "openjdk_build_number": 10, "distro_version": [ 11, 35, @@ -367,9 +367,9 @@ "java_version": [ 11, 0, - 5, - 10 + 5 ], + "openjdk_build_number": 10, "distro_version": [ 11, 35, @@ -386,9 +386,9 @@ "java_version": [ 11, 0, - 10, - 9 + 10 ], + "openjdk_build_number": 9, "distro_version": [ 11, 45, @@ -405,9 +405,9 @@ "java_version": [ 12, 0, - 0, - 33 + 0 ], + "openjdk_build_number": 33, "distro_version": [ 12, 1, @@ -424,9 +424,9 @@ "java_version": [ 12, 0, - 1, - 12 + 1 ], + "openjdk_build_number": 12, "distro_version": [ 12, 2, @@ -443,9 +443,9 @@ "java_version": [ 12, 0, - 2, - 3 + 2 ], + "openjdk_build_number": 3, "distro_version": [ 12, 3, @@ -462,9 +462,9 @@ "java_version": [ 13, 0, - 0, - 33 + 0 ], + "openjdk_build_number": 33, "distro_version": [ 13, 27, @@ -481,9 +481,9 @@ "java_version": [ 13, 0, - 1, - 10 + 1 ], + "openjdk_build_number": 10, "distro_version": [ 13, 28, @@ -500,9 +500,9 @@ "java_version": [ 13, 0, - 2, - 6 + 2 ], + "openjdk_build_number": 6, "distro_version": [ 13, 29, @@ -519,9 +519,9 @@ "java_version": [ 13, 0, - 6, - 5 + 6 ], + "openjdk_build_number": 5, "distro_version": [ 13, 37, @@ -538,9 +538,9 @@ "java_version": [ 14, 0, - 0, - 36 + 0 ], + "openjdk_build_number": 36, "distro_version": [ 14, 27, @@ -557,9 +557,9 @@ "java_version": [ 14, 0, - 1, - 8 + 1 ], + "openjdk_build_number": 8, "distro_version": [ 14, 28, @@ -576,9 +576,9 @@ "java_version": [ 14, 0, - 2, - 12 + 2 ], + "openjdk_build_number": 12, "distro_version": [ 14, 29, @@ -595,9 +595,9 @@ "java_version": [ 15, 0, - 0, - 36 + 0 ], + "openjdk_build_number": 36, "distro_version": [ 15, 27, @@ -614,9 +614,9 @@ "java_version": [ 15, 0, - 1, - 8 + 1 ], + "openjdk_build_number": 8, "distro_version": [ 15, 28, @@ -633,9 +633,9 @@ "java_version": [ 15, 0, - 1, - 9 + 1 ], + "openjdk_build_number": 9, "distro_version": [ 15, 28, @@ -652,9 +652,9 @@ "java_version": [ 15, 0, - 2, - 7 + 2 ], + "openjdk_build_number": 7, "distro_version": [ 15, 29, @@ -671,9 +671,9 @@ "java_version": [ 21, 0, - 2, - 6 + 2 ], + "openjdk_build_number": 6, "distro_version": [ 21, 32, diff --git a/__tests__/data/zulu-releases-default.json b/__tests__/data/zulu-releases-default.json index 52a61367..16ed9777 100644 --- a/__tests__/data/zulu-releases-default.json +++ b/__tests__/data/zulu-releases-default.json @@ -6,9 +6,9 @@ "java_version": [ 8, 0, - 5, - 13 + 5 ], + "openjdk_build_number": 13, "distro_version": [ 8, 1, @@ -25,9 +25,9 @@ "java_version": [ 8, 0, - 11, - 12 + 11 ], + "openjdk_build_number": 12, "distro_version": [ 8, 2, @@ -44,9 +44,9 @@ "java_version": [ 8, 0, - 131, - 11 + 131 ], + "openjdk_build_number": 11, "distro_version": [ 8, 21, @@ -63,9 +63,9 @@ "java_version": [ 8, 0, - 144, - 1 + 144 ], + "openjdk_build_number": 1, "distro_version": [ 8, 23, @@ -82,9 +82,9 @@ "java_version": [ 8, 0, - 152, - 16 + 152 ], + "openjdk_build_number": 16, "distro_version": [ 8, 25, @@ -101,9 +101,9 @@ "java_version": [ 8, 0, - 252, - 14 + 252 ], + "openjdk_build_number": 14, "distro_version": [ 8, 46, @@ -120,9 +120,9 @@ "java_version": [ 8, 0, - 262, - 17 + 262 ], + "openjdk_build_number": 17, "distro_version": [ 8, 48, @@ -139,9 +139,9 @@ "java_version": [ 8, 0, - 262, - 19 + 262 ], + "openjdk_build_number": 19, "distro_version": [ 8, 48, @@ -158,9 +158,9 @@ "java_version": [ 8, 0, - 262, - 18 + 262 ], + "openjdk_build_number": 18, "distro_version": [ 8, 48, @@ -177,9 +177,9 @@ "java_version": [ 8, 0, - 282, - 8 + 282 ], + "openjdk_build_number": 8, "distro_version": [ 8, 52, @@ -196,9 +196,9 @@ "java_version": [ 9, 0, - 0, 0 ], + "openjdk_build_number": 0, "distro_version": [ 9, 0, @@ -215,9 +215,9 @@ "java_version": [ 9, 0, - 1, - 0 + 1 ], + "openjdk_build_number": 0, "distro_version": [ 9, 0, @@ -234,9 +234,9 @@ "java_version": [ 10, 0, - 1, - 9 + 1 ], + "openjdk_build_number": 9, "distro_version": [ 10, 2, @@ -253,9 +253,9 @@ "java_version": [ 10, 0, - 2, - 13 + 2 ], + "openjdk_build_number": 13, "distro_version": [ 10, 3, @@ -272,9 +272,9 @@ "java_version": [ 11, 0, - 1, - 13 + 1 ], + "openjdk_build_number": 13, "distro_version": [ 11, 2, @@ -291,9 +291,9 @@ "java_version": [ 11, 0, - 2, - 7 + 2 ], + "openjdk_build_number": 7, "distro_version": [ 11, 29, @@ -310,9 +310,9 @@ "java_version": [ 11, 0, - 3, - 7 + 3 ], + "openjdk_build_number": 7, "distro_version": [ 11, 31, @@ -329,9 +329,9 @@ "java_version": [ 11, 0, - 5, - 10 + 5 ], + "openjdk_build_number": 10, "distro_version": [ 11, 35, @@ -348,9 +348,9 @@ "java_version": [ 11, 0, - 5, - 10 + 5 ], + "openjdk_build_number": 10, "distro_version": [ 11, 35, @@ -367,9 +367,9 @@ "java_version": [ 11, 0, - 5, - 10 + 5 ], + "openjdk_build_number": 10, "distro_version": [ 11, 35, @@ -386,9 +386,9 @@ "java_version": [ 11, 0, - 10, - 9 + 10 ], + "openjdk_build_number": 9, "distro_version": [ 11, 45, @@ -405,9 +405,9 @@ "java_version": [ 12, 0, - 0, - 33 + 0 ], + "openjdk_build_number": 33, "distro_version": [ 12, 1, @@ -424,9 +424,9 @@ "java_version": [ 12, 0, - 1, - 12 + 1 ], + "openjdk_build_number": 12, "distro_version": [ 12, 2, @@ -443,9 +443,9 @@ "java_version": [ 12, 0, - 2, - 3 + 2 ], + "openjdk_build_number": 3, "distro_version": [ 12, 3, @@ -462,9 +462,9 @@ "java_version": [ 13, 0, - 0, - 33 + 0 ], + "openjdk_build_number": 33, "distro_version": [ 13, 27, @@ -481,9 +481,9 @@ "java_version": [ 13, 0, - 1, - 10 + 1 ], + "openjdk_build_number": 10, "distro_version": [ 13, 28, @@ -500,9 +500,9 @@ "java_version": [ 13, 0, - 2, - 6 + 2 ], + "openjdk_build_number": 6, "distro_version": [ 13, 29, @@ -519,9 +519,9 @@ "java_version": [ 13, 0, - 6, - 5 + 6 ], + "openjdk_build_number": 5, "distro_version": [ 13, 37, @@ -538,9 +538,9 @@ "java_version": [ 14, 0, - 0, - 36 + 0 ], + "openjdk_build_number": 36, "distro_version": [ 14, 27, @@ -557,9 +557,9 @@ "java_version": [ 14, 0, - 1, - 8 + 1 ], + "openjdk_build_number": 8, "distro_version": [ 14, 28, @@ -576,9 +576,9 @@ "java_version": [ 14, 0, - 2, - 12 + 2 ], + "openjdk_build_number": 12, "distro_version": [ 14, 29, @@ -595,9 +595,9 @@ "java_version": [ 15, 0, - 0, - 36 + 0 ], + "openjdk_build_number": 36, "distro_version": [ 15, 27, @@ -614,9 +614,9 @@ "java_version": [ 15, 0, - 1, - 8 + 1 ], + "openjdk_build_number": 8, "distro_version": [ 15, 28, @@ -633,9 +633,9 @@ "java_version": [ 15, 0, - 1, - 9 + 1 ], + "openjdk_build_number": 9, "distro_version": [ 15, 28, @@ -652,9 +652,9 @@ "java_version": [ 15, 0, - 2, - 7 + 2 ], + "openjdk_build_number": 7, "distro_version": [ 15, 29, diff --git a/__tests__/data/zulu-windows.json b/__tests__/data/zulu-windows.json index 7e44242f..dcfb9462 100644 --- a/__tests__/data/zulu-windows.json +++ b/__tests__/data/zulu-windows.json @@ -6,9 +6,9 @@ "java_version": [ 8, 0, - 5, - 13 + 5 ], + "openjdk_build_number": 13, "distro_version": [ 8, 1, @@ -25,9 +25,9 @@ "java_version": [ 8, 0, - 11, - 12 + 11 ], + "openjdk_build_number": 12, "distro_version": [ 8, 2, @@ -44,9 +44,9 @@ "java_version": [ 8, 0, - 131, - 11 + 131 ], + "openjdk_build_number": 11, "distro_version": [ 8, 21, @@ -63,9 +63,9 @@ "java_version": [ 8, 0, - 144, - 1 + 144 ], + "openjdk_build_number": 1, "distro_version": [ 8, 23, @@ -82,9 +82,9 @@ "java_version": [ 8, 0, - 152, - 16 + 152 ], + "openjdk_build_number": 16, "distro_version": [ 8, 25, @@ -101,9 +101,9 @@ "java_version": [ 8, 0, - 252, - 14 + 252 ], + "openjdk_build_number": 14, "distro_version": [ 8, 46, @@ -120,9 +120,9 @@ "java_version": [ 8, 0, - 262, - 17 + 262 ], + "openjdk_build_number": 17, "distro_version": [ 8, 48, @@ -139,9 +139,9 @@ "java_version": [ 8, 0, - 262, - 19 + 262 ], + "openjdk_build_number": 19, "distro_version": [ 8, 48, @@ -158,9 +158,9 @@ "java_version": [ 8, 0, - 262, - 18 + 262 ], + "openjdk_build_number": 18, "distro_version": [ 8, 48, @@ -177,9 +177,9 @@ "java_version": [ 8, 0, - 282, - 8 + 282 ], + "openjdk_build_number": 8, "distro_version": [ 8, 52, @@ -196,9 +196,9 @@ "java_version": [ 9, 0, - 0, 0 ], + "openjdk_build_number": 0, "distro_version": [ 9, 0, @@ -215,9 +215,9 @@ "java_version": [ 9, 0, - 1, - 0 + 1 ], + "openjdk_build_number": 0, "distro_version": [ 9, 0, @@ -234,9 +234,9 @@ "java_version": [ 10, 0, - 1, - 9 + 1 ], + "openjdk_build_number": 9, "distro_version": [ 10, 2, @@ -253,9 +253,9 @@ "java_version": [ 10, 0, - 2, - 13 + 2 ], + "openjdk_build_number": 13, "distro_version": [ 10, 3, @@ -272,9 +272,9 @@ "java_version": [ 11, 0, - 1, - 13 + 1 ], + "openjdk_build_number": 13, "distro_version": [ 11, 2, @@ -291,9 +291,9 @@ "java_version": [ 11, 0, - 2, - 7 + 2 ], + "openjdk_build_number": 7, "distro_version": [ 11, 29, @@ -310,9 +310,9 @@ "java_version": [ 11, 0, - 3, - 7 + 3 ], + "openjdk_build_number": 7, "distro_version": [ 11, 31, @@ -329,9 +329,9 @@ "java_version": [ 11, 0, - 5, - 10 + 5 ], + "openjdk_build_number": 10, "distro_version": [ 11, 35, @@ -348,9 +348,9 @@ "java_version": [ 11, 0, - 5, - 10 + 5 ], + "openjdk_build_number": 10, "distro_version": [ 11, 35, @@ -367,9 +367,9 @@ "java_version": [ 11, 0, - 5, - 10 + 5 ], + "openjdk_build_number": 10, "distro_version": [ 11, 35, @@ -386,9 +386,9 @@ "java_version": [ 11, 0, - 10, - 9 + 10 ], + "openjdk_build_number": 9, "distro_version": [ 11, 45, @@ -405,9 +405,9 @@ "java_version": [ 12, 0, - 0, - 33 + 0 ], + "openjdk_build_number": 33, "distro_version": [ 12, 1, @@ -424,9 +424,9 @@ "java_version": [ 12, 0, - 1, - 12 + 1 ], + "openjdk_build_number": 12, "distro_version": [ 12, 2, @@ -443,9 +443,9 @@ "java_version": [ 12, 0, - 2, - 3 + 2 ], + "openjdk_build_number": 3, "distro_version": [ 12, 3, @@ -462,9 +462,9 @@ "java_version": [ 13, 0, - 0, - 33 + 0 ], + "openjdk_build_number": 33, "distro_version": [ 13, 27, @@ -481,9 +481,9 @@ "java_version": [ 13, 0, - 1, - 10 + 1 ], + "openjdk_build_number": 10, "distro_version": [ 13, 28, @@ -500,9 +500,9 @@ "java_version": [ 13, 0, - 2, - 6 + 2 ], + "openjdk_build_number": 6, "distro_version": [ 13, 29, @@ -519,9 +519,9 @@ "java_version": [ 13, 0, - 6, - 5 + 6 ], + "openjdk_build_number": 5, "distro_version": [ 13, 37, @@ -538,9 +538,9 @@ "java_version": [ 14, 0, - 0, - 36 + 0 ], + "openjdk_build_number": 36, "distro_version": [ 14, 27, @@ -557,9 +557,9 @@ "java_version": [ 14, 0, - 1, - 8 + 1 ], + "openjdk_build_number": 8, "distro_version": [ 14, 28, @@ -576,9 +576,9 @@ "java_version": [ 14, 0, - 2, - 12 + 2 ], + "openjdk_build_number": 12, "distro_version": [ 14, 29, @@ -595,9 +595,9 @@ "java_version": [ 15, 0, - 0, - 36 + 0 ], + "openjdk_build_number": 36, "distro_version": [ 15, 27, @@ -614,9 +614,9 @@ "java_version": [ 15, 0, - 1, - 8 + 1 ], + "openjdk_build_number": 8, "distro_version": [ 15, 28, @@ -633,9 +633,9 @@ "java_version": [ 15, 0, - 1, - 9 + 1 ], + "openjdk_build_number": 9, "distro_version": [ 15, 28, @@ -652,9 +652,9 @@ "java_version": [ 15, 0, - 2, - 7 + 2 ], + "openjdk_build_number": 7, "distro_version": [ 15, 29, @@ -671,9 +671,9 @@ "java_version": [ 17, 0, - 10, - 7 + 10 ], + "openjdk_build_number": 7, "distro_version": [ 17, 48, diff --git a/dist/setup/index.js b/dist/setup/index.js index b4eff3af..aa5c25f3 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -80691,8 +80691,14 @@ class ZuluDistribution extends base_installer_1.JavaBase { return __awaiter(this, void 0, void 0, function* () { const availableVersionsRaw = yield this.getAvailableVersions(); const availableVersions = availableVersionsRaw.map(item => { + // The Azul Metadata API reports the JDK build number separately from + // java_version (e.g. java_version=[17,0,7], openjdk_build_number=7). + // Append it so the resulting semver retains the build (e.g. 17.0.7+7). + const javaVersion = item.openjdk_build_number != null + ? [...item.java_version, item.openjdk_build_number] + : item.java_version; return { - version: (0, util_1.convertVersionToSemver)(item.java_version), + version: (0, util_1.convertVersionToSemver)(javaVersion), url: item.download_url, zuluVersion: (0, util_1.convertVersionToSemver)(item.distro_version) }; diff --git a/src/distributions/zulu/installer.ts b/src/distributions/zulu/installer.ts index 622c3d34..caf03910 100644 --- a/src/distributions/zulu/installer.ts +++ b/src/distributions/zulu/installer.ts @@ -30,8 +30,15 @@ export class ZuluDistribution extends JavaBase { ): Promise { const availableVersionsRaw = await this.getAvailableVersions(); const availableVersions = availableVersionsRaw.map(item => { + // The Azul Metadata API reports the JDK build number separately from + // java_version (e.g. java_version=[17,0,7], openjdk_build_number=7). + // Append it so the resulting semver retains the build (e.g. 17.0.7+7). + const javaVersion = + item.openjdk_build_number != null + ? [...item.java_version, item.openjdk_build_number] + : item.java_version; return { - version: convertVersionToSemver(item.java_version), + version: convertVersionToSemver(javaVersion), url: item.download_url, zuluVersion: convertVersionToSemver(item.distro_version) }; diff --git a/src/distributions/zulu/models.ts b/src/distributions/zulu/models.ts index 92808cd5..36d369e0 100644 --- a/src/distributions/zulu/models.ts +++ b/src/distributions/zulu/models.ts @@ -6,6 +6,7 @@ export interface IZuluVersions { download_url: string; java_version: Array; distro_version: Array; + openjdk_build_number: number; latest: boolean; availability_type: string; }