pub repository
mirror.p-hatan.irpetitparser
4.0.0-nullsafetyA dynamic parser framework to build efficient grammars and parsers quickly.
Readme
PetitParser for Dart
Pub Package Build Status Coverage Status GitHub Issues GitHub Forks GitHub Stars GitHub License
Grammars for programming languages are traditionally specified statically. They are hard to compose and reuse due to ambiguities that inevitably arise. PetitParser combines ideas from scannnerless parsing, parser combinators, parsing expression grammars (PEG) and packrat parsers to model grammars and parsers as objects that can be reconfigured dynamically.
This library is open source, stable and well tested. Development happens on GitHub. Feel free to report issues or create a pull-request there. General questions are best asked on StackOverflow.
The package is hosted on dart packages. Up-to-date API documentation is created with every release.
Tutorial
Below are step by step instructions of how to write your first parser. More elaborate examples (JSON parser, LISP parser and evaluator, Prolog parser and evaluator, etc.) are included in the example repository.
Installation
Follow the installation instructions on dart packages.
Import the package into your Dart code using:
import 'package:petitparser/petitparser.dart';
Writing a Simple Grammar
Writing grammars with PetitParser is simple as writing Dart code. For example, to write a grammar that can parse identifiers that start with a letter followed by zero or more letter or digits are defined as follows:
final id = letter() & (letter() | digit()).star();
If you look at the object id in the debugger, you'll notice that the code above builds a tree of parser objects:
- SequenceParser: This parser accepts a sequence of parsers.
- CharacterParser: This parser accepts a single letter.
- PossessiveRepeatingParser: This parser accepts zero or more times another parser.
- ChoiceParser: This parser accepts a single word character.
- CharacterParser: This parser accepts a single letter.
- CharacterParser: This parser accepts a single digit.
- ChoiceParser: This parser accepts a single word character.
The operators & and | are overloaded and create a sequence and a choice parser respectively. In some contexts it might be more convenient to use chained function calls:
final id = letter().seq(letter().or(digit()).star());
Parsing Some Input
To actually parse a String (or List) we can use the method Parser.parse:
final id1 = id.parse('yeah');
final id2 = id.parse('f12');
The method Parser.parse returns a Result, which is either an instance of Success or Failure. In both examples above we are successful and can retrieve the resulting value using Success.value:
print(id1.value); // ['y', ['e', 'a', 'h']]
print(id2.value); // ['f', ['1', '2']]
While it seems odd to get these nested arrays with characters as a return value, this is the default decomposition of the input into a parse-tree. We'll see in a while how that can be customized.
If we try to parse something invalid we get an instance of Failure and we can retrieve a descriptive error message using Failure.message:
final id3 = id.parse('123');
print(id3.message); // 'letter expected'
print(id3.position); // 0
Trying to retrieve result by calling Failure.value would throw the exception ParserError. Context.isSuccess and Context.isFailure can be used to decide if the parsing was successful.
If you are only interested if a given string matches or not you can use the helper method Parser.accept:
print(id.accept('foo')); // true
print(id.accept('123')); // false
Different Kinds of Parsers
PetitParser provide a large set of ready-made parser that you can compose to consume and transform arbitrarily complex languages. The terminal parsers are simplest. We've already seen a few of those:
char('a')parses the character a.string('abc')parses the string abc.any()parses any character.digit()parses any digit from 0 to 9.letter()parses any letter from a to z and A to Z.word()parses any letter or digit.
So instead of using the letter and digit predicate, we could have written our identifier parser like this:
final id = letter() & word().star();
The next set of parsers are used to combine other parsers together:
p1 & p2andp1.seq(p2)parse p1 followed by p2 (sequence).p1 | p2andp1.or(p2)parse p1, if that doesn't work parse p2 (ordered choice).p.star()parses p zero or more times.p.plus()parses p one or more times.p.optional()parses p, if possible.p.and()parses p, but does not consume its input.p.not()parses p and succeed when p fails, but does not consume its input.p.end()parses p and succeed at the end of the input.
To attach an action or transformation to a parser we can use the following methods:
p.map((value) => ...)performs the transformation given the function.p.pick(n)returns the n-th element of the list p returns.p.flatten()creates a string from the result of p.p.token()creates a token from the result of p.p.trim()trims whitespaces before and after p.
To return a string of the parsed identifier, we can modify our parser like this:
final id = (letter() & word().star()).flatten();
To conveniently find all matches in a given input string you can use Parser.matchesSkipping:
final matches = id.matchesSkipping('foo 123 bar4');
print(matches); // ['foo', 'bar4']
These are the basic elements to build parsers. There are a few more well documented and tested factory methods in the Parser class. If you want browse their documentation and tests.
Writing a More Complicated Grammar
Now we are able to write a more complicated grammar for evaluating simple arithmetic expressions. Within a file we start with the grammar for a number (actually an integer):
final number = digit().plus().flatten().trim().map(int.parse);
Then we define the productions for addition and multiplication in order of precedence. Note that we instantiate the productions with undefined parsers upfront, because they recursively refer to each other. Later on we can resolve this recursion by setting their reference:
final term = undefined();
final prod = undefined();
final prim = undefined();
final add = (prod & char('+').trim() & term)
.map((values) => values[0] + values[2]);
term.set(add | prod);
final mul = (prim & char('*').trim() & prod)
.map((values) => values[0] * values[2]);
prod.set(mul | prim);
final parens = (char('(').trim() & term & char(')').trim())
.map((values) => values[1]);
final number = digit().plus().flatten().trim().map(int.parse);
prim.set(parens | number);
To make sure our parser consumes all input we wrap it with the end() parser into the start production:
final parser = term.end();
That's it, now we can test our parser and evaluator:
parser.parse('1 + 2 * 3'); // 7
parser.parse('(1 + 2) * 3'); // 9
Using the Expression Builder
Writing such expression parsers is pretty common and can be quite tricky to get right. To simplify things, PetitParser comes with a builder that can help you to define such grammars easily. It supports the definition of operator precedence; and prefix, postfix, left- and right-associative operators.
The following code creates the empty expression builder:
final builder = ExpressionBuilder();
Then we define the operator-groups in descending precedence. The highest precedence are the literal numbers themselves. This time we accept floating-point numbers, not just integers. In the same group we add support for the parenthesis:
builder.group()
..primitive(digit()
.plus()
.seq(char('.').seq(digit().plus()).optional())
.flatten()
.trim()
.map((a) => num.tryParse(a)))
..wrapper(char('(').trim(), char(')').trim(), (String l, num a, String r) => a);
Then come the normal arithmetic operators. Note, that the action blocks receive both, the terms and the parsed operator in the order they appear in the parsed input:
// negation is a prefix operator
builder.group()
..prefix(char('-').trim(), (String op, num a) => -a);
// power is right-associative
builder.group()
..right(char('^').trim(), (num a, String op, num b) => math.pow(a, b));
// multiplication and addition are left-associative
builder.group()
..left(char('*').trim(), (num a, String op, num b) => a * b)
..left(char('/').trim(), (num a, String op, num b) => a / b);
builder.group()
..left(char('+').trim(), (num a, String op, num b) => a + b)
..left(char('-').trim(), (num a, String op, num b) => a - b);
Finally, we can build the parser:
final parser = builder.build().end();
After executing the above code we get an efficient parser that correctly evaluates expressions like:
parser.parse('-8'); // -8
parser.parse('1+2*3'); // 7
parser.parse('1*2+3'); // 5
parser.parse('8/4/2'); // 1
parser.parse('2^2^3'); // 256
Misc
Examples
The package comes with a large collection of example grammars and language experiments ready to explore:
example/lib/dartcontains an experimental Dart grammar.example/lib/jsoncontains a complete JSON grammar and parser.example/lib/lispcontains a complete LISP grammar, parser and evaluator.example/lib/prologcontains a basic Prolog grammar, parser and evaluator.example/lib/smalltalkcontains a complete Smalltalk grammar.
Furthermore, there are numerous open source projects using PetitParser:
- badger is an experimental programming language.
- expression_language is a library for parsing and evaluating expressions.
- intl_translation provides internationalization and localization support to Dart.
- pem encodes and decodes textual cryptographic keys.
- powerconfig is a power config implementation.
- query implements search queries with support for boolean groups, field scopes, ranges, etc.
- rythm is a rich featured, high performance template engine.
- xml is a lightweight library for parsing, traversing, and querying XML documents.
History
PetitParser was originally implemented in Smalltalk. Later on, as a mean to learn these languages, I reimplemented PetitParser in Java and Dart. The implementations are very similar in their API and the supported features. If possible, the implementations adopt best practises of the target language.
Implementations
License
The MIT License, see LICENSE.
Changelog
Changelog
4.0.0
- Dart 2.10 requirement and null-safety.
Success.messagethrows anUnsuppotedErrorexception, instead of returningnull.DelegateParserhas been made abstract to avoid a concrete class in-between abstract classes.Parser.delegate()has been removed, useParser.settable()as an equivalent replacement.Parser.optional()is now returningParser<T?>, to provide a non-null default value useParser.optionalWith(T value).Parser.not()is now returning the failureParser<Failure<T>>as success value, instead ofnull.epsilon()is now returningParser<void>, to provide a non-null default value useepsilonWith(T value).
3.1.0
- Fix missing type information on
eofandfailureparser. - Optimize character predicates by using lookup tables.
- Improvements to documentation and examples.
3.0.0
- Dart 2.7 compatibility and requirement (extension methods).
- New features:
String.toParser()enables creating efficient string and character parsers more easily.Iterable.toChoiceParser()andIterable.toSequenceParser()enables creating parsers from collections more easily.Parser.callCC(Function)enables capturing a parse continuation more easily.
- Restructure the internal code to be more modular:
- The
Parserclass now only defines a few core methods, everything else is an extension method. - As long as you continue to import
package:petitparser/petitparser.dartnone of the changes should affect existing code. - Parser implementations have been moved to
package:petitparser/parser.dart. - Helpers to parse and extract data has been moved to
package:petitparser/matcher.dart. - The expression builder has been moved to
package:petitparser/expression.dart. - The grammar builder has been moved to
package:petitparser/definition.dart.
- The
- Breaking changes:
Parseris no longer aPattern, but can be converted to one withtoPattern.anyInhas been removed in favor of the already existing and equivalentanyOfparser.pickandpermuteare defined onParser<List>, thus they won't be available on the more genericParser<dynamic>any longer. Prefix the operators with acastListoperator.
2.5.0
- Made
ParserErroraFormatExceptionto follow typical Dart exception style.
2.4.0
- Dart 2.4 compatibility and requirement.
- More tight typing, more strict linter rules.
- Documentation improvements.
2.3.0
- Dart 2.3 compatibility and requirement.
- The expression builder supports building expression with parenthesis.
- Improved the documentation on greedy and lazy parsers.
- Add a prolog parser and interpreter example.
- Numerous optimizations and improvements.
2.2.0
- Dart 2.2 compatibility and requirement.
- Parser implements the
Patterninterface. - Add an example of the expression builder to the tutorial.
- Introduce a fast-parse mode that avoids unnecessary memory allocations during parsing.
2.1.0
- Rename ParserError to ParserException, and make it an Exception.
- Simplify the
EndOfInputParserand theListParser. - Add a
PositionParserthat produces the current input position. - Constructor assertions across the stack.
2.0.0
- Make parsers fully typed, where it makes sense.
- In most cases this should have no effect on existing code, but sometimes can point out actual bugs.
- In rare cases, it might be necessary to insert
cast<R>orcastList<R>at the appropriate places.
- Move examples into their own example package.
1.8.0
- Drop Dart 1.0 compatibility.
1.7.6
- More Dart 2 strong mode fixes.
1.7.5
- Dart 2.0 strong mode compatibility.
- Removed deprecated code, and empty beta package.
- Reformatted all code using dartfmt.
1.7.0
- Dart 2.0 compatibility.
- Fixed numerous analyzer warnings.
- Generate better default error messages.
- Moved example grammars to examples.
1.6.1
- Fix bug with duplicated package name.
- Update documentation.
1.6.0
- Migrate to micro libraries.
- Move Smalltalk, Json, Dart and Lisp grammars to examples.
1.5.5
- Strict typing fixes.
1.5.4
- Fix analyzer warnings.
- Fix package dependencies.
1.5.3
- Dev compiler support.
1.5.2
- Enable strong mode.
1.5.1
- Improve the Dart parser and add more tests.
1.5.0
- Update documentation to match the style guide.
- Change library names.
- Add optimizations and tests for the Dart language grammar.
- Improve comments.
- Better error-handling and primitives for Lisp command line app.
- Fix unicode parsing in the JSON parser.
- Add browser back to dev_dependencies.
1.4.3
- Restore the CompositeParser class.
- Add more references to open source projects using PetitParser.
1.4.2
- Integrate the tutorial into the README.
- Improve formatting of README code blocks.
1.4.1
- Improve test coverage.
- Bump minimum SDK to 1.8.0.
- Remove deprecated CompositeParser class.
1.4.0
- Migrate from unittest to test.
- Setup Travis.
- Allow for const GrammarDefinitions.
- Fix typo in docs.
- Clean up the JSON grammar.
- Format the benchmarks.
1.3.7
- Cleanup dependencies:
- browser is now
>=0.10.0 <0.11.0. - unittest is now
>=0.11.0 <0.12.0. - Remove explicit dependency on matcher package.
- browser is now
- Make the JSON parser twice as fast.
- Reformat tests.
1.3.6
- Add a benchmark for JSON native vs PetitParser.
1.3.5
- Change hasEqualProperties to gracefully handle parsers of inconsistent types.
1.3.4
- Format source code.
- Add missing documentation.
1.3.3
- Performance optimizations
Installing
export PUB_HOSTED_URL=https://pub.mirror.p-hatan.ir
flutter pub add petitparserpubspec.yaml
name: petitparser
version: 4.0.0-nullsafety
homepage: https://github.com/petitparser/dart-petitparser
description: A dynamic parser framework to build efficient grammars and parsers
quickly.
environment:
sdk: '>=2.10.0-92.0.dev <3.0.0'
dependencies:
meta: ^1.3.0-nullsafety
dev_dependencies:
test: ^1.16.0-nullsafety
Version history
| Version | Published | Archive | SHA-256 |
|---|---|---|---|
| 0.1.0 | 2012-10-23T18:16:56.176760Z | Download | f54c4ff1366ffdc5b4bf9786b6d809aca48118a1a51f813ba0aaf146507d1f0f |
| 0.2.0 | 2012-12-18T17:13:46.500870Z | Download | a6f3d4f81c07aaf77bc4e6c271e8cd16d1de24920234b7104a0bd4598f0a2fcb |
| 0.2.1 | 2013-01-17T19:12:51.736850Z | Download | 560e323ca680bb215dcb354821cb1020dfa35a07118e368cf53095227b11782c |
| 0.2.2+m3 | 2013-01-23T19:20:57.023750Z | Download | f7a5556334db97017a64231fd2797e07035f494bae0b65ac79de14e1705ae7d4 |
| 0.2.3+m3 | 2013-03-04T07:47:59.328190Z | Download | 3c555c58a64405abaf402b5ce2620e91f5b06420a4be2c1cc2baf0cfa5df765a |
| 0.2.4+m4 | 2013-03-20T04:02:03.085030Z | Download | d3c7d873f43d35990598d7d2694fa9d8d0fe466c12b055bc0c03881ad77502bf |
| 0.2.5+m4 | 2013-04-11T18:45:58.734330Z | Download | 6b2d59b917f4e6fc5d1ac9667fb983917056fd10e913f6e0bbd157817c6a92d9 |
| 0.3.0 | 2013-04-17T18:57:29.265130Z | Download | 57ebc797dfe3686f97dbe0afe6bbf38281120ad0088dfbb683d99a5218d0e398 |
| 0.4.0 | 2013-04-29T22:09:19.837990Z | Download | 912ce5f47d56893cca55fb0dc9ffb32094c652f04929bf5d21c3dd16dadb3d1e |
| 0.4.1 | 2013-05-02T20:23:06.978340Z | Download | b05875e99ae10481bbd1499d7cebf3aa60f634cf23dd8c61fc13f36cab40b77b |
| 0.4.2 | 2013-05-20T10:06:25.835800Z | Download | 9781136a9c8f200d1408fd569dbd172776891a6027f1bdec92bda7345a2b9e27 |
| 0.4.3 | 2013-05-30T19:05:27.659710Z | Download | 6ffea950edf9e56f102b35283343aee730aa456d483dd425f0b005538462ec4e |
| 0.5.0 | 2013-07-03T20:34:16.666390Z | Download | 5fe185f5956a814dc7f43edce6f8161246d06f6e93200b207d66c056e9911ddc |
| 0.5.1 | 2013-08-02T22:02:52.142070Z | Download | 60787a806b5572af688194b287cc2a6049a17417c351bebc034e815db6f3003b |
| 0.5.2 | 2013-08-15T08:27:56.517430Z | Download | a8eb809ce0295b395432e51f13a003a777e88e369f412bf662cf6a787096f7e0 |
| 0.5.3 | 2013-09-09T15:07:36.207320Z | Download | 58faced45be6614412dae2a43df5067ddb06455a8fcbf6eef9ec6a9051226127 |
| 0.5.4 | 2013-09-17T11:49:05.269910Z | Download | f082cafefc15f0a9cbef5d9fc2194160f2c6c0a35385454192394ff6b721c731 |
| 0.5.5 | 2013-10-05T09:55:28.974950Z | Download | ff7e2e742af0ee2f64293dc8324a0bc7a185ff550fa52fa7f02ab3c46204841c |
| 0.5.6 | 2013-10-29T07:19:20.308840Z | Download | 2dda7e9b3b84644a4e0f59bbf4c0147fed48696660ae5fe28ae2091a0e5d96c7 |
| 0.5.7 | 2013-11-07T18:18:43.058070Z | Download | 24d14d94697a5374cd072c392e284cac58223d98b06d5c369d0413a1e20daf0e |
| 1.0.0 | 2013-11-08T21:19:16.954210Z | Download | b3728c601c3aa31e2571f4a801ac73f0a0a603f95c074f49aee34a477862ca01 |
| 1.0.1 | 2014-01-07T17:04:30.124690Z | Download | eda0d023bb7c07a0c578d2cb2b4ccb218dfbf74a30da83dadba855e00898527d |
| 1.1.0 | 2014-02-09T21:31:14.770470Z | Download | 8a3b7d51f3c0b4ee61600058a0bfca5643ed186fb60e1e60927b114d51d855c1 |
| 1.1.1 | 2014-02-28T07:36:55.844440Z | Download | f637a759a3adabcefac48d632f902a528d6eeaa264943ce74ff23e1cc5d98b04 |
| 1.1.2 | 2014-04-21T18:03:59.118710Z | Download | 9f87252b392806ff20b5514b43dc041cfb6e05c326d1082c119a3c754b4f43de |
| 1.1.3 | 2014-05-17T17:53:13.184250Z | Download | 6c4a24f45ad4e2c85cc2b813946c3daa92f458d7419bdb9359a59cad39d4cea4 |
| 1.2.0 | 2014-07-06T14:47:20.271230Z | Download | a4add18fa4709a3cf1ba26de158bf18eef598b54a2a85de5047f4883f50386a0 |
| 1.2.1 | 2014-08-01T17:32:20.171550Z | Download | eff26935e49ed1bd2cb80c7a800d0d9006b8a44d00a75c46df52949ef0c813ff |
| 1.2.2 | 2014-08-16T10:27:32.560340Z | Download | e312bc7b1925154f9532b56420460a28bbfd8065df9722d22a8eb38251811e5d |
| 1.3.0 | 2014-11-15T14:01:56.751460Z | Download | 1fb3cbd841cac9d42d2a639e228d6b329270cee1050c52ade752656fea58fe55 |
| 1.3.1 | 2014-11-29T08:13:28.023970Z | Download | 2885cb5892fb538d4d991bc9fb3293a371b9cf36778c3b7eb72eabdf0c155d0c |
| 1.3.2 | 2014-12-14T11:01:49.298150Z | Download | 2aba483ab5b87dc68c1f1e9c265ca9bae5a267c69efea95ec180d4ad9f14a190 |
| 1.3.3 | 2014-12-27T17:57:12.368800Z | Download | 7c6ba4652bd9ecdb3e6893dea48de98456329838c3ac17990eabf4c7393f5f42 |
| 1.3.4 | 2015-01-23T21:00:41.840690Z | Download | 3d9b4f60f8c4aa745cc6114ec23711137c69fbdf24b49f41c123b5890266a3a8 |
| 1.3.6 | 2015-02-11T08:49:12.415680Z | Download | ce4e39f601b64b02adfe07b95eb409a2439a12a3d2f7a348a9993c8b75adeb32 |
| 1.3.7 | 2015-02-27T18:39:53.288380Z | Download | c0aab2cd35c85877b623bb6a0d5556a482680874ab77bf2c2c403fc5ca2c8749 |
| 1.4.0 | 2015-05-15T11:51:10.014Z | Download | 2f8eb930944f1e9138077cf38f9d82f024c57efdcdf8950a6b7e7eaefe0da08d |
| 1.4.1 | 2015-05-15T16:06:56.876Z | Download | 5414728596a07e38592ab87b1a19643cdbdbf5ce580747c291d33e680b4e1780 |
| 1.4.2 | 2015-05-17T09:44:54.966Z | Download | 6fc9effe307f31c6ad2fb465ace78eaddeaa8cff3becde5101befb4d9c3ec17b |
| 1.4.3 | 2015-05-17T15:37:38.002Z | Download | 49af578832195bba5d2e48ff58a8b89c8504e42c7c5f35c67bfb404752ac4c4f |
| 1.5.0 | 2015-10-06T18:08:39.912Z | Download | 763239e6b0009e9276a90d11c0a179c871967f87cbfe694d0b673a8ab540a4e5 |
| 1.5.1 | 2016-01-17T10:08:08.791Z | Download | 620dbddfcc3b83fc327e0249e33eb5ba4c91c178775bdfb0b88e6424294e3746 |
| 1.5.2 | 2016-04-05T10:22:08.428Z | Download | 99a1ec032d9b3d5cd73a8f36d5c1d64a0d213bbada1b093d4d04698adbc08c5b |
| 1.5.3 | 2016-04-05T10:34:18.270Z | Download | f20cbc743ce54b11127e74653edf8efebbe5929e340f4ab1142d81c662d6b090 |
| 1.5.4 | 2016-10-17T15:25:21.622Z | Download | 63a945886e32d1b32e6c4f58221b428591b5795da4c39f0ac40de461ab25f9b0 |
| 1.5.5 | 2017-07-04T11:17:05.473346Z | Download | 32ce3727e2eb402c82e5f6638b75f50dbfc94f8ed999e1606c779a0c25b10ada |
| 1.6.0 | 2017-08-04T20:09:18.176831Z | Download | eb050332bda8182b0cb9a5dd2d6804be3ee6c136cd180faf5f26e3c36cd10f74 |
| 1.6.1 | 2017-08-31T21:30:05.922015Z | Download | ccc2ef030855d102a0f8c02e1889eec6507359a7d879f39fba63041932c76f1b |
| 1.7.0 | 2017-12-19T19:55:11.595620Z | Download | f1c072036ca2ee6bb19b363febfd7076bd38f61430bac8359fd4ac50b11b15c5 |
| 1.7.1 | 2018-03-08T19:08:27.354961Z | Download | bc50c1eba95cc564cebee90c793436eba637e45995106355423282bcf2ad45e2 |
| 1.7.2 | 2018-03-08T19:34:22.645002Z | Download | f22f3ffdef00a793a3b38e96a41a399384c09da8e8df34bd7ee2c9d41fb1abb9 |
| 1.7.3 | 2018-03-08T19:37:35.602492Z | Download | be43ac2a3c2dfe79dfeceeff9e9eb3f467876e2767f7ac554d34a959237b7397 |
| 1.7.4 | 2018-03-09T12:32:00.941207Z | Download | acdbaba7ce6b2f4ef95479ea98c5fd1a76d198f5588f3da6814af3f4c31eb936 |
| 1.7.5 | 2018-03-09T22:24:56.411460Z | Download | 6fc8914c448dfe59594f6dcefda65bae29caa6420b9f9929f13f1edcf7bd4191 |
| 1.7.6 | 2018-03-15T08:43:01.044334Z | Download | ad187be44d18a5965f8cc129af6e360ce8e3cc11f81b93085dbde0e7cca38571 |
| 1.7.7 | 2018-07-21T14:08:33.941326Z | Download | 1884c28ad0060c2b0a3b9ddef5a6986c07494d62786c670816d174bbc0f87575 |
| 2.0.0 | 2018-08-01T18:47:52.414261Z | Download | 2b5c9e2f1cb33441b156ceeedfa82d1b3e892510f03b78278c1cc88a4df1f343 |
| 2.0.1 | 2018-09-15T19:29:06.877263Z | Download | 034cc842fff1ee473f8124da502414282896e3471c52322464e9b213d5c81ad5 |
| 2.0.2 | 2018-09-27T14:09:05.849616Z | Download | 528516f16e35b0aed538b145feb79e1f610165c9ab10c5508e499c88689071a7 |
| 2.1.0 | 2019-01-07T21:27:38.118964Z | Download | 059ae18865269fdf10d25afe5a2d3379efa710fd23d471fa52fca4439511d23c |
| 2.1.1 | 2019-01-24T14:39:52.212011Z | Download | 108c94d0766fb1afa42228af753f53d085d9bdd6dc3aef607ca5c58f4d6496a5 |
| 2.2.0 | 2019-02-27T20:29:54.952683Z | Download | 2ccfcf4be74d4427a47b1df466d7ac3027797680068a0e86a4f7633d2a569c3a |
| 2.2.1 | 2019-03-07T06:19:05.828783Z | Download | 1f4f9ab4bbb08398b8e4bb0943016283d9b08a5f738661d588b2ec8b3010cbdf |
| 2.3.0 | 2019-05-10T13:32:28.094817Z | Download | 80c100878a233febeb8678825c8d0ad513fe349889897a9cf89334d37236cc7e |
| 2.4.0 | 2019-06-28T20:15:28.073171Z | Download | 4525e4341c9aabc4023700abff9b2e26f969dff9476ddf8f40de63ee5748acab |
| 3.0.0 | 2020-01-01T09:59:43.151919Z | Download | 382799fb2c795cd0eac17db2a4a88df01c098a248ca4e6ae456f52019b5f9cb1 |
| 3.0.1 | 2020-02-12T10:46:56.868354Z | Download | a6adb2f6edd16883b5bd36c667b0cf895cb3553fe2e274dc277b6cdedeaace98 |
| 3.0.2 | 2020-03-30T17:33:45.672316Z | Download | 5d409b6c77f0fcf944034a1d2a13afbc3297bd34f05771aed2193bf15814c039 |
| 3.0.3 | 2020-05-30T07:27:08.796109Z | Download | 3817f3d6d36048c60b1a5d0f48866d0f428d031616caeb16705e21e6f6682239 |
| 3.0.4 | 2020-05-30T10:07:04.173553Z | Download | 6802205ca621e6d2d2fc315d89491a685c33a16bf82875327aab0295afb3ec4f |
| 3.1.0 | 2020-07-18T09:25:27.838333Z | Download | fe07f9345bf03ff0c881d1f5494e20cc40206780ca5dea86aab8037cb49af5f2 |
| 4.0.0-nullsafety | 2020-09-07T16:56:25.699722Z | Download | 641666f59c207a4104d3deec59db627d4368aa3415ccb9982ecc7dc6802d7d57 |
| 4.0.0-nullsafety.1 | 2020-11-21T07:57:07.968835Z | Download | 12576308c0232b8a2acc6b66710c4920ed760f4466f5dee63ff7c6782633019b |
| 4.0.0 | 2021-02-17T21:44:05.867149Z | Download | 3aac98525056d0ae4b397245d9523e51f3326b8fcd83d14bdd186435c6ec4b77 |
| 4.0.1 | 2021-02-19T10:50:55.719144Z | Download | 88917a76a71fc578cfdbeb44b4da718c4c4e098de6a41153c200825195b80e53 |
| 4.0.2 | 2021-02-19T13:22:00.265489Z | Download | f725a68581f744b9cdc680e525a20fb86491053bf5ee23562e0d6ea3ee1c173c |
| 4.1.0 | 2021-04-05T15:37:16.055645Z | Download | 85e8f8b118afcccf948a9844d199e56260117400bd9b9982d87bf1d62ebc1690 |
| 4.2.0 | 2021-06-05T14:12:12.269755Z | Download | 3abc4a0f06dccb2348ebdab9f5b9cc88bb64bfc830bed6351040ca42722044a6 |
| 4.3.0 | 2021-09-10T18:32:53.045212Z | Download | b1e35bcd00e0ab63a4883d7d76461da7477dcac3ab82fa0ab894be729d579032 |
| 4.4.0 | 2021-10-16T08:24:26.114183Z | Download | 1a914995d4ef10c94ff183528c120d35ed43b5eaa8713fc6766a9be4570782e2 |
| 5.0.0 | 2022-03-11T14:55:52.026405Z | Download | 2ebb289dc4764ec397f5cd3ca9881c6d17196130a7d646ed022a0dd9c2e25a71 |
| 5.1.0 | 2022-10-23T15:14:59.189671Z | Download | 49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4 |
| 5.2.0 | 2023-02-19T11:25:06.902830Z | Download | 32e46db8021f6d027d9221b937653f5c8aa043e0dc093998e18331912f22936b |
| 5.3.0 | 2023-03-05T13:16:58.372115Z | Download | a9346a3fbba7546a28374bdbcd7f54ea48bb47772bf3a7ab4bfaadc40bc8b8c6 |
| 5.4.0 | 2023-04-24T11:27:43.900104Z | Download | cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 |
| 6.0.0 | 2023-08-17T19:22:40.433530Z | Download | 54e61005585962c9cb6f0df05a3ed82453e01deb1b1f83833b0b6cf7eab93da4 |
| 6.0.1 | 2023-08-20T10:07:28.358866Z | Download | eeb2d1428ee7f4170e2bd498827296a18d4e7fc462b71727d111c0ac7707cfa6 |
| 6.0.2 | 2023-11-30T10:30:42.598779Z | Download | c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 |
| 6.1.0 | 2025-01-12T10:15:53.275595Z | Download | 07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646 |
| 7.0.0 | 2025-06-15T14:26:01.701287Z | Download | 9436fe11f82d7cc1642a8671e5aa4149ffa9ae9116e6cf6dd665fc0653e3825c |
| 7.0.1 | 2025-08-16T09:33:44.998191Z | Download | 1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1 |
| 7.0.2 | 2026-02-14T10:03:01.017261Z | Download | 91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675 |
| 7.1.0 | 2026-09-27T06:29:16.945839Z | Download | 2f1564aadb14215e478563b5406cb80729d022158c01dc50c96013c2f7eb4790 |
Dependencies
meta "^1.3.0-nullsafety"