blob: e43272f135f6ea21763f5f384816ce99ac6fa7c5 [file] [edit]
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:convert';
/// Version and capability metadata for a _DartPad SDK_.
final class VersionInfo {
/// Major version of the worker protocol.
final int workerProtocolMajor;
/// Minor version of the worker protocol.
final int workerProtocolMinor;
/// Run modes supported by this DartPad SDK (e.g. `['console']`).
final List<String> modes;
/// Version of the Dart SDK in this DartPad SDK.
final String dartVersion;
/// Git commit revision of the Dart SDK.
final String dartRevision;
/// Additional key-value metadata properties for this DartPad SDK.
final Map<String, String> properties;
VersionInfo._({
required this.workerProtocolMajor,
required this.workerProtocolMinor,
required List<String> modes,
required this.dartVersion,
required this.dartRevision,
Map<String, String> properties = const {},
}) : modes = List.unmodifiable(modes),
properties = Map.unmodifiable(properties);
factory VersionInfo.fromJson(Map<String, Object?> json) {
if (json
case {
'workerProtocolMajor': final num workerProtocolMajor,
'workerProtocolMinor': final num workerProtocolMinor,
'modes': final List<Object?> modes,
'dartVersion': final String dartVersion,
'dartRevision': final String dartRevision,
'properties': final Map<Object?, Object?> properties,
}
when modes.every((m) => m is String) &&
properties.entries.every(
(e) => e.key is String && e.value is String,
)) {
return VersionInfo._(
workerProtocolMajor: workerProtocolMajor.toInt(),
workerProtocolMinor: workerProtocolMinor.toInt(),
modes: modes.cast<String>(),
dartVersion: dartVersion,
dartRevision: dartRevision,
properties: properties.cast<String, String>(),
);
}
throw FormatException('Invalid VersionInfo JSON: $json');
}
Map<String, Object?> toJson() => {
'workerProtocolMajor': workerProtocolMajor,
'workerProtocolMinor': workerProtocolMinor,
'modes': modes,
'dartVersion': dartVersion,
'dartRevision': dartRevision,
'properties': properties,
};
@override
String toString() => 'VersionInfo(${jsonEncode(toJson())})';
}
/// Creates a [VersionInfo] instance.
VersionInfo createVersionInfo({
required int workerProtocolMajor,
required int workerProtocolMinor,
required List<String> modes,
required String dartVersion,
required String dartRevision,
Map<String, String> properties = const {},
}) => VersionInfo._(
workerProtocolMajor: workerProtocolMajor,
workerProtocolMinor: workerProtocolMinor,
modes: modes,
dartVersion: dartVersion,
dartRevision: dartRevision,
properties: properties,
);
/// Extracts Flutter version properties from a parsed `flutter.version.json`.
Map<String, String> extractFlutterVersionProperties(
Map<String, Object?> flutterVersionJson,
) => {
if (flutterVersionJson['flutterVersion'] ??
flutterVersionJson['frameworkVersion']
case final String v)
'flutterVersion': v,
if (flutterVersionJson['frameworkRevision'] case final String r)
'flutterRevision': r,
if (flutterVersionJson['engineRevision'] case final String r)
'engineRevision': r,
};