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 | 864 ++++++++++++----- __tests__/data/zulu-releases-default.json | 836 ++++++++++++----- __tests__/data/zulu-windows.json | 866 +++++++++++++----- __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, 2008 insertions(+), 737 deletions(-) diff --git a/__tests__/data/zulu-linux.json b/__tests__/data/zulu-linux.json index 1f2fa2716..94f89b634 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] - }, - { - "id": 10997, - "url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_11-8.2.0.1-linux.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10346, - "url": "https://cdn.azul.com/zulu/bin/zulu8.21.0.1-jdk8.0.131-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10362, - "url": "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10399, - "url": "https://cdn.azul.com/zulu/bin/zulu8.25.0.1-jdk8.0.152-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11355, - "url": "https://cdn.azul.com/zulu/bin/zulu8.46.0.19-ca-jdk8.0.252-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11481, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.47-ca-jdk8.0.262-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11622, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.51-ca-jdk8.0.262-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11535, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.49-ca-jdk8.0.262-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12424, - "url": "https://cdn.azul.com/zulu/bin/zulu8.52.0.23-ca-jdk8.0.282-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10383, - "url": "https://cdn.azul.com/zulu/bin/zulu9.0.0.15-jdk9.0.0-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10413, - "url": "https://cdn.azul.com/zulu/bin/zulu9.0.1.3-jdk9.0.1-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10503, - "url": "https://cdn.azul.com/zulu/bin/zulu10.2+3-jdk10.0.1-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10541, - "url": "https://cdn.azul.com/zulu/bin/zulu10.3+5-jdk10.0.2-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10576, - "url": "https://cdn.azul.com/zulu/bin/zulu11.2.3-jdk11.0.1-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10604, - "url": "https://cdn.azul.com/zulu/bin/zulu11.29.3-ca-jdk11.0.2-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10687, - "url": "https://cdn.azul.com/zulu/bin/zulu11.31.11-ca-jdk11.0.3-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10856, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.13-ca-jdk11.0.5-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10933, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.15-ca-jdk11.0.5-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10933, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.11-ca-jdk11.0.5-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12397, - "url": "https://cdn.azul.com/zulu/bin/zulu11.45.27-ca-jdk11.0.10-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10667, - "url": "https://cdn.azul.com/zulu/bin/zulu12.1.3-ca-jdk12.0.0-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10710, - "url": "https://cdn.azul.com/zulu/bin/zulu12.2.3-ca-jdk12.0.1-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10780, - "url": "https://cdn.azul.com/zulu/bin/zulu12.3.11-ca-jdk12.0.2-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10846, - "url": "https://cdn.azul.com/zulu/bin/zulu13.27.9-ca-jdk13.0.0-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10888, - "url": "https://cdn.azul.com/zulu/bin/zulu13.28.11-ca-jdk13.0.1-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11073, - "url": "https://cdn.azul.com/zulu/bin/zulu13.29.9-ca-jdk13.0.2-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12408, - "url": "https://cdn.azul.com/zulu/bin/zulu13.37.21-ca-jdk13.0.6-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11236, - "url": "https://cdn.azul.com/zulu/bin/zulu14.27.1-ca-jdk14.0.0-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11349, - "url": "https://cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11513, - "url": "https://cdn.azul.com/zulu/bin/zulu14.29.23-ca-jdk14.0.2-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11780, - "url": "https://cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11924, - "url": "https://cdn.azul.com/zulu/bin/zulu15.28.13-ca-jdk15.0.1-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12101, - "url": "https://cdn.azul.com/zulu/bin/zulu15.28.51-ca-jdk15.0.1-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12445, - "url": "https://cdn.azul.com/zulu/bin/zulu15.29.15-ca-jdk15.0.2-linux_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12447, - "url": "https://cdn.azul.com/zulu/bin/zulu21.32.17-ca-jdk21.0.2-linux_aarch64.tar.gz", + "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" + }, + { + "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 f23a87d43..52a613670 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] - }, - { - "id": 10997, - "url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_11-8.2.0.1-macosx.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10346, - "url": "https://cdn.azul.com/zulu/bin/zulu8.21.0.1-jdk8.0.131-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10362, - "url": "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10399, - "url": "https://cdn.azul.com/zulu/bin/zulu8.25.0.1-jdk8.0.152-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11355, - "url": "https://cdn.azul.com/zulu/bin/zulu8.46.0.19-ca-jdk8.0.252-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11481, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.47-ca-jdk8.0.262-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11622, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.51-ca-jdk8.0.262-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11535, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.49-ca-jdk8.0.262-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12424, - "url": "https://cdn.azul.com/zulu/bin/zulu8.52.0.23-ca-jdk8.0.282-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10383, - "url": "https://cdn.azul.com/zulu/bin/zulu9.0.0.15-jdk9.0.0-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10413, - "url": "https://cdn.azul.com/zulu/bin/zulu9.0.1.3-jdk9.0.1-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10503, - "url": "https://cdn.azul.com/zulu/bin/zulu10.2+3-jdk10.0.1-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10541, - "url": "https://cdn.azul.com/zulu/bin/zulu10.3+5-jdk10.0.2-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10576, - "url": "https://cdn.azul.com/zulu/bin/zulu11.2.3-jdk11.0.1-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10604, - "url": "https://cdn.azul.com/zulu/bin/zulu11.29.3-ca-jdk11.0.2-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10687, - "url": "https://cdn.azul.com/zulu/bin/zulu11.31.11-ca-jdk11.0.3-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10856, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.13-ca-jdk11.0.5-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10933, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.15-ca-jdk11.0.5-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10933, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.11-ca-jdk11.0.5-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12397, - "url": "https://cdn.azul.com/zulu/bin/zulu11.45.27-ca-jdk11.0.10-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10667, - "url": "https://cdn.azul.com/zulu/bin/zulu12.1.3-ca-jdk12.0.0-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10710, - "url": "https://cdn.azul.com/zulu/bin/zulu12.2.3-ca-jdk12.0.1-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10780, - "url": "https://cdn.azul.com/zulu/bin/zulu12.3.11-ca-jdk12.0.2-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10846, - "url": "https://cdn.azul.com/zulu/bin/zulu13.27.9-ca-jdk13.0.0-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10888, - "url": "https://cdn.azul.com/zulu/bin/zulu13.28.11-ca-jdk13.0.1-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11073, - "url": "https://cdn.azul.com/zulu/bin/zulu13.29.9-ca-jdk13.0.2-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12408, - "url": "https://cdn.azul.com/zulu/bin/zulu13.37.21-ca-jdk13.0.6-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11236, - "url": "https://cdn.azul.com/zulu/bin/zulu14.27.1-ca-jdk14.0.0-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11349, - "url": "https://cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11513, - "url": "https://cdn.azul.com/zulu/bin/zulu14.29.23-ca-jdk14.0.2-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11780, - "url": "https://cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11924, - "url": "https://cdn.azul.com/zulu/bin/zulu15.28.13-ca-jdk15.0.1-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12101, - "url": "https://cdn.azul.com/zulu/bin/zulu15.28.51-ca-jdk15.0.1-macosx_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12445, - "url": "https://cdn.azul.com/zulu/bin/zulu15.29.15-ca-jdk15.0.2-macosx_x64.tar.gz", + "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" + }, + { + "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 0ec1a0df0..5252af167 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] - }, - { - "id": 10997, - "url": "https://cdn.azul.com/zulu/bin/zulu1.8.0_11-8.2.0.1-windows.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10346, - "url": "https://cdn.azul.com/zulu/bin/zulu8.21.0.1-jdk8.0.131-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10362, - "url": "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10399, - "url": "https://cdn.azul.com/zulu/bin/zulu8.25.0.1-jdk8.0.152-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11355, - "url": "https://cdn.azul.com/zulu/bin/zulu8.46.0.19-ca-jdk8.0.252-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11481, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.47-ca-jdk8.0.262-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11622, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.51-ca-jdk8.0.262-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11535, - "url": "https://cdn.azul.com/zulu/bin/zulu8.48.0.49-ca-jdk8.0.262-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12424, - "url": "https://cdn.azul.com/zulu/bin/zulu8.52.0.23-ca-jdk8.0.282-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10383, - "url": "https://cdn.azul.com/zulu/bin/zulu9.0.0.15-jdk9.0.0-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10413, - "url": "https://cdn.azul.com/zulu/bin/zulu9.0.1.3-jdk9.0.1-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10503, - "url": "https://cdn.azul.com/zulu/bin/zulu10.2+3-jdk10.0.1-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10541, - "url": "https://cdn.azul.com/zulu/bin/zulu10.3+5-jdk10.0.2-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10576, - "url": "https://cdn.azul.com/zulu/bin/zulu11.2.3-jdk11.0.1-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10604, - "url": "https://cdn.azul.com/zulu/bin/zulu11.29.3-ca-jdk11.0.2-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10687, - "url": "https://cdn.azul.com/zulu/bin/zulu11.31.11-ca-jdk11.0.3-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10856, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.13-ca-jdk11.0.5-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10933, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.15-ca-jdk11.0.5-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10933, - "url": "https://cdn.azul.com/zulu/bin/zulu11.35.11-ca-jdk11.0.5-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12397, - "url": "https://cdn.azul.com/zulu/bin/zulu11.45.27-ca-jdk11.0.10-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10667, - "url": "https://cdn.azul.com/zulu/bin/zulu12.1.3-ca-jdk12.0.0-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10710, - "url": "https://cdn.azul.com/zulu/bin/zulu12.2.3-ca-jdk12.0.1-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10780, - "url": "https://cdn.azul.com/zulu/bin/zulu12.3.11-ca-jdk12.0.2-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10846, - "url": "https://cdn.azul.com/zulu/bin/zulu13.27.9-ca-jdk13.0.0-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 10888, - "url": "https://cdn.azul.com/zulu/bin/zulu13.28.11-ca-jdk13.0.1-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11073, - "url": "https://cdn.azul.com/zulu/bin/zulu13.29.9-ca-jdk13.0.2-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12408, - "url": "https://cdn.azul.com/zulu/bin/zulu13.37.21-ca-jdk13.0.6-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11236, - "url": "https://cdn.azul.com/zulu/bin/zulu14.27.1-ca-jdk14.0.0-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11349, - "url": "https://cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11513, - "url": "https://cdn.azul.com/zulu/bin/zulu14.29.23-ca-jdk14.0.2-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11780, - "url": "https://cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 11924, - "url": "https://cdn.azul.com/zulu/bin/zulu15.28.13-ca-jdk15.0.1-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12101, - "url": "https://cdn.azul.com/zulu/bin/zulu15.28.51-ca-jdk15.0.1-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "id": 12445, - "url": "https://cdn.azul.com/zulu/bin/zulu15.29.15-ca-jdk15.0.2-windows_x64.tar.gz", + "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" + }, + { + "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] - }, - { - "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] + "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" + }, + { + "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 0a46983b2..50976b372 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 b3ca6fa17..e3bbea0f9 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 37435e8db..bc454c99a 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 83f879461..60274ce6e 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 a97406f09..92808cd57 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 50147b5a9..42ceeee26 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 | 38 +++++++++++++------ 4 files changed, 93 insertions(+), 41 deletions(-) diff --git a/__tests__/distributors/zulu-installer.test.ts b/__tests__/distributors/zulu-installer.test.ts index 50976b372..95e7e4363 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 e3bbea0f9..46f1bae9a 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 bc454c99a..441c0cdcd 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 60274ce6e..d37caf947 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}`; - - core.debug(`Gathering available versions from '${availableVersionsUrl}'`); - - const availableVersions = - (await this.http.getJson>(availableVersionsUrl)) - .result ?? []; + // 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}'` + ); + } + + 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; + } + + 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 5252af167..7e44242f2 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 46f1bae9a..897497f9c 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 d37caf947..61ad90195 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 42ceeee26..878ee610f 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 95e7e4363..16f4c63f2 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 897497f9c..470de81ef 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 441c0cdcd..a54f55fe1 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 d5f46bbed..dee0ccb72 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 1b1e4feea..808358768 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 61ad90195..8155010b6 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 | 417 ++++++++++++++++------- dist/setup/index.js | 492 ++++++++++++++++++++-------- src/distributions/zulu/installer.ts | 35 +- 3 files changed, 688 insertions(+), 256 deletions(-) diff --git a/dist/cleanup/index.js b/dist/cleanup/index.js index 5a1db9633..0c3278164 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() + - ')' - } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) + 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) + } } } 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 434039045..b4eff3af4 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() + - ')' - } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) + 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) + } } } 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 8155010b6..622c3d342 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 94f89b634..c74487e2c 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 52a613670..16ed97772 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 7e44242f2..dcfb9462f 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 b4eff3af4..aa5c25f3b 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 622c3d342..caf039105 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 92808cd57..36d369e05 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; }