| // Copyright (c) 2015, 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:collection'; | |
| import 'package:source_span/source_span.dart'; | |
| /// Representation of a key/value pair which maps a package name to a | |
| /// _package description_. | |
| /// | |
| /// **Example** of a path-dependency: | |
| /// ```yaml | |
| /// dependencies: | |
| /// <name>: | |
| /// version: <version> | |
| /// path: <path> | |
| /// ``` | |
| abstract class PubspecDependency { | |
| /// The git dependency section, if specified. | |
| PubspecGitRepo? get git; | |
| /// The host section, if specified. | |
| PubspecHost? get host; | |
| /// The dependency name, if specified. | |
| PubspecNode? get name; | |
| /// The path section, if specified. | |
| PubspecEntry? get path; | |
| /// The dependency version, if specified. | |
| PubspecEntry? get version; | |
| } | |
| /// Representation of the map from package name to _package description_ used | |
| /// under `dependencies`, `dev_dependencies` and `dependency_overrides`. | |
| abstract class PubspecDependencyList with IterableMixin<PubspecDependency> {} | |
| /// Representation of a YAML section in a pubspec file. | |
| class PubspecEntry { | |
| final PubspecNode? key; | |
| final PubspecNode value; | |
| PubspecEntry(this.key, this.value); | |
| @override | |
| String toString() => '${key != null ? '$key: ' : ''}$value'; | |
| } | |
| /// Representation of an `environment` section in a pubspec file. | |
| /// | |
| /// **Example** of an environment: | |
| /// ```yaml | |
| /// environment: | |
| /// sdk: '>=2.12.0 <4.0.0' | |
| /// flutter: ^3.3.10 | |
| /// ``` | |
| abstract class PubspecEnvironment implements PubspecSection { | |
| /// The `flutter` section, if specified. | |
| PubspecEntry? get flutter; | |
| /// The (Dart) `sdk` section, if specified. | |
| PubspecEntry? get sdk; | |
| } | |
| /// Representation of git-dependency section in a pubspec file. | |
| /// | |
| /// **Example** of a git-dependency: | |
| /// ```yaml | |
| /// dependencies: | |
| /// foo: | |
| /// git: # <-- this is the [token] property | |
| /// url: https://github.com/example/example | |
| /// ref: main # ref is optional | |
| /// ``` | |
| /// | |
| /// This may also be written in the form: | |
| /// ```yaml | |
| /// dependencies: | |
| /// foo: | |
| /// git: https://github.com/example/example | |
| /// # ^-token ^--url | |
| /// # In this case [ref] is `null`. | |
| /// ``` | |
| abstract class PubspecGitRepo implements PubspecSection { | |
| /// [PubspecEntry] for `ref: main` where [PubspecEntry.key] is `ref` and | |
| /// [PubspecEntry.value] is `main`. | |
| PubspecEntry? get ref; | |
| /// [PubspecEntry] for `url: https://...` or `git: https://`, where [PubspecEntry.key] | |
| /// is either `url` or `git`, and [PubspecEntry.key] is the URL. | |
| /// | |
| /// If the git-dependency is given in the form: | |
| /// ```yaml | |
| /// dependencies: | |
| /// foo: | |
| /// git: https://github.com/example/example | |
| /// ``` | |
| /// Then [token] and `url.key` will be the same object. | |
| PubspecEntry? get url; | |
| } | |
| /// A section describing where a package is hosted in a custom package | |
| /// repository. | |
| abstract class PubspecHost implements PubspecSection { | |
| /// True, if _short-form_ for writing hosted-dependencies was used. | |
| /// | |
| /// **Example** of a hosted-dependency written in short-form: | |
| /// ```yaml | |
| /// dependencies: | |
| /// foo: | |
| /// hosted: https://some-pub-server.com | |
| /// version: ^1.2.3 | |
| /// ``` | |
| /// | |
| /// The _long-form_ for writing the dependency given above is: | |
| /// ```yaml | |
| /// dependencies: | |
| /// foo: | |
| /// hosted: | |
| /// url: https://some-pub-server.com | |
| /// name: foo | |
| /// version: ^1.2.3 | |
| /// ``` | |
| /// | |
| /// The short-form was added in Dart 2.15.0 because: | |
| /// * The `name` property just specifies the package name, which can be | |
| /// inferred from the context. So it is unnecessary to write it. | |
| /// * The nested object and `url` key becomes unnecessary when the `name` | |
| /// property is removed. | |
| bool get isShortForm; | |
| /// The name of the package at the package repository. | |
| PubspecEntry? get name; | |
| /// The URL of the package repository. | |
| PubspecEntry? get url; | |
| } | |
| /// Representation of a leaf-node in a pubspec file. | |
| abstract class PubspecNode { | |
| /// Information about this node's location in the pubspec file. | |
| SourceSpan get span; | |
| /// String value of the node, or `null` if value in the pubspec file is `null` | |
| /// or omitted. | |
| /// | |
| /// **Example** | |
| /// ``` | |
| /// name: foo | |
| /// version: | |
| /// ``` | |
| /// In the example above the [PubspecNode] for `foo` will have [text] "foo", and | |
| /// the [PubspecNode] for `version` will have not have [text] as `null`, as empty | |
| /// value or `"null"` is the same in YAML. | |
| String? get text; | |
| } | |
| /// A list of [PubspecNode]s in a section. | |
| abstract class PubspecNodeList | |
| with IterableMixin<PubspecNode> | |
| implements PubspecSection { | |
| @override | |
| Iterator<PubspecNode> get iterator; | |
| } | |
| abstract class PubspecSection { | |
| /// The node for this section's key. | |
| /// | |
| /// This is primarily used in the string representation of node classes. | |
| PubspecNode get token; | |
| } | |
| /// A visitor that visits various semantic sections of a pubspec file. | |
| abstract class PubspecVisitor<T> { | |
| T? visitPackageAuthor(PubspecEntry author) => null; | |
| T? visitPackageAuthors(PubspecNodeList authors) => null; | |
| T? visitPackageDependencies(PubspecDependencyList dependencies) => null; | |
| T? visitPackageDependency(PubspecDependency dependency) => null; | |
| T? visitPackageDependencyOverride(PubspecDependency dependency) => null; | |
| T? visitPackageDependencyOverrides(PubspecDependencyList dependencies) => | |
| null; | |
| T? visitPackageDescription(PubspecEntry description) => null; | |
| T? visitPackageDevDependencies(PubspecDependencyList dependencies) => null; | |
| T? visitPackageDevDependency(PubspecDependency dependency) => null; | |
| T? visitPackageDocumentation(PubspecEntry documentation) => null; | |
| T? visitPackageEnvironment(PubspecEnvironment environment) => null; | |
| T? visitPackageHomepage(PubspecEntry homepage) => null; | |
| T? visitPackageIssueTracker(PubspecEntry issueTracker) => null; | |
| T? visitPackageName(PubspecEntry name) => null; | |
| T? visitPackageRepository(PubspecEntry repository) => null; | |
| T? visitPackageVersion(PubspecEntry version) => null; | |
| } |