@@ -29,7 +29,6 @@ Map<String, dynamic> _loadYaml(String yamlString) {
2929class Pubspec {
3030 final pubspek.Pubspec _inner;
3131 final String jsonString;
32- Map <String , dynamic >? _json;
3332 String ? _canonicalVersion;
3433
3534 Pubspec ._(this ._inner, this .jsonString);
@@ -44,10 +43,9 @@ class Pubspec {
4443 factory Pubspec .fromJson (Map <String , dynamic > map) =>
4544 Pubspec ._(pubspek.Pubspec .fromJson (map, lenient: true ), json.encode (map));
4645
47- Map <String , dynamic > get asJson {
48- _load ();
49- return _json! ;
50- }
46+ late final _json = _loadYaml (jsonString);
47+
48+ Map <String , dynamic > get asJson => _json;
5149
5250 String get name => _inner.name;
5351
@@ -84,8 +82,7 @@ class Pubspec {
8482 .toList ();
8583
8684 Map <String , dynamic >? get executables {
87- _load ();
88- final map = _json! ['executables' ];
85+ final map = _json['executables' ];
8986 return map is Map <String , dynamic > ? map : null ;
9087 }
9188
@@ -97,7 +94,6 @@ class Pubspec {
9794 /// Returns null if the constraint is missing or does not follow the
9895 /// `>=<version>` pattern.
9996 MinSdkVersion ? get minSdkVersion {
100- _load ();
10197 return MinSdkVersion .tryParse (_inner.environment['sdk' ]);
10298 }
10399
@@ -106,7 +102,6 @@ class Pubspec {
106102 /// Returns null if the constraint is missing or does not follow the
107103 /// `>=<version>` pattern.
108104 late final _minFlutterSdkVersion = () {
109- _load ();
110105 return MinSdkVersion .tryParse (_inner.environment['flutter' ]);
111106 }();
112107
@@ -162,27 +157,32 @@ class Pubspec {
162157 .intersect (VersionConstraint .parse ('<2.12.0-0' ))
163158 .isEmpty;
164159
165- /// Whether the pubspec file contains a flutter.plugin entry.
166- bool get hasFlutterPlugin {
167- _load ();
168- final flutter = _json ! [ 'flutter' ] ;
169- if (flutter == null || flutter is ! Map ) return false ;
160+ late final _flutterPluginMap = () {
161+ final flutter = _json[ 'flutter' ];
162+ if (flutter == null || flutter is ! Map ) {
163+ return null ;
164+ }
170165 final plugin = flutter['plugin' ];
171- return plugin != null && plugin is Map ;
172- }
166+ if (plugin != null && plugin is Map <String , dynamic >) {
167+ return plugin;
168+ } else {
169+ return null ;
170+ }
171+ }();
172+
173+ /// Whether the pubspec file contains a flutter.plugin entry.
174+ bool get hasFlutterPlugin => _flutterPluginMap != null ;
173175
174176 /// Whether the package has a dependency on flutter.
175177 bool get dependsOnFlutter {
176- _load ();
177- final dependencies = _json! ['dependencies' ];
178+ final dependencies = _json['dependencies' ];
178179 if (dependencies == null || dependencies is ! Map ) return false ;
179180 return dependencies.containsKey ('flutter' );
180181 }
181182
182183 /// Whether the package has a dependency on flutter and it refers to the SDK.
183184 bool get dependsOnFlutterSdk {
184- _load ();
185- final dependencies = _json! ['dependencies' ];
185+ final dependencies = _json['dependencies' ];
186186 if (dependencies == null || dependencies is ! Map ) return false ;
187187 final flutter = dependencies['flutter' ];
188188 if (flutter == null || flutter is ! Map ) return false ;
@@ -195,14 +195,24 @@ class Pubspec {
195195 bool get hasOptedIntoNullSafety =>
196196 _sdkConstraintStatus.hasOptedIntoNullSafety;
197197
198- void _load () {
199- _json ?? = _loadYaml (jsonString);
200- }
201-
202198 late final List <Uri > funding = _inner.funding ?? const < Uri > [];
203199
204200 /// Whether the pubspec has any topic entry.
205201 bool get hasTopic => canonicalizedTopics.isNotEmpty;
202+
203+ /// If package is implementing a federated Flutter plugin, this will be name
204+ /// of the plugin package, `null` otherwise.
205+ late final implementsFederatedPluginName = () {
206+ if (_flutterPluginMap == null ) {
207+ return null ;
208+ }
209+ final implements = _flutterPluginMap['implements' ];
210+ if (implements != null && implements is String ) {
211+ return implements ;
212+ } else {
213+ return null ;
214+ }
215+ }();
206216}
207217
208218class MinSdkVersion {
0 commit comments