* feat(datasource): add GraalVM version datasource with support for JDK and JRE releases * feat(datasource): add GraalVM version datasource with support for JDK and JRE releases * feat(datasource): add GraalVM version datasource with support for JDK and JRE releases * feat(datasource): add GraalVM version datasource with support for JDK and JRE releases * feat(datasource): add GraalVM version datasource with support for JDK and JRE releases * add coverage * fix * fix * fix * code cov * code cov * code cov * refactor(datasource): integrate GraalVM into java-version datasource Merges graalvm-version datasource into java-version as a unified multi-vendor Java distribution datasource. Implements vendor-based modular architecture with routing layer for Adoptium (Eclipse Temurin) and Oracle GraalVM. Architecture: - Vendor-specific handlers (adoptium.ts, graalvm.ts) with routing in index.ts - Vendor-aware system detection with different arch/os mappings per vendor - Custom registry support for GraalVM's mise-java API - Adoptium remains the default registry for backwards compatibility Package names: - New explicit: adoptium-jdk, adoptium-jre, oracle-graalvm-jdk, oracle-graalvm-jre - Legacy (map to Adoptium): java, java-jdk, java-jre Changes: - Created adoptium.ts and graalvm.ts vendor handlers - Enhanced common.ts with vendor detection and vendor-specific system mappings - Updated index.ts with routing layer and custom registry support - Merged test suites with comprehensive coverage for both vendors - Updated mise manager integration to use JavaVersionDatasource - Removed graalvm-version datasource directory All 65 datasource tests and 93 mise manager tests passing. * fix * test(datasource): add coverage for non-HttpError paths in java-version * fix(datasource): remove dead code and add coverage for java-version Remove unreachable HttpError handling from _getReleases catch block since both getAdoptiumReleases and getGraalvmReleases handle HttpError internally. Add test for the graalvmRegistryUrl fallback when registryUrl is undefined. * fix(datasource): address review comments for GraalVM datasource - Remove unused 'datasource-graalvm-version' cache namespace - Convert MiseJavaRelease interface to Zod schema and derive type from it - Use http.getJson() with the Zod schema in getGraalvmReleases instead of getJsonUnchecked, letting the schema handle invalid/empty responses - Update getGraalvmReleases test mock to use getJson * docs: remove unused datasource-graalvm-version from cacheTtlOverride docs * fix(datasource): preserve Adoptium config typing * fix(datasource): harden GraalVM release parsing * fix(datasource): address GraalVM review feedback * test: cover GraalVM mise package mapping * test(datasource): cover default GraalVM registry fallback * test(datasource): cover legacy registry resolution * test(datasource): type legacy datasource mocks * fix(datasource): harden GraalVM defaults and responses * refactor(datasource): use function-only registry accessors * test(datasource): cover registry accessor functions * test: restore coverage exclusions * chore: retrigger CI checks
Rubygems datasource
Datasource query order depends on the registry.
Querying rubygems.org
Rubygems rate limits are easy to hit, so we need to be careful with the queries. This is implemented with two-level cache:
-
First, we query
https://rubygems.org/versionsendpoint for current versions for all packages.Either full or delta sync is performed, depending on the cache state.
All the data of this layer is stored in-memory as the mapping
packageName → version[].stateDiagram-v2 [*] --> Empty state "Empty" as Empty Empty --> FullSync: getPkgReleases() state "Synced" as Synced Synced --> DeltaSync state "Unsupported" as Unsupported Unsupported --> [*] state "Full sync" as FullSync : GET /versions (~20Mb) state full_sync_result <<choice>> FullSync --> full_sync_result: Response full_sync_result --> Synced: (1) Status 200 full_sync_result --> Unsupported: (2) Status 404 full_sync_result --> Empty: (3) Status other than 200 or 404\n Clear cache and throw ExternalHostError state "Delta sync" as DeltaSync: GET /versions with "Range" header state delta_sync_result <<choice>> DeltaSync --> delta_sync_result: Successful response delta_sync_result --> Synced: (1) Status other than 206\nFull data is received, extract and replace old cache\n (as if it is the full sync) delta_sync_result --> FullSync: (2) The head of response doesn't match\n the tail of the previously fetched data delta_sync_result --> Synced: (3) The head of response matches\n the tail of the previously fetched data state delta_sync_error <<choice>> DeltaSync --> delta_sync_error: Error response delta_sync_error --> FullSync: (1) Status 416 should not happen\nbut moves to full sync delta_sync_error --> Unsupported: (2) Status 404 delta_sync_error --> Empty: (3) Status other than 404 or 416 -
Then, more data is obtained from
https://rubygems.org/api/v1/versions/<package>.jsonandhttps://rubygems.org/api/v1/gems/<package>.json.From the previous layer, the cache key is formed from the
packageName, and the list of versions is additionally hashed and stored to ensure consistency, so that we reach these API endpoints only when the key has expired or when the list of versions has changed.The data for this cache layer is being persisted in the longer-term package cache.
Querying rubygems.pkg.github.com or gitlab.com
These particular registries are queried using obsolete API
/api/v1/dependencies
Other registries
- Fetch from
/api/v1/versions/<package>.json - Fallback to
/info/<package>, if above fails - Fallback to the obsolete
/api/v1/dependencies, if above fails