• This repository has been archived on 29/Jan/2024
  • Stars
    star
    364
  • Rank 113,418 (Top 3 %)
  • Language
    Dart
  • License
    Other
  • Created about 4 years ago
  • Updated 6 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

FFI binding generator

pub package Build Status Coverage Status

Binding generator for FFI bindings.

Note: ffigen only supports parsing C headers, not C++ headers.

This bindings generator can be used to call C code -- or code in another language that compiles to C modules that follow the C calling convention -- such as Go or Rust. For more details, see: https://dart.dev/guides/libraries/c-interop

ffigen also has experimental support for calling ObjC and Swift code; for details see: https://dart.dev/guides/libraries/objective-c-interop

Example

For some header file example.h:

int sum(int a, int b);

Add configurations to Pubspec File:

ffigen:
  output: 'generated_bindings.dart'
  headers:
    entry-points:
      - 'example.h'

Output (generated_bindings.dart).

import 'dart:ffi' as ffi;
class NativeLibrary {
  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
      _lookup;
  NativeLibrary(ffi.DynamicLibrary dynamicLibrary)
      : _lookup = dynamicLibrary.lookup;
  NativeLibrary.fromLookup(
      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
          lookup)
      : _lookup = lookup;

  int sum(int a, int b) {
    return _sum(a, b);
  }

  late final _sumPtr = _lookup<ffi.NativeFunction<ffi.Int Function(ffi.Int, ffi.Int)>>('sum');
  late final _sum = _sumPtr.asFunction<int Function(int, int)>();
}
}

Using this package

  • Add ffigen under dev_dependencies in your pubspec.yaml (run dart pub add -d ffigen).
  • Add package:ffi under dependencies in your pubspec.yaml (run dart pub add ffi).
  • Install LLVM (see Installing LLVM).
  • Configurations must be provided in pubspec.yaml or in a custom YAML file (see configurations).
  • Run the tool- dart run ffigen.

Jump to FAQ.

Installing LLVM

package:ffigen uses LLVM. Install LLVM (9+) in the following way.

Linux

  1. Install libclangdev.

    With apt-get: sudo apt-get install libclang-dev.

    With dnf: sudo dnf install clang-devel.

Windows

  1. Install Visual Studio with C++ development support.
  2. Install LLVM or winget install -e --id LLVM.LLVM.

MacOS

  1. Install Xcode.
  2. Install LLVM - brew install llvm.

Configurations

Configurations can be provided in 2 ways-

  1. In the project's pubspec.yaml file under the key ffigen.
  2. Via a custom YAML file, then specify this file while running - dart run ffigen --config config.yaml

The following configuration options are available-

Key Explaination Example
output
(Required)
Output path of the generated bindings.
output: 'generated_bindings.dart'

or

output:
  bindings: 'generated_bindings.dart'
  ... 
llvm-path Path to llvm folder.
ffigen will sequentially search for `lib/libclang.so` on linux, `lib/libclang.dylib` on macOs and `bin\libclang.dll` on windows, in the specified paths.

Complete path to the dynamic library can also be supplied.
Required if ffigen is unable to find this at default locations.
llvm-path:
  - '/usr/local/opt/llvm'
  - 'C:\Program Files\llvm`
  - '/usr/lib/llvm-11'
  # Specify exact path to dylib
  - '/usr/lib64/libclang.so'
headers
(Required)
The header entry-points and include-directives. Glob syntax is allowed.
If include-directives are not specified ffigen will generate everything directly/transitively under the entry-points.
headers:
  entry-points:
    - 'folder/**.h'
    - 'folder/specific_header.h'
  include-directives:
    - '**index.h'
    - '**/clang-c/**'
    - '/full/path/to/a/header.h'
name
(Prefer)
Name of generated class.
name: 'SQLite'
description
(Prefer)
Dart Doc for generated class.
description: 'Bindings to SQLite'
compiler-opts Pass compiler options to clang. You can also pass these via the command line tool.
compiler-opts:
  - '-I/usr/lib/llvm-9/include/'

and/or via the command line -

dart run ffigen --compiler-opts "-I/headers
-L 'path/to/folder name/file'"
compiler-opts-automatic -> macos -> include-c-standard-library Tries to automatically find and add C standard library path to compiler-opts on macos.
Default: true
compiler-opts-automatic:
  macos:
    include-c-standard-library: false
functions

structs

unions

enums

unnamed-enums

macros

globals
Filters for declarations.
Default: all are included.

Options -
- Include/Exclude declarations.
- Rename declarations.
- Rename enum and struct members.
- Expose symbol-address for functions and globals.
functions:
  include: # 'exclude' is also available.
    # Matches using regexp.
    - [a-z][a-zA-Z0-9]*
    # '.' matches any character.
    - prefix.*
    # Matches with exact name
    - someFuncName
    # Full names have higher priority.
    - anotherName
  rename:
    # Regexp groups based replacement.
    'clang_(.*)': '$1'
    'clang_dispose': 'dispose'
    # Removes '_' from beginning.
    '_(.*)': '$1'
  symbol-address:
    # Used to expose symbol address.
    include:
      - myFunc
structs:
  rename:
    # Removes prefix underscores
    # from all structures.
    '_(.*)': '$1'
  member-rename:
    '.*': # Matches any struct.
      # Removes prefix underscores
      # from members.
      '_(.*)': '$1'
enums:
  rename:
    # Regexp groups based replacement.
    'CXType_(.*)': '$1'
  member-rename:
    '(.*)': # Matches any enum.
      # Removes '_' from beginning
      # enum member name.
      '_(.*)': '$1'
    # Full names have higher priority.
    'CXTypeKind':
      # $1 keeps only the 1st
      # group i.e only '(.*)'.
      'CXType(.*)': '$1'
globals:
  exclude:
    - aGlobal
  rename:
    # Removes '_' from
    # beginning of a name.
    '_(.*)': '$1'
typedefs Filters for referred typedefs.

Options -
- Include/Exclude (referred typedefs only).
- Rename typedefs.

Note: Typedefs that are not referred to anywhere will not be generated.
typedefs:
  exclude:
    # Typedefs starting with `p` are not generated.
    - 'p.*'
  rename:
    # Removes '_' from beginning of a typedef.
    '_(.*)': '$1'
functions -> expose-typedefs Generate the typedefs to Native and Dart type of a function
Default: Inline types are used and no typedefs to Native/Dart type are generated.
functions:
  expose-typedefs:
    include:
      # Match function name.
      - 'myFunc'
       # Do this to expose types for all function.
      - '.*'
    exclude:
      # If you only use exclude, then everything
      # not excluded is generated.
      - 'dispose'
functions -> leaf Set isLeaf:true for functions.
Default: all functions are excluded.
functions:
  leaf:
    include:
      # Match function name.
      - 'myFunc'
       # Do this to set isLeaf:true for all functions.
      - '.*'
    exclude:
      # If you only use exclude, then everything
      # not excluded is generated.
      - 'dispose'
functions -> variadic-arguments Generate multiple functions with different variadic arguments.
Default: var args for any function are ignored.
functions:
  variadic-arguments:
    myfunc:
      // Native C types are supported
      - [int, unsigned char, long*, float**]
      // Common C typedefs (stddef.h) are supported too
      - [uint8_t, intptr_t, size_t, wchar_t*]
      // Structs/Unions/Typedefs from generated code or a library import can be referred too.
      - [MyStruct*, my_custom_lib.CustomUnion]
structs -> pack Override the @Packed(X) annotation for generated structs.

Options - none, 1, 2, 4, 8, 16
You can use RegExp to match with the generated names.

Note: Ffigen can only reliably identify packing specified using __attribute__((__packed__)). However, structs packed using `#pragma pack(...)` or any other way could potentially be incorrect in which case you can override the generated annotations.
structs:
  pack:
    # Matches with the generated name.
    'NoPackStruct': none # No packing
    '.*': 1 # Pack all structs with value 1
comments Extract documentation comments for declarations.
The style and length of the comments recognized can be specified with the following options-
style: doxygen(default) | any
length: brief | full(default)
If you want to disable all comments you can also pass
comments: false.
comments:
  style: any
  length: full
structs -> dependency-only

unions -> dependency-only
If `opaque`, generates empty `Opaque` structs/unions if they were not included in config (but were added since they are a dependency) and only passed by reference(pointer).
Options - full(default) | opaque
structs:
  dependency-only: opaque
unions:
  dependency-only: opaque
sort Sort the bindings according to name.
Default: false, i.e keep the order as in the source files.
sort: true
use-supported-typedefs Should automatically map typedefs, E.g uint8_t => Uint8, int16_t => Int16, size_t => Size etc.
Default: true
use-supported-typedefs: true
use-dart-handle Should map `Dart_Handle` to `Handle`.
Default: true
use-dart-handle: true
exclude-all-by-default When a declaration filter (eg `functions:` or `structs:`) is empty or unset, it defaults to including everything. If this flag is enabled, the default behavior is to exclude everything instead.
Default: false
exclude-all-by-default: true
preamble Raw header of the file, pasted as-it-is.
preamble: |
  // ignore_for_file: camel_case_types, non_constant_identifier_names
library-imports Specify library imports for use in type-map.

Note: ffi (dart:ffi) is already available as a predefined import.
library-imports:
  custom_lib: 'package:some_pkg/some_file.dart'
type-map Map types like integers, typedefs, structs, unions to any other type.

Sub-fields - typedefs, structs, unions, ints

lib must be specified in library-imports or be one of a predefined import.
type-map:
  'native-types': # Targets native types.
    'char':
      'lib': 'pkg_ffi' # predefined import.
      'c-type': 'Char'
      # For native-types dart-type can be be int, double or float
      # but same otherwise.
      'dart-type': 'int'
    'int':
      'lib': 'custom_lib'
      'c-type': 'CustomType4'
      'dart-type': 'int'
  'typedefs': # Targets typedefs.
    'my_type1':
      'lib': 'custom_lib'
      'c-type': 'CustomType'
      'dart-type': 'CustomType'
  'structs': # Targets structs.
    'my_type2':
      'lib': 'custom_lib'
      'c-type': 'CustomType2'
      'dart-type': 'CustomType2'
  'unions': # Targets unions.
    'my_type3':
      'lib': 'custom_lib'
      'c-type': 'CustomType3'
      'dart-type': 'CustomType3'
ffi-native WARNING: Native support is EXPERIMENTAL. The API may change in a breaking way without notice.

Generate `@Native` bindings instead of bindings using `DynamicLibrary` or `lookup`.
ffi-native:
  asset: 'myasset' # Optional.
language WARNING: Other language support is EXPERIMENTAL. The API may change in a breaking way without notice.

Choose the input langauge. Must be one of 'c', or 'objc'. Defaults to 'c'.
language: 'objc'
output -> symbol-file Generates a symbol file yaml containing all types defined in the generated output.
output:
  ...
  symbol-file:
    # Although file paths are supported here, prefer Package Uri's here
    # so that other pacakges can use them.
    output: 'package:some_pkg/symbols.yaml'
    import-path: 'package:some_pkg/base.dart'
import -> symbol-files Import symbols from a symbol file. Used for sharing type definitions from other pacakges.
import:
  symbol-files:
    # Both package Uri and file paths are supported here.
    - 'package:some_pkg/symbols.yaml'
    - 'path/to/some/symbol_file.yaml'

Objective-C config options

Key Explaination Example
objc-interfaces Filters for interface declarations. This option works the same as other declaration filters like `functions` and `structs`.
objc-interfaces:
  include:
    # Includes a specific interface.
    - 'MyInterface'
    # Includes all interfaces starting with "NS".
    - 'NS.*'
  exclude:
    # Override the above NS.* inclusion, to exclude NSURL.
    - 'NSURL'
  rename:
    # Removes '_' prefix from interface names.
    '_(.*)': '$1'
objc-interfaces -> module Adds a module prefix to the class name when loading the class from the dylib. This is only relevent for ObjC headers that are generated wrappers for a Swift library. See example/swift for more information.
headers:
  entry-points:
    # Generated by swiftc to wrap foo_lib.swift.
    - 'foo_lib-Swift.h'
objc-interfaces:
  include:
    # Eg, foo_lib contains a set of classes prefixed with FL.
    - 'FL.*'
  module:
    # Use 'foo_lib' as the module name for all the FL.* classes.
    # We don't match .* here because other classes like NSString
    # shouldn't be given a module prefix.
    'FL.*': 'foo_lib'

Trying out examples

  1. cd examples/<example_u_want_to_run>, Run dart pub get.
  2. Run dart run ffigen.

Running Tests

See test/README.md

FAQ

Can ffigen be used for removing underscores or renaming declarations?

Ffigen supports regexp based renaming, the regexp must be a full match, for renaming you can use regexp groups ($1 means group 1).

E.g - For renaming clang_dispose_string to string_dispose. We can can match it using clang_(.*)_(.*) and rename with $2_$1.

Here's an example of how to remove prefix underscores from any struct and its members.

structs:
  ...
  rename:
    '_(.*)': '$1' # Removes prefix underscores from all structures.
  member-rename:
    '.*': # Matches any struct.
      '_(.*)': '$1' # Removes prefix underscores from members.

How to generate declarations only from particular headers?

The default behaviour is to include everything directly/transitively under each of the entry-points specified.

If you only want to have declarations directly particular header you can do so using include-directives. You can use glob matching to match header paths.

headers:
  entry-points:
    - 'path/to/my_header.h'
  include-directives:
    - '**my_header.h' # This glob pattern matches the header path.

Can ffigen filter declarations by name?

Ffigen supports including/excluding declarations using full regexp matching.

Here's an example to filter functions using names

functions:
  include:
    - 'clang.*' # Include all functions starting with clang.
  exclude:
    - '.*dispose': # Exclude all functions ending with dispose.

This will include clang_help. But will exclude clang_dispose.

Note: exclude overrides include.

How does ffigen handle C Strings?

Ffigen treats char* just as any other pointer,(Pointer<Int8>). To convert these to/from String, you can use package:ffi. Use ptr.cast<Utf8>().toDartString() to convert char* to dart string and "str".toNativeUtf8() to convert string to char*.

How are unnamed enums handled?

Unnamed enums are handled separately, under the key unnamed-enums, and are generated as top level constants.

Here's an example that shows how to include/exclude/rename unnamed enums

unnamed-enums:
  include:
    - 'CX_.*'
  exclude:
    - '.*Flag'
  rename:
    'CXType_(.*)': '$1'

Why are some struct/union declarations generated even after excluded them in config?

This happens when an excluded struct/union is a dependency to some included declaration. (A dependency means a struct is being passed/returned by a function or is member of another struct in some way)

Note: If you supply structs -> dependency-only as opaque ffigen will generate these struct dependencies as Opaque if they were only passed by reference(pointer).

structs:
  dependency-only: opaque
unions:
  dependency-only: opaque

How to expose the native pointers?

By default the native pointers are private, but you can use the symbol-address subkey for functions/globals and make them public by matching with its name. The pointers are then accesible via nativeLibrary.addresses.

Example -

functions:
  symbol-address:
    include:
      - 'myFunc' # Match function name.
      - '.*' # Do this to expose all function pointers.
    exclude: # If you only use exclude, then everything not excluded is generated.
      - 'dispose'

How to get typedefs to Native and Dart type of a function?

By default these types are inline. But you can use the expose-typedef subkey for functions to generate them. This will expose the Native and Dart type. E.g - for a function named hello, the generated typedefs are named as NativeHello and DartHello.

Example -

functions:
  expose-typedefs:
    include:
      - 'myFunc' # Match function name.
      - '.*' # Do this to expose types for all function.
    exclude: # If you only use exclude, then everything not excluded is generated.
      - 'dispose'

How are Structs/Unions/Enums that are reffered to via typedefs handled?

Named declarations use their own names even when inside another typedef. However, unnamed declarations inside typedefs take the name of the first typedef that refers to them.

Why are some typedefs not generated?

The following typedefs are not generated -

  • They are not referred to anywhere in the included declarations.
  • They refer to a struct/union having the same name as itself.
  • They refer to a boolean, enum, inline array, Handle or any unsupported type.

How are macros handled?

ffigen uses clang's own compiler frontend to parse and traverse the C header files. ffigen expands the macros using clang's macro expansion and then traverses the expanded code. To do this, ffigen generates temporary files in a system tmp directory.

A custom temporary directory can be specified by setting the TEST_TMPDIR environment variable.

What are these logs generated by ffigen and how to fix them?

Ffigen can sometimes generate a lot of logs, especially when it's parsing a lot of code.

  • SEVERE logs are something you definitely need to address. They can be caused due to syntax errors, or more generally missing header files (which need to be specified using compiler-opts in config)
  • WARNING logs are something you can ignore, but should probably look into. These are mostly indications of declarations ffigen couldn't generate due to limitations of dart:ffi, private declarations (which can be resolved by renaming them via ffigen config) or other minor issues in the config file itself.
  • Everything else can be safely ignored. It's purpose is to simply let you know what ffigen is doing.
  • The verbosity of the logs can be changed by adding a flag with the log level. E.g - dart run ffigen --verbose <level>. Level options are - [all, fine, info (default), warning, severe]. The all and fine will print a ton of logs are meant for debugging purposes only.

How can type definitions be shared?

Ffigen can share type definitions using symbol files.

  • A package can generate a symbol file using the output -> symbol-file config.
  • And another package can then import this, using import -> symbol-files config.
  • Doing so will reuse all the types such as Struct/Unions, and will automatically exclude generating other types (E.g functions, enums, macros).

Checkout examples/shared_bindings for details.

For manually reusing definitions from another package, the library-imports and type-map config can be used.

More Repositories

1

sdk

The Dart SDK, including the VM, dart2js, core libraries, and more.
Dart
9,763
star
2

language

Design of the Dart language
TeX
2,536
star
3

dart-pad

An online Dart editor with support for console, web, and Flutter apps
Dart
1,637
star
4

pub

The pub command line tool
Dart
1,024
star
5

http

A composable API for making HTTP requests in Dart.
Dart
994
star
6

site-www

Source for Dart website
Dart
922
star
7

shelf

Web server middleware for Dart
Dart
870
star
8

pub-dev

The pub.dev website
Dart
764
star
9

build

A build system for Dart written in Dart
Dart
763
star
10

dart-vim-plugin

Syntax highlighting for Dart in Vim
Vim Script
635
star
11

dart_style

An opinionated formatter/linter for Dart code
Dart
629
star
12

linter

Linter for Dart.
Dart
626
star
13

mockito

Mockito-inspired mock library for Dart
Dart
618
star
14

samples

A collection of Dart code samples by Dart DevRel
Dart
576
star
15

test

A library for writing unit tests in Dart.
Dart
486
star
16

source_gen

Automatic source code generation for Dart
Dart
479
star
17

dartdoc

API documentation tool for Dart.
Dart
461
star
18

markdown

A Dart markdown library
Dart
428
star
19

code_builder

A fluent API for generating valid Dart source code
Dart
417
star
20

web_socket_channel

StreamChannel wrappers for WebSockets.
Dart
405
star
21

leak_tracker

A framework for memory leak tracking for Dart and Flutter applications.
Dart
369
star
22

collection

The collection package for Dart contains a number of separate libraries with utility functions and classes that makes working with collections easier.
Dart
359
star
23

logging

A Dart package for debug and error logging.
Dart
311
star
24

wasm

Utilities for loading and running WASM modules from Dart code
Dart
309
star
25

async

A Dart package that contains tools to work with asynchronous computations.
Dart
300
star
26

html

Dart port of html5lib. For parsing HTML/HTML5 with Dart. Works in the client and on the server.
Dart
268
star
27

crypto

A set of cryptographic functions implemented in pure Dart.
Dart
261
star
28

path

A string-based path manipulation library.
Dart
215
star
29

webdev

A CLI for Dart web development.
Dart
210
star
30

oauth2

An OAuth2 client library for Dart.
Dart
208
star
31

args

A command-line argument parsing library for Dart.
Dart
202
star
32

pana

Package ANAlysis for Dart
Dart
194
star
33

setup-dart

A GitHub Action to install and setup a Dart SDK.
Dart
176
star
34

yaml

A Dart YAML parser.
Dart
163
star
35

jnigen

Experimental bindings generator for Java bindings through dart:ffi and JNI.
Dart
154
star
36

http2

A HTTP/2 implementation for dart.
Dart
149
star
37

ffi

Utilities for working with Foreign Function Interface (FFI) code
Dart
149
star
38

homebrew-dart

Dart team's official tap for homebrew.
Ruby
147
star
39

sample-pop_pop_win

"Pop, Pop, Win!" is an implementation of Minesweeper in Dart.
Dart
146
star
40

usage

A Google Analytics wrapper for command-line, web, and Flutter apps.
Dart
143
star
41

watcher

A file system watcher library for Dart.
Dart
135
star
42

stack_trace

A package for manipulating stack traces and printing them readably.
Dart
128
star
43

gcloud

High-level interfaces to Google Cloud Platform APIs
Dart
127
star
44

mime

Dart package for working with MIME type definitions and for processing streams of MIME multipart media types.
Dart
124
star
45

stream_transform

Dart utility methods to create StreamTransfomer instances to manipulate Streams
Dart
118
star
46

lints

Official Dart lint rules; the core and recommended set of lints suggested by the Dart team.
Dart
106
star
47

coverage

Dart coverage data manipulation and formatting
Dart
102
star
48

appengine

Dart support for App Engine managed VMs
Dart
93
star
49

csslib

A library for parsing CSS.
Dart
92
star
50

benchmark_harness

The official benchmark harness for Dart
Dart
92
star
51

web

Lightweight browser API bindings built around JS static interop.
Dart
89
star
52

sse

Dart Server Sent Events package
Dart
89
star
53

fake_async

Fake asynchronous events for deterministic testing.
Dart
87
star
54

native

Dart packages related to FFI and native assets bundling.
Dart
81
star
55

matcher

A declarative API for specifying expectations.
Dart
70
star
56

json_rpc_2

A Dart implementation of the JSON-RPC 2.0 spec.
Dart
70
star
57

convert

Conversion utilities
Dart
68
star
58

characters

A package for characters represented as unicode extended grapheme clusters
Dart
67
star
59

dart-docker

Docker images for the Dart programming language (https://dart.dev)
Dart
65
star
60

pub_semver

A package for working with Pub/semver-style versions and version constraints
Dart
62
star
61

string_scanner

A class for parsing strings using a sequence of patterns.
Dart
59
star
62

cli_util

A library to help in building Dart command-line apps
Dart
59
star
63

glob

Bash-style filename globbing for Dart.
Dart
55
star
64

pubspec_parse

Simple package for parsing pubspec.yaml files with a type-safe API and rich error reporting
Dart
50
star
65

i18n

A general mono-repo for Dart i18n and l10n packages.
Dart
50
star
66

pool

A class for managing a finite pool of resources.
Dart
48
star
67

stream_channel

An abstraction for two-way communication channels.
Dart
47
star
68

io

Utilities for the Dart VM's dart:io.
Dart
47
star
69

fixnum

Fixed-width integer library for Dart.
Dart
44
star
70

clock

A fakeable wrapper for dart:core clock APIs.
Dart
40
star
71

site-shared

Content shared across Dart websites
Dart
40
star
72

co19

A Dart language and library conformance test suite
Dart
36
star
73

http_parser

A platform-independent Dart package for parsing and serializing HTTP formats.
Dart
35
star
74

ecosystem

This repository is home to general Dart Ecosystem tools and packages.
Dart
35
star
75

typed_data

Utility functions and classes that makes working with typed data lists easier in Dart
Dart
35
star
76

source_span

A library for identifying source spans and locations.
Dart
28
star
77

http_multi_server

A dart:io HttpServer wrapper that handles requests from multiple servers.
Dart
27
star
78

native_synchronization

Low-level synchronization primitives built using dart:ffi.
Dart
26
star
79

dartbug.com

The redirect service for Dart issues and bugs.
Dart
23
star
80

bazel_worker

Dart integration for Bazel build system
Dart
23
star
81

boolean_selector

A flexible syntax for boolean expressions.
Dart
23
star
82

os_detect

Dart multi-platform operating system identification
Dart
22
star
83

dart-syntax-highlight

Tools and documentation for how Dart code is formatted
Dart
21
star
84

yaml_edit

A library for YAML manipulation with comment and whitespace preservation.
Dart
21
star
85

tools

This repository is home to tooling related Dart packages.
Dart
21
star
86

api.dart.dev

Dart API docs
Python
19
star
87

dart_ci

Tools used by Dart's continuous integration (CI) testing that aren't needed by Dart SDK contributors. Mirrored from dart.googlesource.com/dart_ci. Do not land pull requests on Github.
Dart
18
star
88

test_process

A Dart package for testing subprocesses
Dart
17
star
89

term_glyph

Useful glyphs and Windows-safe equivalents
Dart
16
star
90

browser_launcher

Provides a standardized way to launch web browsers.
Dart
16
star
91

source_maps

A package to programmatically manipulate source maps.
Dart
15
star
92

grpc_cronet

Flutter dart:grpc implementation that uses the Cronet native library.
Dart
14
star
93

timing

A Dart package for tracking time spent in child operations
Dart
14
star
94

package_config

Support for working with Package Resolution Configuration files
Dart
14
star
95

root_certificates

The set of root certificates trusted by dart:io's default SecurityContext. Taken from Mozilla's NSS library.
C++
11
star
96

test_descriptor

Provides a convenient, easy-to-read API for defining and verifying directory structures in tests
Dart
10
star
97

dartlang_project_templates

Project templates for new repos under the dart-lang organization
Dart
8
star
98

source_map_stack_trace

Convert stack traces generated by dart2js-compiled code into readable native Dart stack traces
Dart
7
star
99

.github

GitHub default community health file for dart-lang repos
7
star
100

test_reflective_loader

Discover tests and test suites using reflection
Dart
5
star