## 1.12.1

* Move to `dart-lang/tools` monorepo.

## 1.12.0

* Added support for parsing Wasm frames of Chrome (V8), Firefox, Safari.
* Require Dart 3.4 or greater

## 1.11.1

* Make use of `@pragma('vm:awaiter-link')` to make package work better with
  Dart VM's builtin awaiter stack unwinding. No other changes.

## 1.11.0

* Added the parameter `zoneValues` to `Chain.capture` to be able to use custom
  zone values with the `runZoned` internal calls.
* Populate the pubspec `repository` field.
* Require Dart 2.18 or greater

## 1.10.0

* Stable release for null safety.
* Fix broken test, `test/chain/vm_test.dart`, which incorrectly handles
  asynchronous suspension gap markers at the end of stack traces.

## 1.10.0-nullsafety.6

* Fix bug parsing asynchronous suspension gap markers at the end of stack
  traces, when parsing with `Trace.parse` and `Chain.parse`.
* Update SDK constraints to `>=2.12.0-0 <3.0.0` based on beta release
  guidelines.

## 1.10.0-nullsafety.5

* Allow prerelease versions of the 2.12 sdk.

## 1.10.0-nullsafety.4

* Allow the `2.10.0` stable and dev SDKs.

## 1.10.0-nullsafety.3

* Fix bug parsing asynchronous suspension gap markers at the end of stack
  traces.

## 1.10.0-nullsafety.2

* Forward fix for a change in SDK type promotion behavior.

## 1.10.0-nullsafety.1

* Allow 2.10 stable and 2.11.0 dev SDK versions.

## 1.10.0-nullsafety

* Opt in to null safety.

## 1.9.6 (backpublish)

* Fix bug parsing asynchronous suspension gap markers at the end of stack
  traces. (Also fixed separately in 1.10.0-nullsafety.3)
* Fix bug parsing asynchronous suspension gap markers at the end of stack
  traces, when parsing with `Trace.parse` and `Chain.parse`. (Also fixed
  separately in 1.10.0-nullsafety.6)

## 1.9.5

* Parse the format for `data:` URIs that the Dart VM has used since `2.2.0`.

## 1.9.4

* Add support for firefox anonymous stack traces.
* Add support for chrome eval stack traces without a column.
* Change the argument type to `Chain.capture` from `Function(dynamic, Chain)` to
  `Function(Object, Chain)`. Existing functions which take `dynamic` are still
  fine, but new uses can have a safer type.

## 1.9.3

* Set max SDK version to `<3.0.0`.

## 1.9.2

* Fix Dart 2.0 runtime cast failure in test.

## 1.9.1

* Preserve the original chain for a trace to handle cases where an
  error is rethrown.

## 1.9.0

* Add an `errorZone` parameter to `Chain.capture()` that makes it avoid creating
  an error zone.

## 1.8.3

* `Chain.forTrace()` now returns a full stack chain for *all* `StackTrace`s
  within `Chain.capture()`, even those that haven't been processed by
  `dart:async` yet.

* `Chain.forTrace()` now uses the Dart VM's stack chain information when called
  synchronously within `Chain.capture()`. This matches the existing behavior
  outside `Chain.capture()`.

* `Chain.forTrace()` now trims the VM's stack chains for the innermost stack
  trace within `Chain.capture()` (unless it's called synchronously, as above).
  This avoids duplicated frames and makes the format of the innermost traces
  consistent with the other traces in the chain.

## 1.8.2

* Update to use strong-mode clean Zone API.

## 1.8.1

* Use official generic function syntax.

* Updated minimum SDK to 1.23.0.

## 1.8.0

* Add a `Trace.original` field to provide access to the original `StackTrace`s
  from which the `Trace` was created, and a matching constructor parameter to
  `new Trace()`.

## 1.7.4

* Always run `onError` callbacks for `Chain.capture()` in the parent zone.

## 1.7.3

* Fix broken links in the README.

## 1.7.2

* `Trace.foldFrames()` and `Chain.foldFrames()` now remove the outermost folded
  frame. This matches the behavior of `.terse` with core frames.

* Fix bug parsing a friendly frame with spaces in the member name.

* Fix bug parsing a friendly frame where the location is a data url.

## 1.7.1

* Make `Trace.parse()`, `Chain.parse()`, treat the VM's new causal asynchronous
  stack traces as chains. Outside of a `Chain.capture()` block, `new
  Chain.current()` will return a stack chain constructed from the asynchronous
  stack traces.

## 1.7.0

* Add a `Chain.disable()` function that disables stack-chain tracking.

* Fix a bug where `Chain.capture(..., when: false)` would throw if an error was
  emitted without a stack trace.

## 1.6.8

* Add a note to the documentation of `Chain.terse` and `Trace.terse`.

## 1.6.7

* Fix a bug where `new Frame.caller()` returned the wrong depth of frame on
  Dartium.

## 1.6.6

* `new Trace.current()` and `new Chain.current()` now skip an extra frame when
  run in a JS context. This makes their return values match the VM context.

## 1.6.5

* Really fix strong mode warnings.

## 1.6.4

* Fix a syntax error introduced in 1.6.3.

## 1.6.3

* Make `Chain.capture()` generic. Its signature is now `T Chain.capture<T>(T
  callback(), ...)`.

## 1.6.2

* Fix all strong mode warnings.

## 1.6.1

* Use `StackTrace.current` in Dart SDK 1.14 to get the current stack trace.

## 1.6.0

* Add a `when` parameter to `Chain.capture()`. This allows capturing to be
  easily enabled and disabled based on whether the application is running in
  debug/development mode or not.

* Deprecate the `ChainHandler` typedef. This didn't provide any value over
  directly annotating the function argument, and it made the documentation less
  clear.

## 1.5.1

* Fix a crash in `Chain.foldFrames()` and `Chain.terse` when one of the chain's
  traces has no frames.

## 1.5.0

* `new Chain.parse()` now parses all the stack trace formats supported by `new
  Trace.parse()`. Formats other than that emitted by `Chain.toString()` will
  produce single-element chains.

* `new Trace.parse()` now parses the output of `Chain.toString()`. It produces
  the same result as `Chain.parse().toTrace()`.

## 1.4.2

* Improve the display of `data:` URIs in stack traces.

## 1.4.1

* Fix a crashing bug in `UnparsedFrame.toString()`.

## 1.4.0

* `new Trace.parse()` and related constructors will no longer throw an exception
  if they encounter an unparseable stack frame. Instead, they will generate an
  `UnparsedFrame`, which exposes no metadata but preserves the frame's original
  text.

* Properly parse native-code V8 frames.

## 1.3.5

* Properly shorten library names for pathnames of folded frames on Windows.

## 1.3.4

* No longer say that stack chains aren't supported on dart2js now that
  [sdk#15171][] is fixed. Note that this fix only applies to Dart 1.12.

[sdk#15171]: https://github.com/dart-lang/sdk/issues/15171

## 1.3.3

* When a `null` stack trace is passed to a completer or stream controller in
  nested `Chain.capture()` blocks, substitute the inner block's chain rather
  than the outer block's.

* Add support for empty chains and chains of empty traces to `Chain.parse()`.

* Don't crash when parsing stack traces from Dart VM stack overflows.

## 1.3.2

* Don't crash when running `Trace.terse` on empty stack traces.

## 1.3.1

* Support more types of JavaScriptCore stack frames.

## 1.3.0

* Support stack traces generated by JavaScriptCore. They can be explicitly
  parsed via `new Trace.parseJSCore` and `new Frame.parseJSCore`.

## 1.2.4

* Fix a type annotation in `LazyTrace`.

## 1.2.3

* Fix a crash in `Chain.parse`.

## 1.2.2

* Don't print the first folded frame of terse stack traces. This frame
  is always just an internal isolate message handler anyway. This
  improves the readability of stack traces, especially in stack chains.

* Remove the line numbers and specific files in all terse folded frames, not
  just those from core libraries.

* Make padding consistent across all stack traces for `Chain.toString()`.

## 1.2.1

* Add `terse` to `LazyTrace.foldFrames()`.

* Further improve stack chains when using the VM's async/await implementation.

## 1.2.0

* Add a `terse` argument to `Trace.foldFrames()` and `Chain.foldFrames()`. This
  allows them to inherit the behavior of `Trace.terse` and `Chain.terse` without
  having to duplicate the logic.

## 1.1.3

* Produce nicer-looking stack chains when using the VM's async/await
  implementation.

## 1.1.2

* Support VM frames without line *or* column numbers, which async/await programs
  occasionally generate.

* Replace `<<anonymous closure>_async_body>` in VM frames' members with the
  terser `<async>`.

## 1.1.1

* Widen the SDK constraint to include 1.7.0-dev.4.0.

## 1.1.0

* Unify the parsing of Safari and Firefox stack traces. This fixes an error in
  Firefox trace parsing.

* Deprecate `Trace.parseSafari6_0`, `Trace.parseSafari6_1`,
  `Frame.parseSafari6_0`, and `Frame.parseSafari6_1`.

* Add `Frame.parseSafari`.

## 1.0.3

* Use `Zone.errorCallback` to attach stack chains to all errors without the need
  for `Chain.track`, which is now deprecated.

## 1.0.2

* Remove a workaround for [issue 17083][].

[issue 17083]: https://github.com/dart-lang/sdk/issues/17083

## 1.0.1

* Synchronous errors in the [Chain.capture] callback are now handled correctly.

## 1.0.0

* No API changes, just declared stable.

## 0.9.3+2

* Update the dependency on path.

* Improve the formatting of library URIs in stack traces.

## 0.9.3+1

* If an error is thrown in `Chain.capture`'s `onError` handler, that error is
  handled by the parent zone. This matches the behavior of `runZoned` in
  `dart:async`.

## 0.9.3

* Add a `Chain.foldFrames` method that parallels `Trace.foldFrames`.

* Record anonymous method frames in IE10 as "<fn>".
