├── .gitignore ├── README.md ├── analysis_options.yaml ├── bin └── server.dart ├── changelog.md ├── lib ├── buildpack.dart └── buildpack.g.dart ├── pubspec.lock ├── pubspec.yaml └── tool └── dev_server.dart /.gitignore: -------------------------------------------------------------------------------- 1 | # Files and directories created by pub. 2 | .dart_tool/ 3 | .packages 4 | 5 | # Conventional directory for build output. 6 | build/ 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Hosted at https://dart-buildpack-demo-ruyjilv5wq-uc.a.run.app/ 2 | 3 | Buildpack defined at https://github.com/GoogleCloudPlatform/buildpacks/tree/main/cmd/dart 4 | 5 | Bump CI emoji: ☝️ 6 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:dart_flutter_team_lints/analysis_options.yaml 2 | 3 | analyzer: 4 | language: 5 | strict-casts: true 6 | strict-inference: true 7 | strict-raw-types: true 8 | 9 | linter: 10 | rules: 11 | - avoid_unused_constructor_parameters 12 | - cancel_subscriptions 13 | - literal_only_boolean_expressions 14 | - missing_whitespace_between_adjacent_strings 15 | - no_adjacent_strings_in_list 16 | - no_runtimeType_toString 17 | - package_api_docs 18 | - prefer_expression_function_bodies 19 | - require_trailing_commas 20 | - unnecessary_await_in_return 21 | -------------------------------------------------------------------------------- /bin/server.dart: -------------------------------------------------------------------------------- 1 | import 'package:buildpack_dart/buildpack.dart'; 2 | 3 | Future main() async { 4 | await run(); 5 | } 6 | -------------------------------------------------------------------------------- /changelog.md: -------------------------------------------------------------------------------- 1 | Feb 25 - try 1 2 | Feb 24 - deploy to see if we pick up 2.16.1 - try 3 3 | -------------------------------------------------------------------------------- /lib/buildpack.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:collection/collection.dart'; 4 | import 'package:json_annotation/json_annotation.dart'; 5 | import 'package:shelf/shelf.dart'; 6 | import 'package:shelf/shelf_io.dart'; 7 | import 'package:shelf_router/shelf_router.dart'; 8 | 9 | part 'buildpack.g.dart'; 10 | 11 | final _upTime = Stopwatch()..start(); 12 | final _agents = {}; 13 | var _callCount = 0; 14 | 15 | // Configure routes. 16 | final _router = Router() 17 | ..get('/', _rootHandler) 18 | ..get('/echo/', _echoHandler); 19 | 20 | Response _rootHandler(Request req) { 21 | final agent = req.headers['user-agent']; 22 | if (agent != null) { 23 | _agents[agent] = (_agents[agent] ?? 0) + 1; 24 | } 25 | 26 | return Response.ok( 27 | ''' 28 | Hello, Cloud Run and Cloud Native Buildpacks! 29 | Call count: ${++_callCount} 30 | Up time: ${_upTime.elapsed} 31 | 32 | Dart bits: 33 | Dart version: ${Platform.version} 34 | Proc count: ${Platform.numberOfProcessors} 35 | 36 | Request headers: 37 | ${req.headers.output} 38 | 39 | ENVIRONMENT: 40 | ${Platform.environment.output} 41 | 42 | AGENTS: 43 | ${_agents.output} 44 | ''', 45 | ); 46 | } 47 | 48 | extension on Map { 49 | String get output { 50 | final longestKey = keys.fold( 51 | 0, 52 | (previousValue, element) => 53 | element.length > previousValue ? element.length : previousValue, 54 | ); 55 | 56 | return (entries.toList() 57 | ..sort((a, b) => compareAsciiLowerCase(a.key, b.key))) 58 | .map((e) => '${e.key.padRight(longestKey)} ${e.value}') 59 | .join('\n '); 60 | } 61 | } 62 | 63 | Response _echoHandler(Request request) { 64 | final message = request.params['message']; 65 | return Response.ok('$message\n'); 66 | } 67 | 68 | Future run() async { 69 | // Use any available host or container IP (usually `0.0.0.0`). 70 | final ip = InternetAddress.anyIPv4; 71 | 72 | // Configure a pipeline that logs requests. 73 | final handler = 74 | const Pipeline().addMiddleware(logRequests()).addHandler(_router.call); 75 | 76 | // For running in containers, we respect the PORT environment variable. 77 | final port = int.parse(Platform.environment['PORT'] ?? '8080'); 78 | final server = await serve(handler, ip, port); 79 | print('Server listening on port ${server.port}'); 80 | return server; 81 | } 82 | 83 | @JsonSerializable() 84 | class Bob { 85 | Bob(); 86 | 87 | factory Bob.fromJson(Map json) => _$BobFromJson(json); 88 | 89 | Map toJson() => _$BobToJson(this); 90 | } 91 | -------------------------------------------------------------------------------- /lib/buildpack.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'buildpack.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | Bob _$BobFromJson(Map json) => Bob(); 10 | 11 | Map _$BobToJson(Bob instance) => {}; 12 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | _fe_analyzer_shared: 5 | dependency: transitive 6 | description: 7 | name: _fe_analyzer_shared 8 | sha256: "36a321c3d2cbe01cbcb3540a87b8843846e0206df3e691fa7b23e19e78de6d49" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "65.0.0" 12 | analyzer: 13 | dependency: transitive 14 | description: 15 | name: analyzer 16 | sha256: dfe03b90ec022450e22513b5e5ca1f01c0c01de9c3fba2f7fd233cb57a6b9a07 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "6.3.0" 20 | args: 21 | dependency: transitive 22 | description: 23 | name: args 24 | sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "2.4.2" 28 | async: 29 | dependency: transitive 30 | description: 31 | name: async 32 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "2.11.0" 36 | boolean_selector: 37 | dependency: transitive 38 | description: 39 | name: boolean_selector 40 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "2.1.1" 44 | build: 45 | dependency: transitive 46 | description: 47 | name: build 48 | sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "2.4.1" 52 | build_config: 53 | dependency: transitive 54 | description: 55 | name: build_config 56 | sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "1.1.1" 60 | build_daemon: 61 | dependency: transitive 62 | description: 63 | name: build_daemon 64 | sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" 65 | url: "https://pub.dev" 66 | source: hosted 67 | version: "4.0.1" 68 | build_resolvers: 69 | dependency: transitive 70 | description: 71 | name: build_resolvers 72 | sha256: "64e12b0521812d1684b1917bc80945625391cb9bdd4312536b1d69dcb6133ed8" 73 | url: "https://pub.dev" 74 | source: hosted 75 | version: "2.4.1" 76 | build_runner: 77 | dependency: "direct dev" 78 | description: 79 | name: build_runner 80 | sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b" 81 | url: "https://pub.dev" 82 | source: hosted 83 | version: "2.4.6" 84 | build_runner_core: 85 | dependency: transitive 86 | description: 87 | name: build_runner_core 88 | sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 89 | url: "https://pub.dev" 90 | source: hosted 91 | version: "7.2.11" 92 | built_collection: 93 | dependency: transitive 94 | description: 95 | name: built_collection 96 | sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" 97 | url: "https://pub.dev" 98 | source: hosted 99 | version: "5.1.1" 100 | built_value: 101 | dependency: transitive 102 | description: 103 | name: built_value 104 | sha256: "723b4021e903217dfc445ec4cf5b42e27975aece1fc4ebbc1ca6329c2d9fb54e" 105 | url: "https://pub.dev" 106 | source: hosted 107 | version: "8.7.0" 108 | checked_yaml: 109 | dependency: transitive 110 | description: 111 | name: checked_yaml 112 | sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff 113 | url: "https://pub.dev" 114 | source: hosted 115 | version: "2.0.3" 116 | code_builder: 117 | dependency: transitive 118 | description: 119 | name: code_builder 120 | sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677" 121 | url: "https://pub.dev" 122 | source: hosted 123 | version: "4.7.0" 124 | collection: 125 | dependency: "direct main" 126 | description: 127 | name: collection 128 | sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a 129 | url: "https://pub.dev" 130 | source: hosted 131 | version: "1.18.0" 132 | convert: 133 | dependency: transitive 134 | description: 135 | name: convert 136 | sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" 137 | url: "https://pub.dev" 138 | source: hosted 139 | version: "3.1.1" 140 | crypto: 141 | dependency: transitive 142 | description: 143 | name: crypto 144 | sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab 145 | url: "https://pub.dev" 146 | source: hosted 147 | version: "3.0.3" 148 | dart_flutter_team_lints: 149 | dependency: "direct dev" 150 | description: 151 | name: dart_flutter_team_lints 152 | sha256: "091ced68bc78ae8002003065486fd052d556903ba6c68a4d47ca574c80e6013f" 153 | url: "https://pub.dev" 154 | source: hosted 155 | version: "2.1.1" 156 | dart_style: 157 | dependency: transitive 158 | description: 159 | name: dart_style 160 | sha256: abd7625e16f51f554ea244d090292945ec4d4be7bfbaf2ec8cccea568919d334 161 | url: "https://pub.dev" 162 | source: hosted 163 | version: "2.3.3" 164 | file: 165 | dependency: transitive 166 | description: 167 | name: file 168 | sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" 169 | url: "https://pub.dev" 170 | source: hosted 171 | version: "7.0.0" 172 | fixnum: 173 | dependency: transitive 174 | description: 175 | name: fixnum 176 | sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" 177 | url: "https://pub.dev" 178 | source: hosted 179 | version: "1.1.0" 180 | frontend_server_client: 181 | dependency: transitive 182 | description: 183 | name: frontend_server_client 184 | sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" 185 | url: "https://pub.dev" 186 | source: hosted 187 | version: "3.2.0" 188 | glob: 189 | dependency: transitive 190 | description: 191 | name: glob 192 | sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" 193 | url: "https://pub.dev" 194 | source: hosted 195 | version: "2.1.2" 196 | graphs: 197 | dependency: transitive 198 | description: 199 | name: graphs 200 | sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 201 | url: "https://pub.dev" 202 | source: hosted 203 | version: "2.3.1" 204 | hotreloader: 205 | dependency: transitive 206 | description: 207 | name: hotreloader 208 | sha256: "728c0613556c1d153f7e7f4a367cffacc3f5a677d7f6497a1c2b35add4e6dacf" 209 | url: "https://pub.dev" 210 | source: hosted 211 | version: "3.0.6" 212 | http_methods: 213 | dependency: transitive 214 | description: 215 | name: http_methods 216 | sha256: "6bccce8f1ec7b5d701e7921dca35e202d425b57e317ba1a37f2638590e29e566" 217 | url: "https://pub.dev" 218 | source: hosted 219 | version: "1.1.1" 220 | http_multi_server: 221 | dependency: transitive 222 | description: 223 | name: http_multi_server 224 | sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" 225 | url: "https://pub.dev" 226 | source: hosted 227 | version: "3.2.1" 228 | http_parser: 229 | dependency: transitive 230 | description: 231 | name: http_parser 232 | sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" 233 | url: "https://pub.dev" 234 | source: hosted 235 | version: "4.0.2" 236 | io: 237 | dependency: transitive 238 | description: 239 | name: io 240 | sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" 241 | url: "https://pub.dev" 242 | source: hosted 243 | version: "1.0.4" 244 | js: 245 | dependency: transitive 246 | description: 247 | name: js 248 | sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 249 | url: "https://pub.dev" 250 | source: hosted 251 | version: "0.6.7" 252 | json_annotation: 253 | dependency: "direct main" 254 | description: 255 | name: json_annotation 256 | sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 257 | url: "https://pub.dev" 258 | source: hosted 259 | version: "4.8.1" 260 | json_serializable: 261 | dependency: "direct dev" 262 | description: 263 | name: json_serializable 264 | sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 265 | url: "https://pub.dev" 266 | source: hosted 267 | version: "6.7.1" 268 | lints: 269 | dependency: transitive 270 | description: 271 | name: lints 272 | sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 273 | url: "https://pub.dev" 274 | source: hosted 275 | version: "3.0.0" 276 | logging: 277 | dependency: transitive 278 | description: 279 | name: logging 280 | sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" 281 | url: "https://pub.dev" 282 | source: hosted 283 | version: "1.2.0" 284 | matcher: 285 | dependency: transitive 286 | description: 287 | name: matcher 288 | sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" 289 | url: "https://pub.dev" 290 | source: hosted 291 | version: "0.12.16" 292 | meta: 293 | dependency: transitive 294 | description: 295 | name: meta 296 | sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 297 | url: "https://pub.dev" 298 | source: hosted 299 | version: "1.11.0" 300 | mime: 301 | dependency: transitive 302 | description: 303 | name: mime 304 | sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e 305 | url: "https://pub.dev" 306 | source: hosted 307 | version: "1.0.4" 308 | package_config: 309 | dependency: transitive 310 | description: 311 | name: package_config 312 | sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" 313 | url: "https://pub.dev" 314 | source: hosted 315 | version: "2.1.0" 316 | path: 317 | dependency: transitive 318 | description: 319 | name: path 320 | sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" 321 | url: "https://pub.dev" 322 | source: hosted 323 | version: "1.8.3" 324 | pool: 325 | dependency: transitive 326 | description: 327 | name: pool 328 | sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" 329 | url: "https://pub.dev" 330 | source: hosted 331 | version: "1.5.1" 332 | pub_semver: 333 | dependency: transitive 334 | description: 335 | name: pub_semver 336 | sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" 337 | url: "https://pub.dev" 338 | source: hosted 339 | version: "2.1.4" 340 | pubspec_parse: 341 | dependency: transitive 342 | description: 343 | name: pubspec_parse 344 | sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 345 | url: "https://pub.dev" 346 | source: hosted 347 | version: "1.2.3" 348 | shelf: 349 | dependency: "direct main" 350 | description: 351 | name: shelf 352 | sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 353 | url: "https://pub.dev" 354 | source: hosted 355 | version: "1.4.1" 356 | shelf_hotreload: 357 | dependency: "direct dev" 358 | description: 359 | name: shelf_hotreload 360 | sha256: "5e7a68273d64a095384325d769c6a4885ea15c6aafee361098c0d8a5ecb5dcf6" 361 | url: "https://pub.dev" 362 | source: hosted 363 | version: "1.4.0" 364 | shelf_router: 365 | dependency: "direct main" 366 | description: 367 | name: shelf_router 368 | sha256: f5e5d492440a7fb165fe1e2e1a623f31f734d3370900070b2b1e0d0428d59864 369 | url: "https://pub.dev" 370 | source: hosted 371 | version: "1.1.4" 372 | shelf_web_socket: 373 | dependency: transitive 374 | description: 375 | name: shelf_web_socket 376 | sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" 377 | url: "https://pub.dev" 378 | source: hosted 379 | version: "1.0.4" 380 | source_gen: 381 | dependency: transitive 382 | description: 383 | name: source_gen 384 | sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16 385 | url: "https://pub.dev" 386 | source: hosted 387 | version: "1.4.0" 388 | source_helper: 389 | dependency: transitive 390 | description: 391 | name: source_helper 392 | sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" 393 | url: "https://pub.dev" 394 | source: hosted 395 | version: "1.3.4" 396 | source_span: 397 | dependency: transitive 398 | description: 399 | name: source_span 400 | sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" 401 | url: "https://pub.dev" 402 | source: hosted 403 | version: "1.10.0" 404 | stack_trace: 405 | dependency: transitive 406 | description: 407 | name: stack_trace 408 | sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" 409 | url: "https://pub.dev" 410 | source: hosted 411 | version: "1.11.1" 412 | stream_channel: 413 | dependency: transitive 414 | description: 415 | name: stream_channel 416 | sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 417 | url: "https://pub.dev" 418 | source: hosted 419 | version: "2.1.2" 420 | stream_transform: 421 | dependency: transitive 422 | description: 423 | name: stream_transform 424 | sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" 425 | url: "https://pub.dev" 426 | source: hosted 427 | version: "2.1.0" 428 | string_scanner: 429 | dependency: transitive 430 | description: 431 | name: string_scanner 432 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 433 | url: "https://pub.dev" 434 | source: hosted 435 | version: "1.2.0" 436 | term_glyph: 437 | dependency: transitive 438 | description: 439 | name: term_glyph 440 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 441 | url: "https://pub.dev" 442 | source: hosted 443 | version: "1.2.1" 444 | test_api: 445 | dependency: transitive 446 | description: 447 | name: test_api 448 | sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" 449 | url: "https://pub.dev" 450 | source: hosted 451 | version: "0.6.1" 452 | timing: 453 | dependency: transitive 454 | description: 455 | name: timing 456 | sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" 457 | url: "https://pub.dev" 458 | source: hosted 459 | version: "1.0.1" 460 | typed_data: 461 | dependency: transitive 462 | description: 463 | name: typed_data 464 | sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c 465 | url: "https://pub.dev" 466 | source: hosted 467 | version: "1.3.2" 468 | vm_service: 469 | dependency: transitive 470 | description: 471 | name: vm_service 472 | sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 473 | url: "https://pub.dev" 474 | source: hosted 475 | version: "11.10.0" 476 | watcher: 477 | dependency: transitive 478 | description: 479 | name: watcher 480 | sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" 481 | url: "https://pub.dev" 482 | source: hosted 483 | version: "1.1.0" 484 | web_socket_channel: 485 | dependency: transitive 486 | description: 487 | name: web_socket_channel 488 | sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b 489 | url: "https://pub.dev" 490 | source: hosted 491 | version: "2.4.0" 492 | yaml: 493 | dependency: transitive 494 | description: 495 | name: yaml 496 | sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" 497 | url: "https://pub.dev" 498 | source: hosted 499 | version: "3.1.2" 500 | sdks: 501 | dart: ">=3.2.0 <4.0.0" 502 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: buildpack_dart 2 | 3 | environment: 4 | sdk: ^3.2.0 5 | 6 | dependencies: 7 | collection: ^1.15.0 8 | json_annotation: ^4.8.0 9 | shelf: ^1.1.0 10 | shelf_router: ^1.0.0 11 | 12 | dev_dependencies: 13 | build_runner: 14 | dart_flutter_team_lints: ^2.1.1 15 | json_serializable: 16 | shelf_hotreload: ^1.0.1 17 | -------------------------------------------------------------------------------- /tool/dev_server.dart: -------------------------------------------------------------------------------- 1 | import 'package:buildpack_dart/buildpack.dart'; 2 | import 'package:shelf_hotreload/shelf_hotreload.dart'; 3 | 4 | void main() { 5 | withHotreload(run); 6 | } 7 | --------------------------------------------------------------------------------