Package Operations
ClubClient exposes all package-read and package-management methods directly on the client instance. There are no sub-clients.
Listing Versions
Retrieve all versions of a package, following the Pub Repository Spec v2 format:
final pkg = await client.listVersions('my_package');
print('Package: ${pkg.name}');print('Latest stable: ${pkg.latest.version}');print('Total versions: ${pkg.versions.length}');
for (final version in pkg.versions) { print(' ${version.version}');}Returns a PackageData object.
Getting a Specific Version
final version = await client.getVersion('my_package', '1.2.0');print('Version: ${version.version}');print('Archive URL: ${version.archiveUrl}');Returns a VersionInfo object.
Downloading Archives
Download the .tar.gz archive for a specific version as bytes:
import 'dart:io';
final bytes = await client.downloadArchive('my_package', '1.2.0');final file = File('my_package-1.2.0.tar.gz');await file.writeAsBytes(bytes);print('Downloaded ${bytes.length} bytes to ${file.path}');downloadArchive returns List<int> (the full archive bytes).
Package Options
Getting Options
final options = await client.getOptions('my_package');print('Discontinued: ${options.isDiscontinued}');print('Unlisted: ${options.isUnlisted}');Returns PkgOptions.
Setting Options
// Discontinue a packageawait client.setOptions( 'my_package', PkgOptions(isDiscontinued: true),);
// Discontinue with a replacement pointerawait client.setOptions( 'my_package', PkgOptions(isDiscontinued: true, replacedBy: 'new_package'),);
// Unlist a package (hide from search)await client.setOptions( 'my_package', PkgOptions(isUnlisted: true),);
// Reverse any optionawait client.setOptions( 'my_package', PkgOptions(isDiscontinued: false, isUnlisted: false),);Version Options
Getting Version Options
final versionOpts = await client.getVersionOptions('my_package', '1.0.1');print('Retracted: ${versionOpts.isRetracted}');Setting Version Options (Retract / Un-retract)
// Retract a broken versionawait client.setVersionOptions( 'my_package', '1.0.1', VersionOptions(isRetracted: true),);
// Un-retract a versionawait client.setVersionOptions( 'my_package', '1.0.1', VersionOptions(isRetracted: false),);Batch Retraction
A common automation task — retract multiple versions at once:
Future<void> retractVersions( ClubClient client, String package, List<String> versions,) async { for (final version in versions) { await client.setVersionOptions( package, version, VersionOptions(isRetracted: true), ); print('Retracted $package $version'); }}
// Usageawait retractVersions(client, 'my_package', ['1.0.1', '1.0.2', '1.0.3']);Like Count
final likes = await client.getLikeCount('my_package');print('$likes likes');Package Score
final score = await client.getScore('my_package');print('${score.grantedPoints}/${score.maxPoints} pub points');
// Score for a specific versionfinal v1Score = await client.getScore('my_package', version: '1.0.0');Returns VersionScore, which includes pana status, granted/max points, and the pana/Dart/Flutter versions used.
Listing All Package Names
Retrieve every package name on the server. Useful for autocomplete or batch operations:
final names = await client.listAllNames();print('${names.length} packages on server');for (final name in names) { print(' $name');}Likes
// Like a packageawait client.like('my_package');
// Unlikeawait client.unlike('my_package');
// List packages the current user has likedfinal liked = await client.likedPackages();for (final name in liked) { print(name);}Search
final results = await client.search( 'http', page: 1, sort: 'relevance',);// results is Map<String, dynamic> — inspect fields by keyprint(results);Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
query | String | (required) | Full-text query |
page | int | 1 | 1-based page number |
sort | String | 'relevance' | Sort mode (e.g., relevance, updated, likes) |
Example: Dashboard Script
List all packages with their version counts and like counts:
import 'package:club_api/club_api.dart';
Future<void> main() async { final client = ClubClient( serverUrl: Uri.parse('https://club.example.com'), token: 'club_pat_...', );
try { final names = await client.listAllNames(); for (final name in names) { final pkg = await client.listVersions(name); final likes = await client.getLikeCount(name); print('$name: ${pkg.versions.length} versions, $likes likes'); } } finally { client.close(); }}