Merge pull request #3 from dart-backend/feature/v8

Feature/v8
This commit is contained in:
Thomas Hii 2023-05-16 00:05:41 +08:00 committed by GitHub
commit 4e320b1e44
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
49 changed files with 258 additions and 92 deletions

1
.idea/.name Normal file
View file

@ -0,0 +1 @@
belatuk_common_utilities

19
.idea/modules.xml Normal file
View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/packages/body_parser/melos_belatuk_body_parser.iml" filepath="$PROJECT_DIR$/packages/body_parser/melos_belatuk_body_parser.iml" />
<module fileurl="file://$PROJECT_DIR$/packages/code_buffer/melos_belatuk_code_buffer.iml" filepath="$PROJECT_DIR$/packages/code_buffer/melos_belatuk_code_buffer.iml" />
<module fileurl="file://$PROJECT_DIR$/packages/combinator/melos_belatuk_combinator.iml" filepath="$PROJECT_DIR$/packages/combinator/melos_belatuk_combinator.iml" />
<module fileurl="file://$PROJECT_DIR$/packages/html_builder/melos_belatuk_html_builder.iml" filepath="$PROJECT_DIR$/packages/html_builder/melos_belatuk_html_builder.iml" />
<module fileurl="file://$PROJECT_DIR$/packages/json_serializer/melos_belatuk_json_serializer.iml" filepath="$PROJECT_DIR$/packages/json_serializer/melos_belatuk_json_serializer.iml" />
<module fileurl="file://$PROJECT_DIR$/packages/merge_map/melos_belatuk_merge_map.iml" filepath="$PROJECT_DIR$/packages/merge_map/melos_belatuk_merge_map.iml" />
<module fileurl="file://$PROJECT_DIR$/packages/pretty_logging/melos_belatuk_pretty_logging.iml" filepath="$PROJECT_DIR$/packages/pretty_logging/melos_belatuk_pretty_logging.iml" />
<module fileurl="file://$PROJECT_DIR$/packages/pub_sub/melos_belatuk_pub_sub.iml" filepath="$PROJECT_DIR$/packages/pub_sub/melos_belatuk_pub_sub.iml" />
<module fileurl="file://$PROJECT_DIR$/packages/range_header/melos_belatuk_range_header.iml" filepath="$PROJECT_DIR$/packages/range_header/melos_belatuk_range_header.iml" />
<module fileurl="file://$PROJECT_DIR$/packages/symbol_table/melos_belatuk_symbol_table.iml" filepath="$PROJECT_DIR$/packages/symbol_table/melos_belatuk_symbol_table.iml" />
<module fileurl="file://$PROJECT_DIR$/packages/user_agent/melos_user_agent_analyzer.iml" filepath="$PROJECT_DIR$/packages/user_agent/melos_user_agent_analyzer.iml" />
<module fileurl="file://$PROJECT_DIR$/melos_belatuk_common_utilities.iml" filepath="$PROJECT_DIR$/melos_belatuk_common_utilities.iml" />
</modules>
</component>
</project>

View file

@ -0,0 +1,11 @@
<!-- Generated by Melos -->
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Melos -&gt; Bootstrap Workspace" type="ShConfigurationType">
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
<option name="SCRIPT_PATH" value="$USER_HOME$/.pub-cache/bin/melos" />
<option name="SCRIPT_OPTIONS" value="bootstrap" />
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="false" />
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<method v="2" />
</configuration>
</component>

View file

@ -0,0 +1,11 @@
<!-- Generated by Melos -->
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Melos -&gt; Clean Workspace" type="ShConfigurationType">
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
<option name="SCRIPT_PATH" value="$USER_HOME$/.pub-cache/bin/melos" />
<option name="SCRIPT_OPTIONS" value="clean" />
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="false" />
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<method v="2" />
</configuration>
</component>

4
melos.yaml Normal file
View file

@ -0,0 +1,4 @@
name: belatuk_common_utilities
packages:
- packages/*

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Dart SDK" level="project" />
<orderEntry type="library" name="Dart Packages" level="project" />
</component>
</module>

View file

@ -1,5 +1,14 @@
# Change Log
## 5.0.0
* Require Dart >= 3.0
## 5.0.0-beta.1
* Require Dart >= 3.0
* Updated `belatuk_http_server` to 4.0.0
## 4.0.1
* Updated `belatuk_http_server` to 3.0.0

View file

@ -30,7 +30,7 @@ A benefit of this is that primitive types are automatically deserialized correct
To install Body Parser for your Dart project, simply add body_parser to your pub dependencies.
dependencies:
belatuk_body_parser: ^4.0.0
belatuk_body_parser: ^5.0.0
### Usage

View file

@ -1,14 +1,14 @@
name: belatuk_body_parser
version: 4.0.1
version: 5.0.0
description: Parse request bodies and query strings in Dart. Supports JSON, URL-encoded, and multi-part bodies.
homepage: https://github.com/dart-backend/belatuk-common-utilities/tree/main/packages/body_parser
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: '>=3.0.0 <4.0.0'
dependencies:
http_parser: ^4.0.0
belatuk_http_server: ^3.0.0
belatuk_http_server: ^4.0.0
mime: ^1.0.0
dev_dependencies:
http: ^0.13.0
test: ^1.17.8
test: ^1.24.0
lints: ^2.0.0

View file

@ -1,5 +1,13 @@
# Change Log
## 5.0.0
* Require Dart >= 3.0
## 5.0.0-beta.1
* Require Dart >= 3.0
## 4.0.0
* Require Dart >= 2.17

View file

@ -14,7 +14,7 @@ In your `pubspec.yaml`:
```yaml
dependencies:
belatuk_code_buffer: ^4.0.0
belatuk_code_buffer: ^5.0.0
```
## Usage

View file

@ -1,12 +1,12 @@
name: belatuk_code_buffer
version: 4.0.0
version: 5.0.0
description: An advanced StringBuffer geared toward generating code, and source maps.
homepage: https://github.com/dart-backend/belatuk-common-utilities/tree/main/packages/code_buffer
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: '>=3.0.0 <4.0.0'
dependencies:
charcode: ^1.2.0
source_span: ^1.8.1
dev_dependencies:
test: ^1.17.3
test: ^1.24.0
lints: ^2.0.0

View file

@ -1,5 +1,14 @@
# Change Log
## 5.0.0
* Require Dart >= 3.0
## 5.0.0-beta.1
* Require Dart >= 3.0
* Updated `belatuk_code_buffer` to 5.0.0
## 4.0.0
* Require Dart >= 2.17

View file

@ -1,15 +1,15 @@
name: belatuk_combinator
version: 4.0.0
version: 5.0.0
description: Packrat parser combinators that support static typing, generics, file spans, memoization, and more.
homepage: https://github.com/dart-backend/belatuk-common-utilities/tree/main/packages/combinator
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: '>=3.0.0 <4.0.0'
dependencies:
belatuk_code_buffer: ^4.0.0
belatuk_code_buffer: ^5.0.0
matcher: ^0.12.10
source_span: ^1.8.1
string_scanner: ^1.1.0
tuple: ^2.0.0
dev_dependencies:
test: ^1.17.4
test: ^1.24.0
lints: ^2.0.0

View file

@ -0,0 +1,4 @@
# melos_managed_dependency_overrides: belatuk_code_buffer
#dependency_overrides:
# belatuk_code_buffer:
# path: ../code_buffer

View file

@ -1,5 +1,13 @@
# Change Log
## 5.0.0
* Require Dart >= 3.0
## 5.0.0-beta.1
* Require Dart >= 3.0
## 4.0.0
* Require Dart >= 2.17

View file

@ -10,7 +10,7 @@ This package builds HTML AST's and renders them to HTML. It can be used as an in
## Requirements
* Dart SDK: 2.17.x or later
* Dart SDK: 3.0.x or later
## Installation
@ -18,7 +18,7 @@ In your `pubspec.yaml`:
```yaml
dependencies:
belatuk_html_builder: ^4.0.0
belatuk_html_builder: ^5.0.0
```
## Usage

View file

@ -12,9 +12,9 @@ Node Function(Node) rebuild(NodeBuilder Function(NodeBuilder) transform,
///
/// Use this alongside [rebuild].
Node Function(Node) rebuildRecursive(Node Function(Node) f) {
Node _build(Node node) {
return NodeBuilder.from(f(node)).mapChildren(_build).build();
Node build(Node node) {
return NodeBuilder.from(f(node)).mapChildren(build).build();
}
return _build;
return build;
}

View file

@ -1,12 +1,12 @@
name: belatuk_html_builder
version: 4.0.0
version: 5.0.0
description: Build HTML AST's and render them to HTML. This can be used as an internal DSL, i.e. for a templating engine.
homepage: https://github.com/dart-backend/belatuk-common-utilities/tree/main/packages/html_builder
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: '>=3.0.0 <4.0.0'
dependencies:
collection: ^1.15.0
collection: ^1.17.0
dev_dependencies:
html: ^0.15.0
test: ^1.17.4
test: ^1.24.0
lints: ^2.0.0

View file

@ -1,6 +1,5 @@
import 'package:html/parser.dart' as html5;
import 'package:belatuk_html_builder/elements.dart';
import 'package:belatuk_html_builder/belatuk_html_builder.dart';
import 'package:test/test.dart';
void main() {

View file

@ -1,5 +1,13 @@
# Change Log
## 7.0.0
* Require Dart >= 3.0
## 7.0.0-beta.1
* Require Dart >= 3.0
## 6.0.1
* Updated README

View file

@ -12,7 +12,7 @@ The ***new and improved*** definitive solution for JSON in Dart. It supports syn
## Installation
dependencies:
belatuk_json_serializer: ^6.0.0
belatuk_json_serializer: ^7.0.0
## Usage

View file

@ -1,12 +1,12 @@
name: belatuk_json_serializer
version: 6.0.1
version: 7.0.0
description: Easy JSON to Object serialization and deserialization in Dart.
homepage: https://github.com/dart-backend/belatuk-common-utilities/tree/main/packages/json_serializer
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: '>=3.0.0 <4.0.0'
dependencies:
logging: ^1.0.1
dev_dependencies:
stack_trace: ^1.10.0
test: ^1.17.4
test: ^1.24.0
lints: ^2.0.0

View file

@ -105,11 +105,11 @@ testDeserializationWithSchemaValidation() async {
god.deserialize(babelRcJson, outputType: BabelRc) as BabelRc;
print(deserialized.presets.runtimeType);
expect(deserialized.presets is List, equals(true));
//expect(deserialized.presets is List, equals(true));
expect(deserialized.presets.length, equals(2));
expect(deserialized.presets[0], equals('es2015'));
expect(deserialized.presets[1], equals('stage-0'));
expect(deserialized.plugins is List, equals(true));
//expect(deserialized.plugins is List, equals(true));
expect(deserialized.plugins.length, equals(1));
expect(deserialized.plugins[0], equals('add-module-exports'));
}

View file

@ -11,14 +11,14 @@ void printRecord(LogRecord rec) {
class SampleNestedClass {
String? bar;
SampleNestedClass([String? this.bar]);
SampleNestedClass([this.bar]);
}
class SampleClass {
String? hello;
List<SampleNestedClass> nested = [];
SampleClass([String? this.hello]);
SampleClass([this.hello]);
}
@WithSchemaUrl(
@ -27,25 +27,23 @@ class BabelRc {
List<String> presets;
List<String> plugins;
BabelRc(
{List<String> this.presets: const [],
List<String> this.plugins: const []});
BabelRc({this.presets = const [], this.plugins = const []});
}
@WithSchema(const {
@WithSchema({
r"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Validated Sample Class",
"description": "Sample schema for validation via JSON God",
"type": "object",
"hello": const {"description": "A friendly greeting.", "type": "string"},
"nested": const {
"hello": {"description": "A friendly greeting.", "type": "string"},
"nested": {
"description": "A list of NestedSampleClass items within this instance.",
"type": "array",
"items": const {
"items": {
"type": "object",
"bar": const {"description": "Filler text", "type": "string"}
"bar": {"description": "Filler text", "type": "string"}
}
},
"required": const ["hello", "nested"]
"required": ["hello", "nested"]
})
class ValidatedSampleClass {}

View file

@ -8,7 +8,7 @@ main() {
test('fromJson', () {
var foo = god.deserialize('{"bar":"baz"}', outputType: Foo) as Foo;
expect(foo is Foo, true);
//expect(foo is Foo, true);
expect(foo.text, equals('baz'));
});

View file

@ -1,5 +1,13 @@
# Change Log
## 5.0.0
* Require Dart >= 3.0
## 5.0.0-beta.1
* Require Dart >= 3.0
## 4.0.0
* Require Dart >= 2.17

View file

@ -1,9 +1,9 @@
name: belatuk_merge_map
version: 4.0.0
version: 5.0.0
description: Combine multiple Maps into one. Equivalent to Object.assign in JS.
homepage: https://github.com/dart-backend/belatuk-common-utilities/tree/main/packages/merge_map
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: '>=3.0.0 <4.0.0'
dev_dependencies:
test: ^1.17.4
test: ^1.24.0
lints: ^2.0.0

View file

@ -3,8 +3,7 @@ Primary Authors
* __[Thomas Hii](dukefirehawk.apps@gmail.com)__
Thomas is the current maintainer of the code base. He has refactored and migrated the
code base to support NNBD.
Thomas is the current maintainer of the code base. He has refactored and migrated the code base to support NNBD.
* __[Tobe O](thosakwe@gmail.com)__

View file

@ -1,5 +1,13 @@
# Change Log
## 6.0.0
* Require Dart >= 3.0
## 6.0.0-beta.1
* Require Dart >= 3.0
## 5.0.0
* Require Dart >= 2.17

View file

@ -15,7 +15,7 @@ In your `pubspec.yaml`:
```yaml
dependencies:
belatuk_pretty_logging: ^5.0.0
belatuk_pretty_logging: ^6.0.0
```
## Usage

View file

@ -1,11 +1,12 @@
name: belatuk_pretty_logging
version: 5.0.0
version: 6.0.0
description: Standalone helper for colorful logging output, using pkg:io AnsiCode.
homepage: https://github.com/dart-backend/belatuk-common-utilities/tree/main/packages/pretty_logging
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: '>=3.0.0 <4.0.0'
dependencies:
io: ^1.0.0
logging: ^1.0.1
dev_dependencies:
test: ^1.24.0
lints: ^2.0.0

View file

@ -0,0 +1,8 @@
import 'package:test/test.dart';
void main() {
test('test', () {
var message = "Testing";
expect(message, equals('Testing'));
});
}

View file

@ -1,5 +1,13 @@
# Change Log
## 6.0.0
* Require Dart >= 3.0
## 6.0.0-beta.1
* Require Dart >= 3.0
## 5.0.0
* Require Dart >= 2.17

View file

@ -14,10 +14,10 @@ Add `belatuk_pub_sub` as a dependency in your `pubspec.yaml` file:
```yaml
dependencies:
belatuk_pub_sub: ^5.0.0
belatuk_pub_sub: ^6.0.0
```
Then, be sure to run `pub get` in your terminal.
Then, be sure to run `dart pub get` in your terminal.
## Usage

View file

@ -1,14 +1,14 @@
name: belatuk_pub_sub
version: 5.0.0
version: 6.0.0
description: Keep application instances in sync with a simple pub/sub API.
homepage: https://github.com/dart-backend/belatuk-common-utilities/tree/main/packages/pub_sub
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: '>=3.0.0 <4.0.0'
dependencies:
json_rpc_2: ^3.0.0
stream_channel: ^2.1.0
uuid: ^3.0.4
collection: ^1.15.0
collection: ^1.17.0
dev_dependencies:
lints: ^2.0.0
test: ^1.17.4
test: ^1.24.0

View file

@ -1,5 +1,13 @@
# Change Log
## 6.0.0
* Require Dart >= 3.0
## 6.0.0-beta.1
* Require Dart >= 3.0
## 5.0.0
* Require Dart >= 2.17

View file

@ -14,7 +14,7 @@ In your `pubspec.yaml`:
```yaml
dependencies:
belatuk_range_header: ^5.0.0
belatuk_range_header: ^6.0.0
```
## Usage

View file

@ -15,7 +15,9 @@ void handleRequest(HttpRequest request) async {
// Get info
header.items;
header.rangeUnit;
header.items.forEach((item) => item.toContentRange(400));
for (var item in header.items) {
item.toContentRange(400);
}
// Serve the file
var transformer =

View file

@ -1,7 +1,9 @@
import 'dart:async';
import 'dart:collection';
import 'dart:convert';
import 'dart:io' show BytesBuilder;
//import 'dart:io' hide BytesBuilder;
import 'dart:typed_data';
import 'dart:math';
import 'package:async/async.dart';
import 'package:charcode/ascii.dart';

View file

@ -1,8 +1,8 @@
class RangeHeaderParseException extends FormatException {
@override
final String message;
//@override
//final String message;
RangeHeaderParseException(this.message);
RangeHeaderParseException(super.message);
@override
String toString() => 'Range header parse exception: $message';

View file

@ -9,7 +9,7 @@ import 'range_header_item.dart';
final RegExp _rgxInt = RegExp(r'[0-9]+');
final RegExp _rgxWs = RegExp(r'[ \n\r\t]');
enum TokenType { RANGE_UNIT, COMMA, INT, DASH, EQUALS }
enum TokenType { rangeUnit, comma, int, dash, equals }
class Token {
final TokenType type;
@ -27,19 +27,19 @@ List<Token> scan(String text, List<String> allowedRangeUnits) {
scanner.scan(_rgxWs);
if (scanner.scanChar($comma)) {
tokens.add(Token(TokenType.COMMA, scanner.lastSpan));
tokens.add(Token(TokenType.comma, scanner.lastSpan));
} else if (scanner.scanChar($dash)) {
tokens.add(Token(TokenType.DASH, scanner.lastSpan));
tokens.add(Token(TokenType.dash, scanner.lastSpan));
} else if (scanner.scan(_rgxInt)) {
tokens.add(Token(TokenType.INT, scanner.lastSpan));
tokens.add(Token(TokenType.int, scanner.lastSpan));
} else if (scanner.scanChar($equal)) {
tokens.add(Token(TokenType.EQUALS, scanner.lastSpan));
tokens.add(Token(TokenType.equals, scanner.lastSpan));
} else {
var matched = false;
for (var unit in allowedRangeUnits) {
if (scanner.scan(unit)) {
tokens.add(Token(TokenType.RANGE_UNIT, scanner.lastSpan));
tokens.add(Token(TokenType.rangeUnit, scanner.lastSpan));
matched = true;
break;
}
@ -98,9 +98,9 @@ class Parser {
}
RangeHeader? parseRangeHeader() {
if (next(TokenType.RANGE_UNIT)) {
if (next(TokenType.rangeUnit)) {
var unit = current!.span!.text;
next(TokenType.EQUALS); // Consume =, if any.
next(TokenType.equals); // Consume =, if any.
var items = <RangeHeaderItem>[];
var item = parseHeaderItem();
@ -108,7 +108,7 @@ class Parser {
while (item != null) {
items.add(item);
// Parse comma
if (next(TokenType.COMMA)) {
if (next(TokenType.comma)) {
item = parseHeaderItem();
} else {
item = null;
@ -126,11 +126,11 @@ class Parser {
}
RangeHeaderItem? parseHeaderItem() {
if (next(TokenType.INT)) {
if (next(TokenType.int)) {
// i.e 500-544, or 600-
var start = int.parse(current!.span!.text);
if (next(TokenType.DASH)) {
if (next(TokenType.INT)) {
if (next(TokenType.dash)) {
if (next(TokenType.int)) {
return RangeHeaderItem(start, int.parse(current!.span!.text));
} else {
return RangeHeaderItem(start);
@ -138,9 +138,9 @@ class Parser {
} else {
throw _expected('"-"');
}
} else if (next(TokenType.DASH)) {
} else if (next(TokenType.dash)) {
// i.e. -599
if (next(TokenType.INT)) {
if (next(TokenType.int)) {
return RangeHeaderItem(-1, int.parse(current!.span!.text));
} else {
throw _expected('integer');

View file

@ -1,18 +1,18 @@
name: belatuk_range_header
version: 5.0.0
version: 6.0.0
description: Range header parser for Dart. Beyond parsing, a stream transformer is included.
homepage: https://github.com/dart-backend/belatuk-common-utilities/tree/main/packages/range_header
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: '>=3.0.0 <4.0.0'
dependencies:
async: ^2.6.0
charcode: ^1.2.0
quiver: ^3.0.1
source_span: ^1.8.1
string_scanner: ^1.1.0
async: ^2.11.0
charcode: ^1.3.0
quiver: ^3.2.0
source_span: ^1.10.0
string_scanner: ^1.2.0
dev_dependencies:
file: ^6.1.0
http_parser: ^4.0.0
logging: ^1.0.1
test: ^1.17.8
test: ^1.24.0
lints: ^2.0.0

View file

@ -1,5 +1,13 @@
# Change Log
## 5.0.0
* Require Dart >= 3.0
## 5.0.0-beta.1
* Require Dart >= 3.0
## 4.0.0
* Require Dart >= 2.17

View file

@ -12,8 +12,7 @@ and utilize basic memoization to speed up repeated lookups.
## Variables
To represent a symbol, use `Variable`. I opted for the name
`Variable` to avoid conflict with the Dart primitive `Symbol`.
To represent a symbol, use `Variable`. I opted for the name `Variable` to avoid conflict with the Dart primitive `Symbol`.
```dart
var foo = Variable<String>('foo');

View file

@ -1,11 +1,11 @@
name: belatuk_symbol_table
version: 4.0.0
version: 5.0.0
description: A generic symbol table implementation in Dart, with support for scopes and constants.
homepage: https://github.com/dart-backend/belatuk-common-utilities/tree/main/packages/symbol_table
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: '>=3.0.0 <4.0.0'
dependencies:
collection: ^1.15.0
collection: ^1.17.0
dev_dependencies:
test: ^1.17.4
test: ^1.24.0
lints: ^2.0.0

View file

@ -1,5 +1,13 @@
# Change Log
## 5.0.0
* Require Dart >= 3.0
## 5.0.0-beta.1
* Require Dart >= 3.0
## 4.0.0
* Require Dart >= 2.17

View file

@ -1,9 +1,9 @@
name: user_agent_analyzer
version: 4.0.0
version: 5.0.0
description: A library to identify the type of devices and web browsers based on User-Agent string.
homepage: https://github.com/dart-backend/belatuk-common-utilities/tree/main/packages/user_agent
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: '>=3.0.0 <4.0.0'
dev_dependencies:
test: ^1.17.8
test: ^1.24.0
lints: ^2.0.0

6
pubspec.yaml Normal file
View file

@ -0,0 +1,6 @@
name: belatuk_common_utilities_workspace
environment:
sdk: '>=2.18.0 <4.0.0'
dev_dependencies:
melos: ^3.0.0