diff --git a/packages/dart_frog_cli/e2e/test/daemon/daemon_domain_test.dart b/packages/dart_frog_cli/e2e/test/daemon/daemon_domain_test.dart index abaa29d5b..56f68bd82 100644 --- a/packages/dart_frog_cli/e2e/test/daemon/daemon_domain_test.dart +++ b/packages/dart_frog_cli/e2e/test/daemon/daemon_domain_test.dart @@ -21,10 +21,7 @@ void main() { late final DaemonStdioHelper daemonStdio; setUpAll(() async { - await dartFrogCreate( - projectName: projectName, - directory: tempDirectory, - ); + await dartFrogCreate(projectName: projectName, directory: tempDirectory); daemonProcess = await dartFrogDaemonStart(); daemonStdio = DaemonStdioHelper(daemonProcess); @@ -34,10 +31,7 @@ void main() { group('daemon domain', () { test('daemon is ready', () async { final readyEvent = await daemonStdio.awaitForDaemonEvent('daemon.ready'); - expect( - readyEvent.params?.keys, - containsAll(['version', 'processId']), - ); + expect(readyEvent.params?.keys, containsAll(['version', 'processId'])); }); group('daemon responds to invalid messages', () { @@ -46,10 +40,7 @@ void main() { final protocolError = await daemonStdio.awaitForDaemonEvent( 'daemon.protocolError', ); - expect( - protocolError.params?['message'], - equals('Not a valid JSON'), - ); + expect(protocolError.params?['message'], equals('Not a valid JSON')); }); test('daemon process responds to invalid json', () async { @@ -127,10 +118,7 @@ void main() { ), ); - expect( - response.result, - equals({'version': '0.0.1'}), - ); + expect(response.result, equals({'version': '0.0.1'})); }); test('daemon.kill', () async { diff --git a/packages/dart_frog_cli/e2e/test/daemon/dev_server_domain_test.dart b/packages/dart_frog_cli/e2e/test/daemon/dev_server_domain_test.dart index 8ab995092..c20c7c1ae 100644 --- a/packages/dart_frog_cli/e2e/test/daemon/dev_server_domain_test.dart +++ b/packages/dart_frog_cli/e2e/test/daemon/dev_server_domain_test.dart @@ -49,14 +49,8 @@ void main() { var requestCount = 0; setUpAll(() async { - await dartFrogCreate( - projectName: projectName1, - directory: tempDirectory, - ); - await dartFrogCreate( - projectName: projectName2, - directory: tempDirectory, - ); + await dartFrogCreate(projectName: projectName1, directory: tempDirectory); + await dartFrogCreate(projectName: projectName2, directory: tempDirectory); daemonProcess = await dartFrogDaemonStart(); daemonStdio = DaemonStdioHelper(daemonProcess); @@ -191,8 +185,9 @@ void main() { ); }); - testServer(port: project1Server2Port, 'GET / on project 1 server 2', - (host) async { + testServer(port: project1Server2Port, 'GET / on project 1 server 2', ( + host, + ) async { final response = await http.get(Uri.parse(host)); expect(response.statusCode, equals(HttpStatus.ok)); expect(response.body, equals('Welcome to Dart Frog!')); @@ -205,10 +200,7 @@ void main() { test('modify files on project 2', () async { final routesDirectory = Directory( - path.join( - projectDirectory2.path, - 'routes', - ), + path.join(projectDirectory2.path, 'routes'), ); expect(fileAt('index.dart', on: routesDirectory), exists); @@ -224,17 +216,16 @@ void main() { id: '${++requestCount}', domain: 'dev_server', method: 'reload', - params: { - 'applicationId': project2ServerId, - }, + params: {'applicationId': project2ServerId}, ), ); expect(response.isSuccess, isTrue); }); - testServer(port: project2ServerPort, 'GET /new_route on project 2', - (host) async { + testServer(port: project2ServerPort, 'GET /new_route on project 2', ( + host, + ) async { final response = await http.get(Uri.parse(host)); expect(response.statusCode, equals(HttpStatus.ok)); expect(response.headers, contains('date')); @@ -245,27 +236,21 @@ void main() { }); test('try staggered-stop a dev server on project 1', () async { - final (response1, response2) = - await daemonStdio.sendStaggeredDaemonRequest( - ( - DaemonRequest( - id: '${++requestCount}', - domain: 'dev_server', - method: 'stop', - params: { - 'applicationId': project1Server1Id, - }, - ), - DaemonRequest( - id: '${++requestCount}', - domain: 'dev_server', - method: 'stop', - params: { - 'applicationId': project1Server1Id, - }, - ), - ), - ); + final (response1, response2) = await daemonStdio + .sendStaggeredDaemonRequest(( + DaemonRequest( + id: '${++requestCount}', + domain: 'dev_server', + method: 'stop', + params: {'applicationId': project1Server1Id}, + ), + DaemonRequest( + id: '${++requestCount}', + domain: 'dev_server', + method: 'stop', + params: {'applicationId': project1Server1Id}, + ), + )); expect(response1.isSuccess, isTrue); expect(response1.result!['exitCode'], equals(0)); @@ -278,9 +263,7 @@ void main() { id: '${++requestCount}', domain: 'dev_server', method: 'stop', - params: { - 'applicationId': project1Server1Id, - }, + params: {'applicationId': project1Server1Id}, ), ); @@ -305,16 +288,15 @@ void main() { }); testServer( - // TODO(renancaraujo): this fails on linux: https://github.com/VeryGoodOpenSource/dart_frog/issues/807 - skip: Platform.isLinux, - 'GET on project 1 server 1: connection refused', (host) async { - final responseFuture = http.get(Uri.parse(host)); - - await expectLater( - responseFuture, - throwsA(isA()), - ); - }); + // TODO(renancaraujo): this fails on linux: https://github.com/VeryGoodOpenSource/dart_frog/issues/807 + skip: Platform.isLinux, + 'GET on project 1 server 1: connection refused', + (host) async { + final responseFuture = http.get(Uri.parse(host)); + + await expectLater(responseFuture, throwsA(isA())); + }, + ); testServer( port: project2ServerPort, @@ -325,12 +307,7 @@ void main() { (host) async { final responseFuture = http.get(Uri.parse(host)); - await expectLater( - responseFuture, - throwsA( - isA(), - ), - ); + await expectLater(responseFuture, throwsA(isA())); }, ); @@ -340,16 +317,13 @@ void main() { // TODO(renancaraujo): this fails on linux: https://github.com/VeryGoodOpenSource/dart_frog/issues/807 skip: Platform.isLinux, (host) async { - await expectLater( - () async { - final response = await http.get(Uri.parse(host)); - stderr - ..writeln(response.statusCode) - ..writeln(response.body); - return response; - }, - throwsA(isA()), - ); + await expectLater(() async { + final response = await http.get(Uri.parse(host)); + stderr + ..writeln(response.statusCode) + ..writeln(response.body); + return response; + }, throwsA(isA())); }, ); }); diff --git a/packages/dart_frog_cli/e2e/test/daemon/route_configuration_domain_test.dart b/packages/dart_frog_cli/e2e/test/daemon/route_configuration_domain_test.dart index 2e18e0ccf..80186d771 100644 --- a/packages/dart_frog_cli/e2e/test/daemon/route_configuration_domain_test.dart +++ b/packages/dart_frog_cli/e2e/test/daemon/route_configuration_domain_test.dart @@ -32,10 +32,7 @@ void main() { late String projectWatcherId; setUpAll(() async { - await dartFrogCreate( - projectName: projectName, - directory: tempDirectory, - ); + await dartFrogCreate(projectName: projectName, directory: tempDirectory); daemonProcess = await dartFrogDaemonStart(); daemonStdio = DaemonStdioHelper(daemonProcess); @@ -54,9 +51,7 @@ void main() { id: '${++requestCount}', domain: 'route_configuration', method: 'watcherStart', - params: { - 'workingDirectory': projectDirectory.path, - }, + params: {'workingDirectory': projectDirectory.path}, ), ); @@ -164,9 +159,7 @@ void main() { id: '${requestCount++}', domain: 'route_configuration', method: 'watcherGenerateRouteConfiguration', - params: { - 'watcherId': projectWatcherId, - }, + params: {'watcherId': projectWatcherId}, ), ); @@ -208,10 +201,7 @@ void main() { containsPair('requestId', '1'), containsPair( 'message', - allOf( - startsWith('[watcher] add'), - endsWith('rogue_route.dart'), - ), + allOf(startsWith('[watcher] add'), endsWith('rogue_route.dart')), ), ), timeout: const Duration(seconds: 5), @@ -236,27 +226,21 @@ void main() { }); test('staggered-stop watcher', () async { - final (response1, response2) = - await daemonStdio.sendStaggeredDaemonRequest( - ( - DaemonRequest( - id: '${requestCount++}', - domain: 'route_configuration', - method: 'watcherStop', - params: { - 'watcherId': projectWatcherId, - }, - ), - DaemonRequest( - id: '${requestCount++}', - domain: 'route_configuration', - method: 'watcherStop', - params: { - 'watcherId': projectWatcherId, - }, - ), - ), - ); + final (response1, response2) = await daemonStdio + .sendStaggeredDaemonRequest(( + DaemonRequest( + id: '${requestCount++}', + domain: 'route_configuration', + method: 'watcherStop', + params: {'watcherId': projectWatcherId}, + ), + DaemonRequest( + id: '${requestCount++}', + domain: 'route_configuration', + method: 'watcherStop', + params: {'watcherId': projectWatcherId}, + ), + )); expect(response1.isSuccess, isTrue); expect(response1.result?['exitCode'], equals(0)); diff --git a/packages/dart_frog_cli/e2e/test/dev_test.dart b/packages/dart_frog_cli/e2e/test/dev_test.dart index 16087a1cb..c522425dd 100644 --- a/packages/dart_frog_cli/e2e/test/dev_test.dart +++ b/packages/dart_frog_cli/e2e/test/dev_test.dart @@ -63,41 +63,38 @@ void main() { tempDirectory.delete(recursive: true).ignore(); }); - test( - 'running two different dart_frog dev command will fail ' - 'when different dart vm port is not set', - () async { - final process1 = await dartFrogDev( - directory: Directory(path.join(tempDirectory.path, projectName1)), + test('running two different dart_frog dev command will fail ' + 'when different dart vm port is not set', () async { + final process1 = await dartFrogDev( + directory: Directory(path.join(tempDirectory.path, projectName1)), + ); + addTearDown(() async { + await killDartFrogServer(process1.pid).ignoreErrors(); + }); + + try { + final process2 = await dartFrogDev( + directory: Directory(path.join(tempDirectory.path, projectName2)), + exitOnError: false, ); addTearDown(() async { - await killDartFrogServer(process1.pid).ignoreErrors(); + await killDartFrogServer(process2.pid).ignoreErrors(); }); - try { - final process2 = await dartFrogDev( - directory: Directory(path.join(tempDirectory.path, projectName2)), - exitOnError: false, - ); - addTearDown(() async { - await killDartFrogServer(process2.pid).ignoreErrors(); - }); - - fail('exception not thrown'); - } catch (e) { - expect(e.toString(), contains('Could not start the VM service:')); - - expect( - e.toString(), - contains( - 'DartDevelopmentServiceException: Failed to create server socket', - ), - ); - - expect(e.toString(), contains('127.0.0.1:8181')); - } - }, - ); + fail('exception not thrown'); + } catch (e) { + expect(e.toString(), contains('Could not start the VM service:')); + + expect( + e.toString(), + contains( + 'DartDevelopmentServiceException: Failed to create server socket', + ), + ); + + expect(e.toString(), contains('127.0.0.1:8181')); + } + }); test( 'runs two different dart_frog dev servers without any issues', diff --git a/packages/dart_frog_cli/e2e/test/helpers/dart_frog_build.dart b/packages/dart_frog_cli/e2e/test/helpers/dart_frog_build.dart index 3f3bf8b53..7575ac435 100644 --- a/packages/dart_frog_cli/e2e/test/helpers/dart_frog_build.dart +++ b/packages/dart_frog_cli/e2e/test/helpers/dart_frog_build.dart @@ -2,9 +2,7 @@ import 'dart:io'; import 'helpers.dart'; -Future dartFrogBuild({ - required Directory directory, -}) async { +Future dartFrogBuild({required Directory directory}) async { await runProcess( 'dart_frog', ['build'], diff --git a/packages/dart_frog_cli/e2e/test/helpers/dart_frog_daemon.dart b/packages/dart_frog_cli/e2e/test/helpers/dart_frog_daemon.dart index 9aa31fbc6..4f27d107f 100644 --- a/packages/dart_frog_cli/e2e/test/helpers/dart_frog_daemon.dart +++ b/packages/dart_frog_cli/e2e/test/helpers/dart_frog_daemon.dart @@ -8,11 +8,7 @@ import 'package:test/test.dart'; /// Starts the dart_frog daemon in the given directory. Future dartFrogDaemonStart() { - return Process.start( - 'dart_frog', - ['daemon'], - runInShell: true, - ); + return Process.start('dart_frog', ['daemon'], runInShell: true); } /// Converts a raw message from the daemon stdout @@ -69,8 +65,11 @@ class DaemonStdioHelper { Duration timeout = _defaultTimeout, Matcher? withParamsThat, }) async { - var wrappedMatcher = isA() - .having((e) => '${e.domain}.${e.event}', 'is $methodKey', methodKey); + var wrappedMatcher = isA().having( + (e) => '${e.domain}.${e.event}', + 'is $methodKey', + methodKey, + ); if (withParamsThat != null) { wrappedMatcher = wrappedMatcher.having( @@ -111,9 +110,10 @@ class DaemonStdioHelper { messageMatchers.add(messageMatcher); // Check if there is already a matching message in the cache. - final existingItem = _pastMessagesCache.indexed.where((pair) { - return messageMatcher.matches(pair.$2, {}); - }).firstOrNull; + final existingItem = + _pastMessagesCache.indexed.where((pair) { + return messageMatcher.matches(pair.$2, {}); + }).firstOrNull; if (existingItem case (final int itemIndex, final String itemValue)) { // If there is a matching message in the cache, @@ -221,10 +221,7 @@ class DaemonStdioHelper { final result = await Future.wait([responseMessage1, responseMessage2]); - return ( - result.first as DaemonResponse, - result.last as DaemonResponse, - ); + return (result.first as DaemonResponse, result.last as DaemonResponse); } void dispose() { @@ -237,7 +234,7 @@ class DaemonStdioHelper { /// A matcher that matches a [DaemonMessage] to a daemon stdout line. class _MatchMessageToStdoutLine extends CustomMatcher { _MatchMessageToStdoutLine(Matcher matcher) - : super('Message to stdout line', 'message', matcher); + : super('Message to stdout line', 'message', matcher); @override Object? featureValueOf(dynamic actual) { diff --git a/packages/dart_frog_cli/e2e/test/helpers/dart_frog_new.dart b/packages/dart_frog_cli/e2e/test/helpers/dart_frog_new.dart index 2659e3a64..9147bca33 100644 --- a/packages/dart_frog_cli/e2e/test/helpers/dart_frog_new.dart +++ b/packages/dart_frog_cli/e2e/test/helpers/dart_frog_new.dart @@ -7,22 +7,16 @@ import 'run_process.dart'; Future dartFrogNewRoute( String routePath, { required Directory directory, -}) => - _dartFrogNew( - routePath: routePath, - what: 'route', - directory: directory, - ); +}) => _dartFrogNew(routePath: routePath, what: 'route', directory: directory); Future dartFrogNewMiddleware( String routePath, { required Directory directory, -}) => - _dartFrogNew( - routePath: routePath, - what: 'middleware', - directory: directory, - ); +}) => _dartFrogNew( + routePath: routePath, + what: 'middleware', + directory: directory, +); Future _dartFrogNew({ required String routePath, diff --git a/packages/dart_frog_cli/e2e/test/helpers/files.dart b/packages/dart_frog_cli/e2e/test/helpers/files.dart index f4f942cc9..97a0f8c36 100644 --- a/packages/dart_frog_cli/e2e/test/helpers/files.dart +++ b/packages/dart_frog_cli/e2e/test/helpers/files.dart @@ -11,9 +11,9 @@ final doesNotExist = FileExistsMatcher(isFalse); class FileExistsMatcher extends CustomMatcher { FileExistsMatcher(Matcher matcher) - : super( - 'File exists', - 'file exists', - isA().having((p) => p.existsSync(), 'exists', matcher), - ); + : super( + 'File exists', + 'file exists', + isA().having((p) => p.existsSync(), 'exists', matcher), + ); } diff --git a/packages/dart_frog_cli/e2e/test/helpers/kill_dart_frog_server.dart b/packages/dart_frog_cli/e2e/test/helpers/kill_dart_frog_server.dart index a9de453e5..119b99619 100644 --- a/packages/dart_frog_cli/e2e/test/helpers/kill_dart_frog_server.dart +++ b/packages/dart_frog_cli/e2e/test/helpers/kill_dart_frog_server.dart @@ -4,11 +4,12 @@ import 'helpers.dart'; Future killDartFrogServer(int pid, {int port = 8080}) async { if (Platform.isWindows) { - await runProcess( - 'taskkill', - ['/F', '/T', '/PID', '$pid'], - runInShell: true, - ); + await runProcess('taskkill', [ + '/F', + '/T', + '/PID', + '$pid', + ], runInShell: true); return; } diff --git a/packages/dart_frog_cli/e2e/test/helpers/run_process.dart b/packages/dart_frog_cli/e2e/test/helpers/run_process.dart index e2d99c319..578363f6b 100644 --- a/packages/dart_frog_cli/e2e/test/helpers/run_process.dart +++ b/packages/dart_frog_cli/e2e/test/helpers/run_process.dart @@ -36,10 +36,7 @@ bool _isNotEmpty(dynamic data) { } class RunProcessException implements Exception { - RunProcessException( - this.message, { - required this.processResult, - }); + RunProcessException(this.message, {required this.processResult}); final String message; diff --git a/packages/dart_frog_cli/e2e/test/new_test.dart b/packages/dart_frog_cli/e2e/test/new_test.dart index cf68b435f..e473a9f10 100644 --- a/packages/dart_frog_cli/e2e/test/new_test.dart +++ b/packages/dart_frog_cli/e2e/test/new_test.dart @@ -57,15 +57,13 @@ void main() { test('Creates nested dynamic route', () async { await dartFrogNewRoute('/inn/[id]/route', directory: projectDirectory); - expect( - fileAt('inn/[id]/route.dart', on: routesDirectory), - exists, - ); + expect(fileAt('inn/[id]/route.dart', on: routesDirectory), exists); }); test('Creates a index route for an existing directory', () async { - Directory(path.join(routesDirectory.path, 'nested')) - .createSync(recursive: true); + Directory( + path.join(routesDirectory.path, 'nested'), + ).createSync(recursive: true); await dartFrogNewRoute('/nested', directory: projectDirectory); @@ -106,27 +104,22 @@ void main() { exists, ); expect( - fileAt( - 'some_other_route/deep/deep/internal.dart', - on: routesDirectory, - ), + fileAt('some_other_route/deep/deep/internal.dart', on: routesDirectory), exists, ); }); - test( - 'Creates route normally when there is a non-dart file with the same ' - 'route path', - () async { - File(path.join(routesDirectory.path, 'something.py')) - .createSync(recursive: true); + test('Creates route normally when there is a non-dart file with the same ' + 'route path', () async { + File( + path.join(routesDirectory.path, 'something.py'), + ).createSync(recursive: true); - await dartFrogNewRoute('/something', directory: projectDirectory); + await dartFrogNewRoute('/something', directory: projectDirectory); - expect(fileAt('something.dart', on: routesDirectory), exists); - expect(fileAt('something.py', on: routesDirectory), exists); - }, - ); + expect(fileAt('something.dart', on: routesDirectory), exists); + expect(fileAt('something.py', on: routesDirectory), exists); + }); test('Excuse root route', () async { await expectLater( @@ -173,9 +166,7 @@ void main() { test('Excuse route creation of invalid route identifiers', () async { await expectLater( () async => dartFrogNewRoute('/👯‍', directory: projectDirectory), - failsWith( - stderr: 'Route path segments must be valid Dart identifiers', - ), + failsWith(stderr: 'Route path segments must be valid Dart identifiers'), ); }); @@ -210,9 +201,7 @@ void main() { path.join(testDirectory.path, projectName), ); - routesDirectory = Directory( - path.join(projectDirectory.path, 'routes'), - ); + routesDirectory = Directory(path.join(projectDirectory.path, 'routes')); }); tearDown(() async { @@ -222,14 +211,16 @@ void main() { test('Excuse existing endpoints (existing rogue route)', () async { await dartFrogNewRoute('/existing_rogue', directory: projectDirectory); - Directory(path.join(routesDirectory.path, 'existing_rogue')) - .createSync(recursive: true); + Directory( + path.join(routesDirectory.path, 'existing_rogue'), + ).createSync(recursive: true); await expectLater( () => dartFrogNewRoute('/existing_rogue', directory: projectDirectory), failsWith( - stderr: 'Failed to create route: Rogue route detected. ' + stderr: + 'Failed to create route: Rogue route detected. ' 'Rename routes${slash}existing_rogue.dart to ' 'routes${slash}existing_rogue${slash}index.dart.', ), @@ -242,8 +233,9 @@ void main() { directory: projectDirectory, ); - File(path.join(routesDirectory.path, 'conflicting_route/index.dart')) - .createSync(recursive: true); + File( + path.join(routesDirectory.path, 'conflicting_route/index.dart'), + ).createSync(recursive: true); await expectLater( () async => dartFrogNewRoute( @@ -251,7 +243,8 @@ void main() { directory: projectDirectory, ), failsWith( - stderr: 'Failed to create route: ' + stderr: + 'Failed to create route: ' 'Route conflict detected. ' 'routes${slash}conflicting_route.dart and ' 'routes${slash}conflicting_route${slash}index.dart ' @@ -384,7 +377,8 @@ void main() { directory: projectDirectory, ), failsWith( - stderr: 'There is already a middleware at ' + stderr: + 'There is already a middleware at ' 'routes${slash}existing_middleware${slash}_middleware.dart', ), ); @@ -393,9 +387,7 @@ void main() { test('Excuse middleware creation of invalid route identifier', () async { await expectLater( () async => dartFrogNewMiddleware('/👯‍', directory: projectDirectory), - failsWith( - stderr: 'Route path segments must be valid Dart identifiers', - ), + failsWith(stderr: 'Route path segments must be valid Dart identifiers'), ); }); @@ -406,7 +398,8 @@ void main() { directory: projectDirectory, ), failsWith( - stderr: 'Failed to create middleware: ' + stderr: + 'Failed to create middleware: ' 'Duplicate parameter name found: id', ), ); @@ -433,9 +426,7 @@ void main() { path.join(testDirectory.path, projectName), ); - routesDirectory = Directory( - path.join(projectDirectory.path, 'routes'), - ); + routesDirectory = Directory(path.join(projectDirectory.path, 'routes')); }); tearDown(() async { @@ -445,8 +436,9 @@ void main() { test('Excuse middleware creation upon existing rogue routes', () async { await dartFrogNewRoute('/existing_rogue', directory: projectDirectory); - Directory(path.join(routesDirectory.path, 'existing_rogue')) - .createSync(recursive: true); + Directory( + path.join(routesDirectory.path, 'existing_rogue'), + ).createSync(recursive: true); await expectLater( () async => dartFrogNewMiddleware( @@ -454,36 +446,41 @@ void main() { directory: projectDirectory, ), failsWith( - stderr: 'Failed to create middleware: Rogue route detected. ' + stderr: + 'Failed to create middleware: Rogue route detected. ' 'Rename routes${slash}existing_rogue.dart to ' 'routes${slash}existing_rogue${slash}index.dart.', ), ); }); - test('Excuse middleware creation upon existing route conflicts', - () async { - await dartFrogNewRoute( - '/conflicting_route', - directory: projectDirectory, - ); - - File(path.join(routesDirectory.path, 'conflicting_route/index.dart')) - .createSync(recursive: true); - - await expectLater( - () async => dartFrogNewMiddleware( + test( + 'Excuse middleware creation upon existing route conflicts', + () async { + await dartFrogNewRoute( '/conflicting_route', directory: projectDirectory, - ), - failsWith( - stderr: 'Failed to create middleware: Route conflict detected. ' - 'routes${slash}conflicting_route.dart and ' - 'routes${slash}conflicting_route${slash}index.dart both ' - 'resolve to /conflicting_route.', - ), - ); - }); + ); + + File( + path.join(routesDirectory.path, 'conflicting_route/index.dart'), + ).createSync(recursive: true); + + await expectLater( + () async => dartFrogNewMiddleware( + '/conflicting_route', + directory: projectDirectory, + ), + failsWith( + stderr: + 'Failed to create middleware: Route conflict detected. ' + 'routes${slash}conflicting_route.dart and ' + 'routes${slash}conflicting_route${slash}index.dart both ' + 'resolve to /conflicting_route.', + ), + ); + }, + ); }); }); } diff --git a/packages/dart_frog_cli/lib/src/command_runner.dart b/packages/dart_frog_cli/lib/src/command_runner.dart index ed670ef6d..41c097fe3 100644 --- a/packages/dart_frog_cli/lib/src/command_runner.dart +++ b/packages/dart_frog_cli/lib/src/command_runner.dart @@ -33,12 +33,12 @@ class DartFrogCommandRunner extends CompletionCommandRunner { io.ProcessSignal? sigint, Exit? exit, io.Stdin? stdin, - }) : _logger = logger ?? Logger(), - _pubUpdater = pubUpdater ?? PubUpdater(), - _sigint = sigint ?? io.ProcessSignal.sigint, - _exit = exit ?? io.exit, - stdin = stdin ?? io.stdin, - super(executableName, executableDescription) { + }) : _logger = logger ?? Logger(), + _pubUpdater = pubUpdater ?? PubUpdater(), + _sigint = sigint ?? io.ProcessSignal.sigint, + _exit = exit ?? io.exit, + stdin = stdin ?? io.stdin, + super(executableName, executableDescription) { argParser.addFlags(); addCommand(BuildCommand(logger: _logger)); addCommand(CreateCommand(logger: _logger)); @@ -116,17 +116,13 @@ class DartFrogCommandRunner extends CompletionCommandRunner { ); _logger ..info('') - ..info( - ''' + ..info(''' ${lightYellow.wrap('Update available!')} ${lightCyan.wrap(packageVersion)} \u2192 ${lightCyan.wrap(latestVersion)} ${lightYellow.wrap('Changelog:')} $changelogLink -Run ${lightCyan.wrap('$executableName update')} to update''', - ); +Run ${lightCyan.wrap('$executableName update')} to update'''); } } catch (error, stackTrace) { - _logger.detail( - '[updater] update check error.\n$error\n$stackTrace', - ); + _logger.detail('[updater] update check error.\n$error\n$stackTrace'); } finally { _logger.detail('[updater] update check complete.'); } @@ -153,15 +149,7 @@ Run ${lightCyan.wrap('$executableName update')} to update''', extension on ArgParser { void addFlags() { - addFlag( - 'version', - negatable: false, - help: 'Print the current version.', - ); - addFlag( - 'verbose', - negatable: false, - help: 'Output additional logs.', - ); + addFlag('version', negatable: false, help: 'Print the current version.'); + addFlag('verbose', negatable: false, help: 'Output additional logs.'); } } diff --git a/packages/dart_frog_cli/lib/src/commands/build/build.dart b/packages/dart_frog_cli/lib/src/commands/build/build.dart index a6de875a2..c40167674 100644 --- a/packages/dart_frog_cli/lib/src/commands/build/build.dart +++ b/packages/dart_frog_cli/lib/src/commands/build/build.dart @@ -15,13 +15,14 @@ class BuildCommand extends DartFrogCommand { @visibleForTesting GeneratorBuilder? generator, @visibleForTesting ProdServerBuilderConstructor? prodServerBuilderConstructor, - }) : _generator = generator ?? MasonGenerator.fromBundle, - _prodServerBuilderConstructor = - prodServerBuilderConstructor ?? ProdServerBuilder.new { + }) : _generator = generator ?? MasonGenerator.fromBundle, + _prodServerBuilderConstructor = + prodServerBuilderConstructor ?? ProdServerBuilder.new { argParser.addOption( 'dart-version', defaultsTo: 'stable', - help: 'The Dart SDK version used to build the Dockerfile, defaults to' + help: + 'The Dart SDK version used to build the Dockerfile, defaults to' ' stable.', ); } diff --git a/packages/dart_frog_cli/lib/src/commands/build/templates/dart_frog_prod_server_bundle.dart b/packages/dart_frog_cli/lib/src/commands/build/templates/dart_frog_prod_server_bundle.dart index f56661813..b0093f3ec 100644 --- a/packages/dart_frog_cli/lib/src/commands/build/templates/dart_frog_prod_server_bundle.dart +++ b/packages/dart_frog_cli/lib/src/commands/build/templates/dart_frog_prod_server_bundle.dart @@ -9,142 +9,142 @@ final dartFrogProdServerBundle = MasonBundle.fromJson({ "path": "build/.dockerignore", "data": "LmRvY2tlcmlnbm9yZQpEb2NrZXJmaWxlCmJ1aWxkLwouZGFydF90b29sLwouZ2l0LwouZ2l0aHViLwouZ2l0aWdub3JlCi5pZGVhLwoucGFja2FnZXM=", - "type": "text" + "type": "text", }, { "path": "build/bin/server.dart", "data": "Ly8gR0VORVJBVEVEIENPREUgLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLy8gaWdub3JlX2Zvcl9maWxlOiB0eXBlPWxpbnQsIGltcGxpY2l0X2R5bmFtaWNfbGlzdF9saXRlcmFsCgppbXBvcnQgJ2RhcnQ6aW8nOwoKaW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZy9kYXJ0X2Zyb2cuZGFydCc7Cgp7eyNpbnZva2VDdXN0b21FbnRyeXBvaW50fX1pbXBvcnQgJy4uL21haW4uZGFydCcgYXMgZW50cnlwb2ludDt7ey9pbnZva2VDdXN0b21FbnRyeXBvaW50fX0Ke3sjcm91dGVzfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Owp7ey9yb3V0ZXN9fQp7eyNtaWRkbGV3YXJlfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Owp7ey9taWRkbGV3YXJlfX0Kdm9pZCBtYWluKCkgYXN5bmMgewogIGZpbmFsIGFkZHJlc3MgPSBJbnRlcm5ldEFkZHJlc3MuYW55SVB2NjsKICBmaW5hbCBwb3J0ID0gaW50LnRyeVBhcnNlKFBsYXRmb3JtLmVudmlyb25tZW50WydQT1JUJ10gPz8gJzgwODAnKSA/PyA4MDgwO3t7I2ludm9rZUN1c3RvbUluaXR9fQogIGF3YWl0IGVudHJ5cG9pbnQuaW5pdChhZGRyZXNzLCBwb3J0KTt7ey9pbnZva2VDdXN0b21Jbml0fX0KICBjcmVhdGVTZXJ2ZXIoYWRkcmVzcywgcG9ydCk7Cn0KCkZ1dHVyZTxIdHRwU2VydmVyPiBjcmVhdGVTZXJ2ZXIoSW50ZXJuZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0KSBhc3luYyB7CiAgZmluYWwgaGFuZGxlciA9IENhc2NhZGUoKXt7I3NlcnZlU3RhdGljRmlsZXN9fS5hZGQoY3JlYXRlU3RhdGljRmlsZUhhbmRsZXIoKSl7ey9zZXJ2ZVN0YXRpY0ZpbGVzfX0uYWRkKGJ1aWxkUm9vdEhhbmRsZXIoKSkuaGFuZGxlcjsKICBmaW5hbCBzZXJ2ZXIgPSBhd2FpdCB7eyNpbnZva2VDdXN0b21FbnRyeXBvaW50fX1lbnRyeXBvaW50LnJ1bihoYW5kbGVyLCBhZGRyZXNzLCBwb3J0KXt7L2ludm9rZUN1c3RvbUVudHJ5cG9pbnR9fXt7Xmludm9rZUN1c3RvbUVudHJ5cG9pbnR9fXNlcnZlKGhhbmRsZXIsIGFkZHJlc3MsIHBvcnQpe3svaW52b2tlQ3VzdG9tRW50cnlwb2ludH19OwogIHByaW50KCdceDFCWzkybeKck1x4MUJbMG0gUnVubmluZyBvbiBodHRwOi8vJHtzZXJ2ZXIuYWRkcmVzcy5ob3N0fToke3NlcnZlci5wb3J0fScpOwogIHJldHVybiBzZXJ2ZXI7Cn0KCkhhbmRsZXIgYnVpbGRSb290SGFuZGxlcigpIHsKICBmaW5hbCBwaXBlbGluZSA9IGNvbnN0IFBpcGVsaW5lKCl7eyNnbG9iYWxNaWRkbGV3YXJlfX0uYWRkTWlkZGxld2FyZSh7eyNzbmFrZUNhc2V9fXt7e25hbWV9fX17ey9zbmFrZUNhc2V9fS5taWRkbGV3YXJlKXt7L2dsb2JhbE1pZGRsZXdhcmV9fTsKICBmaW5hbCByb3V0ZXIgPSBSb3V0ZXIoKXt7I2RpcmVjdG9yaWVzfX0KICAgIC4ubW91bnQoJ3t7e3JvdXRlfX19JywgKGNvbnRleHR7eyNkaXJlY3RvcnlfcGFyYW1zLjB9fSx7eyNkaXJlY3RvcnlfcGFyYW1zfX17ey59fSx7ey9kaXJlY3RvcnlfcGFyYW1zfX17ey9kaXJlY3RvcnlfcGFyYW1zLjB9fSkgPT4gYnVpbGR7eyNwYXNjYWxDYXNlfX17e3tuYW1lfX19e3svcGFzY2FsQ2FzZX19SGFuZGxlcih7eyNkaXJlY3RvcnlfcGFyYW1zfX17ey59fSx7ey9kaXJlY3RvcnlfcGFyYW1zfX0pKGNvbnRleHQpKXt7L2RpcmVjdG9yaWVzfX07CiAgcmV0dXJuIHBpcGVsaW5lLmFkZEhhbmRsZXIocm91dGVyKTsKfQp7eyNkaXJlY3Rvcmllc319CkhhbmRsZXIgYnVpbGR7eyNwYXNjYWxDYXNlfX17e3tuYW1lfX19e3svcGFzY2FsQ2FzZX19SGFuZGxlcih7eyNkaXJlY3RvcnlfcGFyYW1zfX1TdHJpbmcge3sufX0se3svZGlyZWN0b3J5X3BhcmFtc319KSB7CiAgZmluYWwgcGlwZWxpbmUgPSBjb25zdCBQaXBlbGluZSgpe3sjbWlkZGxld2FyZS4wfX17eyNtaWRkbGV3YXJlfX0uYWRkTWlkZGxld2FyZSh7eyNzbmFrZUNhc2V9fXt7e25hbWV9fX17ey9zbmFrZUNhc2V9fS5taWRkbGV3YXJlKXt7L21pZGRsZXdhcmV9fXt7L21pZGRsZXdhcmUuMH19OwogIGZpbmFsIHJvdXRlciA9IFJvdXRlcigpCiAgICB7eyNmaWxlc319e3sjd2lsZGNhcmR9fS4ubW91bnQoJ3t7e3JvdXRlfX19JywgKGNvbnRleHQpID0+IHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Lm9uUmVxdWVzdChjb250ZXh0LGNvbnRleHQucmVxdWVzdC51cmwucGF0aCkpe3svd2lsZGNhcmR9fXt7XndpbGRjYXJkfX0uLmFsbCgne3t7cm91dGV9fX0nLCAoY29udGV4dHt7I2ZpbGVfcGFyYW1zLjB9fSx7eyNmaWxlX3BhcmFtc319e3sufX0se3svZmlsZV9wYXJhbXN9fXt7L2ZpbGVfcGFyYW1zLjB9fSkgPT4ge3sjc25ha2VDYXNlfX17e3tuYW1lfX19e3svc25ha2VDYXNlfX0ub25SZXF1ZXN0KGNvbnRleHQse3sjZGlyZWN0b3J5X3BhcmFtc319e3sufX0se3svZGlyZWN0b3J5X3BhcmFtc319e3sjZmlsZV9wYXJhbXN9fXt7Ln19LHt7L2ZpbGVfcGFyYW1zfX0pKXt7L3dpbGRjYXJkfX17ey9maWxlc319OwogIHJldHVybiBwaXBlbGluZS5hZGRIYW5kbGVyKHJvdXRlcik7Cn0Ke3svZGlyZWN0b3JpZXN9fQo=", - "type": "text" + "type": "text", }, { "path": "build/{{#addDockerfile}}Dockerfile{{/addDockerfile}}", "data": "IyBPZmZpY2lhbCBEYXJ0IGltYWdlOiBodHRwczovL2h1Yi5kb2NrZXIuY29tL18vZGFydAojIFNwZWNpZnkgdGhlIERhcnQgU0RLIGJhc2UgaW1hZ2UgdmVyc2lvbiB1c2luZyBkYXJ0Ojx2ZXJzaW9uPiAoZXg6IGRhcnQ6Mi4xNykKRlJPTSBkYXJ0Ont7ZGFydFZlcnNpb259fSBBUyBidWlsZAoKV09SS0RJUiAvYXBwCnt7I2hhc0V4dGVybmFsRGVwZW5kZW5jaWVzfX0KCiMgQ29weSBleHRlcm5hbCBkZXBlbmRlbmNpZXMKQ09QWSAuLy5kYXJ0X2Zyb2dfcGF0aF9kZXBlbmRlbmNpZXMgIC4vLmRhcnRfZnJvZ19wYXRoX2RlcGVuZGVuY2llcwpDT1BZIC4vcHVic3BlY19vdmVycmlkZXMueWFtbCAuL3B1YnNwZWNfb3ZlcnJpZGVzLnlhbWwKe3svaGFzRXh0ZXJuYWxEZXBlbmRlbmNpZXN9fQojIENvcHkgRGVwZW5kZW5jaWVzCnt7I3BhdGhEZXBlbmRlbmNpZXN9fUNPUFkge3t7Ln19fSAuL3t7ey59fX0Ke3svcGF0aERlcGVuZGVuY2llc319Cnt7Xmhhc0V4dGVybmFsRGVwZW5kZW5jaWVzfX0KIyBJbnN0YWxsIERlcGVuZGVuY2llcwp7eyNwYXRoRGVwZW5kZW5jaWVzfX1SVU4gZGFydCBwdWIgZ2V0IC1DIHt7ey59fX0Ke3svcGF0aERlcGVuZGVuY2llc319Cnt7L2hhc0V4dGVybmFsRGVwZW5kZW5jaWVzfX0KIyBSZXNvbHZlIGFwcCBkZXBlbmRlbmNpZXMuCkNPUFkgcHVic3BlYy4qIC4vClJVTiBkYXJ0IHB1YiBnZXQKCiMgQ29weSBhcHAgc291cmNlIGNvZGUgYW5kIEFPVCBjb21waWxlIGl0LgpDT1BZIC4gLgojIEVuc3VyZSBwYWNrYWdlcyBhcmUgc3RpbGwgdXAtdG8tZGF0ZSBpZiBhbnl0aGluZyBoYXMgY2hhbmdlZApSVU4gZGFydCBwdWIgZ2V0IC0tb2ZmbGluZQpSVU4gZGFydCBjb21waWxlIGV4ZSBiaW4vc2VydmVyLmRhcnQgLW8gYmluL3NlcnZlcgoKIyBCdWlsZCBtaW5pbWFsIHNlcnZpbmcgaW1hZ2UgZnJvbSBBT1QtY29tcGlsZWQgYC9zZXJ2ZXJgIGFuZCByZXF1aXJlZCBzeXN0ZW0KIyBsaWJyYXJpZXMgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMgc3RvcmVkIGluIGAvcnVudGltZS9gIGZyb20gdGhlIGJ1aWxkIHN0YWdlLgpGUk9NIHNjcmF0Y2gKQ09QWSAtLWZyb209YnVpbGQgL3J1bnRpbWUvIC8KQ09QWSAtLWZyb209YnVpbGQgL2FwcC9iaW4vc2VydmVyIC9hcHAvYmluLwp7eyNzZXJ2ZVN0YXRpY0ZpbGVzfX1DT1BZIC0tZnJvbT1idWlsZCAvYXBwL3B1YmxpYyAvcHVibGljL3t7L3NlcnZlU3RhdGljRmlsZXN9fQoKIyBTdGFydCBzZXJ2ZXIuCkNNRCBbIi9hcHAvYmluL3NlcnZlciJdCg==", - "type": "text" - } + "type": "text", + }, ], "hooks": [ { "path": "lib/dart_frog_prod_server_hooks.dart", "data": "ZXhwb3J0ICdzcmMvY3JlYXRlX2J1bmRsZS5kYXJ0JzsKZXhwb3J0ICdzcmMvY3JlYXRlX2V4dGVybmFsX3BhY2thZ2VzX2ZvbGRlci5kYXJ0JzsKZXhwb3J0ICdzcmMvZGFydF9wdWJfZ2V0LmRhcnQnOwpleHBvcnQgJ3NyYy9leGl0X292ZXJyaWRlcy5kYXJ0JzsKZXhwb3J0ICdzcmMvZ2V0X2ludGVybmFsX3BhdGhfZGVwZW5kZW5jaWVzLmRhcnQnOwpleHBvcnQgJ3NyYy9nZXRfcHVic3BlY19sb2NrLmRhcnQnOwo=", - "type": "text" + "type": "text", }, { "path": "lib/src/create_bundle.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTppby9pby5kYXJ0JyBzaG93IGNvcHlQYXRoOwppbXBvcnQgJ3BhY2thZ2U6bWFzb24vbWFzb24uZGFydCc7CmltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKCkZ1dHVyZTx2b2lkPiBjcmVhdGVCdW5kbGUoewogIHJlcXVpcmVkIEhvb2tDb250ZXh0IGNvbnRleHQsCiAgcmVxdWlyZWQgaW8uRGlyZWN0b3J5IHByb2plY3REaXJlY3RvcnksCiAgcmVxdWlyZWQgaW8uRGlyZWN0b3J5IGJ1aWxkRGlyZWN0b3J5LAogIHJlcXVpcmVkIHZvaWQgRnVuY3Rpb24oaW50IGV4aXRDb2RlKSBleGl0LAp9KSBhc3luYyB7CiAgZmluYWwgZGFydEZyb2dEaXJlY3RvcnlQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXJlY3RvcnkucGF0aCwgJy5kYXJ0X2Zyb2cnKTsKICBmaW5hbCBkYXJ0RnJvZ0RpcmVjdG9yeSA9IGlvLkRpcmVjdG9yeShkYXJ0RnJvZ0RpcmVjdG9yeVBhdGgpOwogIGZpbmFsIGJ1bmRsaW5nUHJvZ3Jlc3MgPSBjb250ZXh0LmxvZ2dlci5wcm9ncmVzcygnQnVuZGxpbmcgc291cmNlcycpOwogIGZpbmFsIHRlbXBEaXJlY3RvcnkgPSBhd2FpdCBpby5EaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wKCk7CgogIGlmIChidWlsZERpcmVjdG9yeS5leGlzdHNTeW5jKCkpIHsKICAgIGF3YWl0IGJ1aWxkRGlyZWN0b3J5LmRlbGV0ZShyZWN1cnNpdmU6IHRydWUpOwogIH0KCiAgaWYgKGRhcnRGcm9nRGlyZWN0b3J5LmV4aXN0c1N5bmMoKSkgewogICAgYXdhaXQgZGFydEZyb2dEaXJlY3RvcnkuZGVsZXRlKHJlY3Vyc2l2ZTogdHJ1ZSk7CiAgfQoKICB0cnkgewogICAgYXdhaXQgY29weVBhdGgoCiAgICAgIHByb2plY3REaXJlY3RvcnkucGF0aCwKICAgICAgJyR7dGVtcERpcmVjdG9yeS5wYXRofSR7cGF0aC5zZXBhcmF0b3J9JywKICAgICk7CiAgICBidW5kbGluZ1Byb2dyZXNzLmNvbXBsZXRlKCk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGJ1bmRsaW5nUHJvZ3Jlc3MuZmFpbCgpOwogICAgY29udGV4dC5sb2dnZXIuZXJyKCckZXJyb3InKTsKICAgIHJldHVybiBleGl0KDEpOwogIH0KICBhd2FpdCBjb3B5UGF0aCh0ZW1wRGlyZWN0b3J5LnBhdGgsIGJ1aWxkRGlyZWN0b3J5LnBhdGgpOwp9Cg==", - "type": "text" + "type": "text", }, { "path": "lib/src/create_external_packages_folder.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXJfaG9va3MvZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6aW8vaW8uZGFydCcgYXMgaW87CmltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKCi8vLyBTaWduYXR1cmUgb2YgW2lvLmNvcHlQYXRoXS4KdHlwZWRlZiBDb3B5UGF0aCA9IEZ1dHVyZTx2b2lkPiBGdW5jdGlvbihTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKTsKCkZ1dHVyZTxMaXN0PFN0cmluZz4+IGNyZWF0ZUV4dGVybmFsUGFja2FnZXNGb2xkZXIoewogIHJlcXVpcmVkIERpcmVjdG9yeSBwcm9qZWN0RGlyZWN0b3J5LAogIHJlcXVpcmVkIERpcmVjdG9yeSBidWlsZERpcmVjdG9yeSwKICBDb3B5UGF0aCBjb3B5UGF0aCA9IGlvLmNvcHlQYXRoLAp9KSBhc3luYyB7CiAgZmluYWwgcGF0aFJlc29sdmVyID0gcGF0aC5jb250ZXh0OwogIGZpbmFsIHB1YnNwZWNMb2NrID0gYXdhaXQgZ2V0UHVic3BlY0xvY2soCiAgICBwcm9qZWN0RGlyZWN0b3J5LnBhdGgsCiAgICBwYXRoQ29udGV4dDogcGF0aC5jb250ZXh0LAogICk7CgogIGZpbmFsIGV4dGVybmFsUGF0aERlcGVuZGVuY2llcyA9IHB1YnNwZWNMb2NrLnBhY2thZ2VzCiAgICAgIC5tYXAoCiAgICAgICAgKGRlcGVuZGVuY3kpIHsKICAgICAgICAgIGZpbmFsIHBhdGhEZXNjcmlwdGlvbiA9IGRlcGVuZGVuY3kucGF0aERlc2NyaXB0aW9uOwogICAgICAgICAgaWYgKHBhdGhEZXNjcmlwdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQoKICAgICAgICAgIGZpbmFsIGlzRXh0ZXJuYWwgPSAhcGF0aFJlc29sdmVyLmlzV2l0aGluKCcnLCBwYXRoRGVzY3JpcHRpb24ucGF0aCk7CiAgICAgICAgICBpZiAoIWlzRXh0ZXJuYWwpIHJldHVybiBudWxsOwoKICAgICAgICAgIHJldHVybiBfRXh0ZXJuYWxQYXRoRGVwZW5kZW5jeSgKICAgICAgICAgICAgbmFtZTogZGVwZW5kZW5jeS5uYW1lLAogICAgICAgICAgICBwYXRoOiBwYXRoLmpvaW4ocHJvamVjdERpcmVjdG9yeS5wYXRoLCBwYXRoRGVzY3JpcHRpb24ucGF0aCksCiAgICAgICAgICApOwogICAgICAgIH0sCiAgICAgICkKICAgICAgLndoZXJlVHlwZTxfRXh0ZXJuYWxQYXRoRGVwZW5kZW5jeT4oKQogICAgICAudG9MaXN0KCk7CgogIGlmIChleHRlcm5hbFBhdGhEZXBlbmRlbmNpZXMuaXNFbXB0eSkgewogICAgcmV0dXJuIFtdOwogIH0KCiAgZmluYWwgcGFja2FnZXNEaXJlY3RvcnkgPSBEaXJlY3RvcnkoCiAgICBwYXRoUmVzb2x2ZXIuam9pbigKICAgICAgYnVpbGREaXJlY3RvcnkucGF0aCwKICAgICAgJy5kYXJ0X2Zyb2dfcGF0aF9kZXBlbmRlbmNpZXMnLAogICAgKSwKICApLi5jcmVhdGVTeW5jKHJlY3Vyc2l2ZTogdHJ1ZSk7CgogIGZpbmFsIGNvcGllZEV4dGVybmFsUGF0aERlcGVuZGVuY2llcyA9IGF3YWl0IEZ1dHVyZS53YWl0KAogICAgZXh0ZXJuYWxQYXRoRGVwZW5kZW5jaWVzLm1hcCgKICAgICAgKGV4dGVybmFsUGF0aERlcGVuZGVuY3kpID0+IGV4dGVybmFsUGF0aERlcGVuZGVuY3kuY29weVRvKAogICAgICAgIGNvcHlQYXRoOiBjb3B5UGF0aCwKICAgICAgICB0YXJnZXREaXJlY3Rvcnk6IERpcmVjdG9yeSgKICAgICAgICAgIHBhdGhSZXNvbHZlci5qb2luKAogICAgICAgICAgICBwYWNrYWdlc0RpcmVjdG9yeS5wYXRoLAogICAgICAgICAgICBleHRlcm5hbFBhdGhEZXBlbmRlbmN5Lm5hbWUsCiAgICAgICAgICApLAogICAgICAgICksCiAgICAgICksCiAgICApLAogICk7CgogIGF3YWl0IEZpbGUoCiAgICBwYXRoUmVzb2x2ZXIuam9pbigKICAgICAgYnVpbGREaXJlY3RvcnkucGF0aCwKICAgICAgJ3B1YnNwZWNfb3ZlcnJpZGVzLnlhbWwnLAogICAgKSwKICApLndyaXRlQXNTdHJpbmcoJycnCmRlcGVuZGVuY3lfb3ZlcnJpZGVzOgoke2NvcGllZEV4dGVybmFsUGF0aERlcGVuZGVuY2llcy5tYXAoCiAgICAoZGVwZW5kZW5jeSkgewogICAgICBmaW5hbCBuYW1lID0gZGVwZW5kZW5jeS5uYW1lOwogICAgICBmaW5hbCBwYXRoID0KICAgICAgICAgIHBhdGhSZXNvbHZlci5yZWxhdGl2ZShkZXBlbmRlbmN5LnBhdGgsIGZyb206IGJ1aWxkRGlyZWN0b3J5LnBhdGgpOwogICAgICByZXR1cm4gJyAgJG5hbWU6XG4gICAgcGF0aDogJHBhdGgnOwogICAgfSwKICApLmpvaW4oJ1xuJyl9CicnJyk7CgogIHJldHVybiBjb3BpZWRFeHRlcm5hbFBhdGhEZXBlbmRlbmNpZXMKICAgICAgLm1hcCgoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5wYXRoKQogICAgICAudG9MaXN0KCk7Cn0KCi8vLyB7QHRlbXBsYXRlIGV4dGVybmFsX3BhdGhfZGVwZW5kZW5jeX0KLy8vIEEgcGF0aCBkZXBlbmRlbmN5IHRoYXQgaXMgbm90IHdpdGhpbiB0aGUgYnVuZGxlZCBEYXJ0IEZyb2cgcHJvamVjdAovLy8gZGlyZWN0b3J5LgovLy8KLy8vIEZvciBleGFtcGxlOgovLy8gYGBgeWFtbAovLy8gbmFtZTogbXlfZGFydF9mcm9nX3Byb2plY3QKLy8vIGRlcGVuZGVuY2llczoKLy8vICAgbXlfcGFja2FnZToKLy8vICAgICBwYXRoOiAuLi9teV9wYWNrYWdlCi8vLyBgYGAKLy8vIHtAZW5kdGVtcGxhdGV9CmNsYXNzIF9FeHRlcm5hbFBhdGhEZXBlbmRlbmN5IHsKICAvLy8ge0BtYWNybyBleHRlcm5hbF9wYXRoX2RlcGVuZGVuY3l9CiAgY29uc3QgX0V4dGVybmFsUGF0aERlcGVuZGVuY3koewogICAgcmVxdWlyZWQgdGhpcy5uYW1lLAogICAgcmVxdWlyZWQgdGhpcy5wYXRoLAogIH0pOwoKICAvLy8gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UuCiAgZmluYWwgU3RyaW5nIG5hbWU7CgogIC8vLyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcGFja2FnZS4KICBmaW5hbCBTdHJpbmcgcGF0aDsKCiAgLy8vIENvcGllcyB0aGUgW19FeHRlcm5hbFBhdGhEZXBlbmRlbmN5XSB0byBbdGFyZ2V0RGlyZWN0b3J5XS4KICBGdXR1cmU8X0V4dGVybmFsUGF0aERlcGVuZGVuY3k+IGNvcHlUbyh7CiAgICByZXF1aXJlZCBEaXJlY3RvcnkgdGFyZ2V0RGlyZWN0b3J5LAogICAgQ29weVBhdGggY29weVBhdGggPSBpby5jb3B5UGF0aCwKICB9KSBhc3luYyB7CiAgICBhd2FpdCBjb3B5UGF0aChwYXRoLCB0YXJnZXREaXJlY3RvcnkucGF0aCk7CiAgICByZXR1cm4gX0V4dGVybmFsUGF0aERlcGVuZGVuY3kobmFtZTogbmFtZSwgcGF0aDogdGFyZ2V0RGlyZWN0b3J5LnBhdGgpOwogIH0KfQo=", - "type": "text" + "type": "text", }, { "path": "lib/src/dart_pub_get.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JzsKCnR5cGVkZWYgUHJvY2Vzc1J1bm5lciA9IEZ1dHVyZTxpby5Qcm9jZXNzUmVzdWx0PiBGdW5jdGlvbigKICBTdHJpbmcgZXhlY3V0YWJsZSwKICBMaXN0PFN0cmluZz4gYXJndW1lbnRzLCB7CiAgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksCiAgYm9vbCBydW5JblNoZWxsLAp9KTsKCkZ1dHVyZTx2b2lkPiBkYXJ0UHViR2V0KAogIEhvb2tDb250ZXh0IGNvbnRleHQsIHsKICByZXF1aXJlZCBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSwKICByZXF1aXJlZCBQcm9jZXNzUnVubmVyIHJ1blByb2Nlc3MsCiAgcmVxdWlyZWQgdm9pZCBGdW5jdGlvbihpbnQgZXhpdENvZGUpIGV4aXQsCn0pIGFzeW5jIHsKICBmaW5hbCBwcm9ncmVzcyA9IGNvbnRleHQubG9nZ2VyLnByb2dyZXNzKCdJbnN0YWxsaW5nIGRlcGVuZGVuY2llcycpOwogIHRyeSB7CiAgICBmaW5hbCByZXN1bHQgPSBhd2FpdCBydW5Qcm9jZXNzKAogICAgICAnZGFydCcsCiAgICAgIFsncHViJywgJ2dldCddLAogICAgICB3b3JraW5nRGlyZWN0b3J5OiB3b3JraW5nRGlyZWN0b3J5LAogICAgICBydW5JblNoZWxsOiB0cnVlLAogICAgKTsKICAgIHByb2dyZXNzLmNvbXBsZXRlKCk7CgogICAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPSAwKSB7CiAgICAgIGNvbnRleHQubG9nZ2VyLmVycignJHtyZXN1bHQuc3RkZXJyfScpOwogICAgICByZXR1cm4gZXhpdChyZXN1bHQuZXhpdENvZGUpOwogICAgfQogIH0gb24gaW8uUHJvY2Vzc0V4Y2VwdGlvbiBjYXRjaCAoZXJyb3IpIHsKICAgIGNvbnRleHQubG9nZ2VyLmVycihlcnJvci5tZXNzYWdlKTsKICAgIHJldHVybiBleGl0KGVycm9yLmVycm9yQ29kZSk7CiAgfQp9Cg==", - "type": "text" + "type": "text", }, { "path": "lib/src/exit_overrides.dart", "data": "aW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmNvbnN0IF9hc3luY1J1blpvbmVkID0gcnVuWm9uZWQ7CgphYnN0cmFjdCBjbGFzcyBFeGl0T3ZlcnJpZGVzIHsKICBzdGF0aWMgZmluYWwgX3Rva2VuID0gT2JqZWN0KCk7CgogIHN0YXRpYyBFeGl0T3ZlcnJpZGVzPyBnZXQgY3VycmVudCB7CiAgICByZXR1cm4gWm9uZS5jdXJyZW50W190b2tlbl0gYXMgRXhpdE92ZXJyaWRlcz87CiAgfQoKICBzdGF0aWMgUiBydW5ab25lZDxSPihSIEZ1bmN0aW9uKCkgYm9keSwge3ZvaWQgRnVuY3Rpb24oaW50KT8gZXhpdH0pIHsKICAgIGZpbmFsIG92ZXJyaWRlcyA9IF9FeGl0T3ZlcnJpZGVzU2NvcGUoZXhpdCk7CiAgICByZXR1cm4gX2FzeW5jUnVuWm9uZWQoYm9keSwgem9uZVZhbHVlczoge190b2tlbjogb3ZlcnJpZGVzfSk7CiAgfQoKICB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZ2V0IGV4aXQgPT4gaW8uZXhpdDsKfQoKY2xhc3MgX0V4aXRPdmVycmlkZXNTY29wZSBleHRlbmRzIEV4aXRPdmVycmlkZXMgewogIF9FeGl0T3ZlcnJpZGVzU2NvcGUodGhpcy5fZXhpdCk7CgogIGZpbmFsIEV4aXRPdmVycmlkZXM/IF9wcmV2aW91cyA9IEV4aXRPdmVycmlkZXMuY3VycmVudDsKICBmaW5hbCB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSk/IF9leGl0OwoKICBAb3ZlcnJpZGUKICB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZ2V0IGV4aXQgewogICAgcmV0dXJuIF9leGl0ID8/IF9wcmV2aW91cz8uZXhpdCA/PyBzdXBlci5leGl0OwogIH0KfQo=", - "type": "text" + "type": "text", }, { "path": "lib/src/get_internal_path_dependencies.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXJfaG9va3MvZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CgpGdXR1cmU8TGlzdDxTdHJpbmc+PiBnZXRJbnRlcm5hbFBhdGhEZXBlbmRlbmNpZXMoaW8uRGlyZWN0b3J5IGRpcmVjdG9yeSkgYXN5bmMgewogIGZpbmFsIHB1YnNwZWNMb2NrID0gYXdhaXQgZ2V0UHVic3BlY0xvY2soZGlyZWN0b3J5LnBhdGgpOwoKICBmaW5hbCBpbnRlcm5hbFBhdGhEZXBlbmRlbmNpZXMgPSBwdWJzcGVjTG9jay5wYWNrYWdlcy53aGVyZSgKICAgIChkZXBlbmRlbmN5KSB7CiAgICAgIGZpbmFsIHBhdGhEZXNjcmlwdGlvbiA9IGRlcGVuZGVuY3kucGF0aERlc2NyaXB0aW9uOwogICAgICBpZiAocGF0aERlc2NyaXB0aW9uID09IG51bGwpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIHJldHVybiBwYXRoLmlzV2l0aGluKCcnLCBwYXRoRGVzY3JpcHRpb24ucGF0aCk7CiAgICB9LAogICk7CgogIHJldHVybiBpbnRlcm5hbFBhdGhEZXBlbmRlbmNpZXMKICAgICAgLm1hcCgoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5wYXRoRGVzY3JpcHRpb24hLnBhdGgpCiAgICAgIC50b0xpc3QoKTsKfQo=", - "type": "text" + "type": "text", }, { "path": "lib/src/get_pubspec_lock.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXJfaG9va3Mvc3JjL3B1YnNwZWNfbG9jay9wdWJzcGVjX2xvY2suZGFydCc7CmltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKCkZ1dHVyZTxQdWJzcGVjTG9jaz4gZ2V0UHVic3BlY0xvY2soCiAgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnksIHsKICBwYXRoLkNvbnRleHQ/IHBhdGhDb250ZXh0LAp9KSBhc3luYyB7CiAgZmluYWwgcGF0aFJlc29sdmVyID0gcGF0aENvbnRleHQgPz8gcGF0aC5jb250ZXh0OwogIGZpbmFsIHB1YnNwZWNMb2NrRmlsZSA9IEZpbGUoCiAgICB3b3JraW5nRGlyZWN0b3J5LmlzRW1wdHkKICAgICAgICA/ICdwdWJzcGVjLmxvY2snCiAgICAgICAgOiBwYXRoUmVzb2x2ZXIuam9pbih3b3JraW5nRGlyZWN0b3J5LCAncHVic3BlYy5sb2NrJyksCiAgKTsKCiAgZmluYWwgY29udGVudCA9IGF3YWl0IHB1YnNwZWNMb2NrRmlsZS5yZWFkQXNTdHJpbmcoKTsKICByZXR1cm4gUHVic3BlY0xvY2suZnJvbVN0cmluZyhjb250ZW50KTsKfQo=", - "type": "text" + "type": "text", }, { "path": "lib/src/pubspec_lock/pubspec_lock.dart", "data": "Ly8vIEEgc2ltcGxlIHBhcnNlciBmb3IgcHVic3BlYy5sb2NrIGZpbGVzLgovLy8KLy8vIFRoaXMgaXMgdXNlZCBieSB0aGUgYnVuZGxpbmcgcHJvY2VzcyB0byBjaGVjayBmb3IgdGhvc2UgZGVwZW5kZW5jaWVzIHRoYXQKLy8vIGFyZSBleHRlcm5hbCBwYXRoIGRlcGVuZGVuY2llcy4gSGVuY2UsIGl0IGlzIG5vdCBhIGNvbXBsZXRlIHBhcnNlciwgaXQgb25seQovLy8gcGFyc2VzIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIG5lZWRlZCBmb3IgdGhlIGJ1bmRsaW5nIHByb2Nlc3MuCmxpYnJhcnkgcHVic3BlY19sb2NrOwoKaW1wb3J0ICdkYXJ0OmNvbGxlY3Rpb24nOwoKaW1wb3J0ICdwYWNrYWdlOmVxdWF0YWJsZS9lcXVhdGFibGUuZGFydCc7CmltcG9ydCAncGFja2FnZTp5YW1sL3lhbWwuZGFydCc7CgovLy8ge0B0ZW1wbGF0ZSBwdWJzcGVjX2xvY2tfcGFyc2VfZXhjZXB0aW9ufQovLy8gVGhyb3duIHdoZW4gYSBbUHVic3BlY0xvY2tdIGZhaWxzIHRvIHBhcnNlLgovLy8ge0BlbmR0ZW1wbGF0ZX0KY2xhc3MgUHVic3BlY0xvY2tQYXJzZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbiB7CiAgLy8vIHtAbWFjcm8gcHVic3BlY19sb2NrX3BhcnNlX2V4Y2VwdGlvbn0KICBjb25zdCBQdWJzcGVjTG9ja1BhcnNlRXhjZXB0aW9uKCk7Cn0KCi8vLyBBIHJlcHJlc2VudGF0aW9uIG9mIGEgcHVic3BlYy5sb2NrIGZpbGUuCmNsYXNzIFB1YnNwZWNMb2NrIHsKICBjb25zdCBQdWJzcGVjTG9jay5fKHsKICAgIHJlcXVpcmVkIHRoaXMucGFja2FnZXMsCiAgfSk7CgogIC8vLyBQYXJzZXMgYSBbUHVic3BlY0xvY2tdIGZyb20gYSBzdHJpbmcuCiAgLy8vCiAgLy8vIElmIG5vIHBhY2thZ2VzIGFyZSBmb3VuZCwgYW4gZW1wdHkgW1B1YnNwZWNMb2NrXSBpcyByZXR1cm5lZC4gVGhvc2UKICAvLy8gcGFja2FnZXMgZW50cmllcyB0aGF0IGNhbm5vdCBiZSBwYXJzZWQgYXJlIGlnbm9yZWQuCiAgLy8vCiAgLy8vIEl0IHRocm93cyBhIFtQdWJzcGVjTG9ja1BhcnNlRXhjZXB0aW9uXSBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBwYXJzZWQKICAvLy8gYXMgYSBbWWFtbE1hcF0uCiAgZmFjdG9yeSBQdWJzcGVjTG9jay5mcm9tU3RyaW5nKFN0cmluZyBjb250ZW50KSB7CiAgICBsYXRlIGZpbmFsIFlhbWxNYXAgeWFtbDsKICAgIHRyeSB7CiAgICAgIHlhbWwgPSBsb2FkWWFtbChjb250ZW50KSBhcyBZYW1sTWFwOwogICAgfSBjYXRjaCAoXykgewogICAgICB0aHJvdyBjb25zdCBQdWJzcGVjTG9ja1BhcnNlRXhjZXB0aW9uKCk7CiAgICB9CgogICAgaWYgKCF5YW1sLmNvbnRhaW5zS2V5KCdwYWNrYWdlcycpKSB7CiAgICAgIHJldHVybiBQdWJzcGVjTG9jay5lbXB0eTsKICAgIH0KCiAgICBmaW5hbCBwYWNrYWdlcyA9IHlhbWxbJ3BhY2thZ2VzJ10gYXMgWWFtbE1hcDsKCiAgICBmaW5hbCBwYXJzZWRQYWNrYWdlcyA9IDxQdWJzcGVjTG9ja1BhY2thZ2U+W107CiAgICBmb3IgKGZpbmFsIGVudHJ5IGluIHBhY2thZ2VzLmVudHJpZXMpIHsKICAgICAgdHJ5IHsKICAgICAgICBmaW5hbCBwYWNrYWdlID0gUHVic3BlY0xvY2tQYWNrYWdlLmZyb21ZYW1sTWFwKAogICAgICAgICAgbmFtZTogZW50cnkua2V5IGFzIFN0cmluZywKICAgICAgICAgIGRhdGE6IGVudHJ5LnZhbHVlIGFzIFlhbWxNYXAsCiAgICAgICAgKTsKICAgICAgICBwYXJzZWRQYWNrYWdlcy5hZGQocGFja2FnZSk7CiAgICAgIH0gY2F0Y2ggKF8pIHsKICAgICAgICAvLyBJZ25vcmUgdGhvc2UgcGFja2FnZXMgdGhhdCBmb3Igc29tZSByZWFzb24gY2Fubm90IGJlIHBhcnNlZC4KICAgICAgfQogICAgfQoKICAgIHJldHVybiBQdWJzcGVjTG9jay5fKAogICAgICBwYWNrYWdlczogVW5tb2RpZmlhYmxlTGlzdFZpZXcocGFyc2VkUGFja2FnZXMpLAogICAgKTsKICB9CgogIC8vLyBBbiBlbXB0eSBbUHVic3BlY0xvY2tdLgogIHN0YXRpYyBQdWJzcGVjTG9jayBlbXB0eSA9IFB1YnNwZWNMb2NrLl8oCiAgICBwYWNrYWdlczogVW5tb2RpZmlhYmxlTGlzdFZpZXcoW10pLAogICk7CgogIC8vLyBBbGwgdGhlIGRlcGVuZGVuY2llcyBpbiB0aGUgcHVic3BlYy5sb2NrIGZpbGUuCiAgZmluYWwgVW5tb2RpZmlhYmxlTGlzdFZpZXc8UHVic3BlY0xvY2tQYWNrYWdlPiBwYWNrYWdlczsKfQoKLy8vIHtAdGVtcGxhdGUgcHVic3BlY19sb2NrX2RlcGVuZGVuY3l9Ci8vLyBBIHJlcHJlc2VudGF0aW9uIG9mIGEgZGVwZW5kZW5jeSBpbiBhIHB1YnNwZWMubG9jayBmaWxlLgovLy8ge0BlbmR0ZW1wbGF0ZX0KY2xhc3MgUHVic3BlY0xvY2tQYWNrYWdlIGV4dGVuZHMgRXF1YXRhYmxlIHsKICAvLy8ge0BtYWNybyBwdWJzcGVjX2xvY2tfZGVwZW5kZW5jeX0KICBjb25zdCBQdWJzcGVjTG9ja1BhY2thZ2UoewogICAgcmVxdWlyZWQgdGhpcy5uYW1lLAogICAgcmVxdWlyZWQgdGhpcy50eXBlLAogICAgdGhpcy5wYXRoRGVzY3JpcHRpb24sCiAgfSk7CgogIC8vLyBQYXJzZXMgYSBbUHVic3BlY0xvY2tQYWNrYWdlXSBmcm9tIGEgW1lhbWxNYXBdLgogIGZhY3RvcnkgUHVic3BlY0xvY2tQYWNrYWdlLmZyb21ZYW1sTWFwKHsKICAgIHJlcXVpcmVkIFN0cmluZyBuYW1lLAogICAgcmVxdWlyZWQgWWFtbE1hcCBkYXRhLAogIH0pIHsKICAgIGZpbmFsIGRlcGVuZGVuY3kgPSBkYXRhWydkZXBlbmRlbmN5J10gYXMgU3RyaW5nOwogICAgZmluYWwgZGVwZW5kZW5jeVR5cGUgPSBQdWJzcGVjTG9ja1BhY2thZ2VEZXBlbmRlbmN5VHlwZS5wYXJzZShkZXBlbmRlbmN5KTsKCiAgICBmaW5hbCBkZXNjcmlwdGlvbiA9IGRhdGFbJ2Rlc2NyaXB0aW9uJ10gYXMgWWFtbE1hcD87CiAgICBmaW5hbCBwYXRoRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiAhPSBudWxsCiAgICAgICAgPyBQdWJzcGVjUGFja2FnZVBhdGhEZXNjcmlwdGlvbi50cnlQYXJzZShkZXNjcmlwdGlvbikKICAgICAgICA6IG51bGw7CgogICAgcmV0dXJuIFB1YnNwZWNMb2NrUGFja2FnZSgKICAgICAgbmFtZTogbmFtZSwKICAgICAgdHlwZTogZGVwZW5kZW5jeVR5cGUsCiAgICAgIHBhdGhEZXNjcmlwdGlvbjogcGF0aERlc2NyaXB0aW9uLAogICAgKTsKICB9CgogIC8vLyBUaGUgbmFtZSBvZiB0aGUgZGVwZW5kZW5jeS4KICBmaW5hbCBTdHJpbmcgbmFtZTsKCiAgLy8vIHtAbWFjcm8gcHVic3BlY19sb2NrX2RlcGVuZGVuY3lfdHlwZX0KICBmaW5hbCBQdWJzcGVjTG9ja1BhY2thZ2VEZXBlbmRlbmN5VHlwZSB0eXBlOwoKICAvLy8ge0BtYWNybyBwdWJzcGVjX3BhY2thZ2VfcGF0aF9kZXNjcmlwdGlvbn0KICBmaW5hbCBQdWJzcGVjUGFja2FnZVBhdGhEZXNjcmlwdGlvbj8gcGF0aERlc2NyaXB0aW9uOwoKICBAb3ZlcnJpZGUKICBMaXN0PE9iamVjdD8+IGdldCBwcm9wcyA9PiBbbmFtZSwgdHlwZSwgcGF0aERlc2NyaXB0aW9uXTsKfQoKLy8vIHtAdGVtcGxhdGUgcHVic3BlY19sb2NrX2RlcGVuZGVuY3lfdHlwZX0KLy8vIFRoZSB0eXBlIG9mIGEgW1B1YnNwZWNMb2NrUGFja2FnZV0uCi8vLyB7QGVuZHRlbXBsYXRlfQplbnVtIFB1YnNwZWNMb2NrUGFja2FnZURlcGVuZGVuY3lUeXBlIHsKICAvLy8gQW5vdGhlciBwYWNrYWdlIHRoYXQgeW91ciBwYWNrYWdlIG5lZWRzIHRvIHdvcmsuCiAgLy8vCiAgLy8vIFNlZSBhbHNvOgogIC8vLwogIC8vLyAqIFtEYXJ0J3MgZGVwZW5kZW5jeSBkb2N1bWVudGF0aW9uXShodHRwczovL2RhcnQuZGV2L3Rvb2xzL3B1Yi9kZXBlbmRlbmNpZXMpCiAgZGlyZWN0TWFpbi5fKCdkaXJlY3QgbWFpbicpLAoKICAvLy8gQW5vdGhlciBwYWNrYWdlIHRoYXQgeW91ciBwYWNrYWdlIG5lZWRzIGR1cmluZyBkZXZlbG9wbWVudC4KICAvLy8KICAvLy8gU2VlIGFsc286CiAgLy8vCiAgLy8vICogW0RhcnQncyBkZXZlbG9wZXIgZGVwZW5kZW5jeSBkb2N1bWVudGF0aW9uXShodHRwczovL2RhcnQuZGV2L3Rvb2xzL3B1Yi9kZXBlbmRlbmNpZXMjZGV2LWRlcGVuZGVuY2llcykKICBkaXJlY3REZXYuXygnZGlyZWN0IGRldicpLAoKICAvLy8gQSBkZXBlbmRlbmN5IHRoYXQgeW91ciBwYWNrYWdlIGluZGlyZWN0bHkgdXNlcyBiZWNhdXNlIG9uZSBvZiBpdHMKICAvLy8gZGVwZW5kZW5jaWVzIHJlcXVpcmVzIGl0LgogIC8vLwogIC8vLyBTZWUgYWxzbzoKICAvLy8KICAvLy8gKiBbRGFydCdzIHRyYW5zaXRpdmUgZGVwZW5kZW5jeSBkb2N1bWVudGF0aW9uXShodHRwczovL2RhcnQuZGV2L3Rvb2xzL3B1Yi9nbG9zc2FyeSN0cmFuc2l0aXZlLSkKICB0cmFuc2l0aXZlLl8oJ3RyYW5zaXRpdmUnKSwKCiAgLy8vICBBIGRlcGVuZGVuY3kgdGhhdCB5b3VyIHBhY2thZ2Ugb3ZlcnJpZGVzIHRoYXQgaXMgbm90IGFscmVhZHkgYQogIC8vLyBgZGlyZWN0IG1haW5gIG9yIGBkaXJlY3QgZGV2YCBkZXBlbmRlbmN5LgogIC8vLwogIC8vLyBTZWUgYWxzbzoKICAvLy8KICAvLy8gKiBbRGFydCdzIGRlcGVuZGVuY3kgb3ZlcnJpZGUgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kYXJ0LmRldi90b29scy9wdWIvZGVwZW5kZW5jaWVzI2RlcGVuZGVuY3ktb3ZlcnJpZGVzKQogIGRpcmVjdE92ZXJyaWRkZW4uXygnZGlyZWN0IG92ZXJyaWRkZW4nKTsKCiAgY29uc3QgUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUuXyh0aGlzLnZhbHVlKTsKCiAgLy8vIFBhcnNlcyBhIFtQdWJzcGVjTG9ja1BhY2thZ2VEZXBlbmRlbmN5VHlwZV0gZnJvbSBhIHN0cmluZy4KICAvLy8KICAvLy8gVGhyb3dzIGFuIFtBcmd1bWVudEVycm9yXSBpZiB0aGUgc3RyaW5nIGlzIG5vdCBhIHZhbGlkIGRlcGVuZGVuY3kgdHlwZS4KICBmYWN0b3J5IFB1YnNwZWNMb2NrUGFja2FnZURlcGVuZGVuY3lUeXBlLnBhcnNlKFN0cmluZyB2YWx1ZSkgewogICAgaWYgKF92YWx1ZU1hcC5jb250YWluc0tleSh2YWx1ZSkpIHsKICAgICAgcmV0dXJuIF92YWx1ZU1hcFt2YWx1ZV0hOwogICAgfQoKICAgIHRocm93IEFyZ3VtZW50RXJyb3IudmFsdWUoCiAgICAgIHZhbHVlLAogICAgICAndmFsdWUnLAogICAgICAnSW52YWxpZCBQdWJzcGVjTG9ja1BhY2thZ2VEZXBlbmRlbmN5VHlwZSB2YWx1ZS4nLAogICAgKTsKICB9CgogIHN0YXRpYyBNYXA8U3RyaW5nLCBQdWJzcGVjTG9ja1BhY2thZ2VEZXBlbmRlbmN5VHlwZT4gX3ZhbHVlTWFwID0gewogICAgZm9yIChmaW5hbCB0eXBlIGluIFB1YnNwZWNMb2NrUGFja2FnZURlcGVuZGVuY3lUeXBlLnZhbHVlcykKICAgICAgdHlwZS52YWx1ZTogdHlwZSwKICB9OwoKICAvLy8gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgW1B1YnNwZWNMb2NrUGFja2FnZURlcGVuZGVuY3lUeXBlXQogIC8vLyBhcyBpdCBhcHBlYXJzIGluIGEgcHVic3BlYy5sb2NrIGZpbGUuCiAgZmluYWwgU3RyaW5nIHZhbHVlOwp9CgovLy8ge0B0ZW1wbGF0ZSBwdWJzcGVjX3BhY2thZ2VfcGF0aF9kZXNjcmlwdGlvbn0KLy8vIFRoZSBkZXNjcmlwdGlvbiBvZiBhIHBhdGggZGVwZW5kZW5jeSBpbiBhIHB1YnNwZWMubG9jayBmaWxlLgovLy8KLy8vIEZvciBleGFtcGxlLCBpbjoKLy8vIGBgYHlhbWwKLy8vIG15X3BhY2thZ2U6Ci8vLyAgIGRlcGVuZGVuY3k6ICJkaXJlY3QgbWFpbiIKLy8vICAgZGVzY3JpcHRpb246Ci8vLyAgICAgcGF0aDogInBhY2thZ2VzL215X3BhY2thZ2UiCi8vLyAgICAgcmVsYXRpdmU6IHRydWUKLy8vICAgc291cmNlOiBwYXRoCi8vLyAgIHZlcnNpb246ICIxLjAuMCsxIgovLy8gYGBgCi8vLwovLy8gVGhlIGRlc2NyaXB0aW9uIGlzOgovLy8gYGBgeWFtbAovLy8gcGF0aDogInBhY2thZ2VzL215X3BhY2thZ2UiCi8vLyByZWxhdGl2ZTogdHJ1ZQovLy8gYGBgCi8vLwovLy8gU2VlIGFsc286Ci8vLwovLy8gKiBbUHVic3BlY1BhY2thZ2VQYXRoRGVzY3JpcHRpb24udHJ5UGFyc2VdLCB3aGljaCBhdHRlbXB0cyB0byBwYXJzZXMgYQovLy8gW1lhbWxNYXBdIGludG8gYSBbUHVic3BlY1BhY2thZ2VQYXRoRGVzY3JpcHRpb25dLgovLy8ge0BlbmR0ZW1wbGF0ZX0KY2xhc3MgUHVic3BlY1BhY2thZ2VQYXRoRGVzY3JpcHRpb24gZXh0ZW5kcyBFcXVhdGFibGUgewogIGNvbnN0IFB1YnNwZWNQYWNrYWdlUGF0aERlc2NyaXB0aW9uKHsKICAgIHJlcXVpcmVkIHRoaXMucGF0aCwKICAgIHJlcXVpcmVkIHRoaXMucmVsYXRpdmUsCiAgfSk7CgogIC8vLyBBdHRlbXB0cyB0byBwYXJzZSBhIFtZYW1sTWFwXSBpbnRvIGEgW1B1YnNwZWNQYWNrYWdlUGF0aERlc2NyaXB0aW9uXS4KICAvLy8KICAvLy8gUmV0dXJucyBgbnVsbGAgaWYgdGhlIFtZYW1sTWFwXSBkb2VzIG5vdCBjb250YWluIHRoZSByZXF1aXJlZCBkYXRhCiAgLy8vIHRvIGNyZWF0ZSBhIFtQdWJzcGVjUGFja2FnZVBhdGhEZXNjcmlwdGlvbl0uCiAgc3RhdGljIFB1YnNwZWNQYWNrYWdlUGF0aERlc2NyaXB0aW9uPyB0cnlQYXJzZShZYW1sTWFwIGRhdGEpIHsKICAgIGlmICgoIWRhdGEuY29udGFpbnNLZXkoJ3BhdGgnKSB8fCBkYXRhWydwYXRoJ10gaXMhIFN0cmluZykgfHwKICAgICAgICAoIWRhdGEuY29udGFpbnNLZXkoJ3JlbGF0aXZlJykgfHwgZGF0YVsncmVsYXRpdmUnXSBpcyEgYm9vbCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZmluYWwgcGF0aCA9IGRhdGFbJ3BhdGgnXSBhcyBTdHJpbmc7CiAgICBmaW5hbCByZWxhdGl2ZSA9IGRhdGFbJ3JlbGF0aXZlJ10gYXMgYm9vbDsKCiAgICByZXR1cm4gUHVic3BlY1BhY2thZ2VQYXRoRGVzY3JpcHRpb24oCiAgICAgIHBhdGg6IHBhdGgsCiAgICAgIHJlbGF0aXZlOiByZWxhdGl2ZSwKICAgICk7CiAgfQoKICBmaW5hbCBTdHJpbmcgcGF0aDsKICBmaW5hbCBib29sIHJlbGF0aXZlOwoKICBAb3ZlcnJpZGUKICBMaXN0PE9iamVjdD8+IGdldCBwcm9wcyA9PiBbcGF0aCwgcmVsYXRpdmVdOwp9Cg==", - "type": "text" + "type": "text", }, { "path": "post_gen.dart", "data": "aW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXJfaG9va3MvZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6bWFzb24vbWFzb24uZGFydCcgc2hvdyBIb29rQ29udGV4dCwgbGlnaHRDeWFuOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7Cgp2b2lkIF9kZWZhdWx0RXhpdChpbnQgY29kZSkgPT4gRXhpdE92ZXJyaWRlcy5jdXJyZW50Py5leGl0ID8/IGlvLmV4aXQ7CgpGdXR1cmU8dm9pZD4gcnVuKEhvb2tDb250ZXh0IGNvbnRleHQpID0+IHBvc3RHZW4oY29udGV4dCk7CgpGdXR1cmU8dm9pZD4gcG9zdEdlbigKICBIb29rQ29udGV4dCBjb250ZXh0LCB7CiAgaW8uRGlyZWN0b3J5PyBkaXJlY3RvcnksCiAgUHJvY2Vzc1J1bm5lciBydW5Qcm9jZXNzID0gaW8uUHJvY2Vzcy5ydW4sCiAgdm9pZCBGdW5jdGlvbihpbnQgZXhpdENvZGUpIGV4aXQgPSBfZGVmYXVsdEV4aXQsCn0pIGFzeW5jIHsKICBmaW5hbCBwcm9qZWN0RGlyZWN0b3J5ID0gZGlyZWN0b3J5ID8/IGlvLkRpcmVjdG9yeS5jdXJyZW50OwogIGZpbmFsIGJ1aWxkRGlyZWN0b3J5UGF0aCA9IHBhdGguam9pbihwcm9qZWN0RGlyZWN0b3J5LnBhdGgsICdidWlsZCcpOwoKICBhd2FpdCBkYXJ0UHViR2V0KAogICAgY29udGV4dCwKICAgIHdvcmtpbmdEaXJlY3Rvcnk6IGJ1aWxkRGlyZWN0b3J5UGF0aCwKICAgIHJ1blByb2Nlc3M6IHJ1blByb2Nlc3MsCiAgICBleGl0OiBleGl0LAogICk7CgogIGZpbmFsIHJlbGF0aXZlQnVpbGRQYXRoID0gcGF0aC5yZWxhdGl2ZShidWlsZERpcmVjdG9yeVBhdGgpOwogIGNvbnRleHQubG9nZ2VyCiAgICAuLmluZm8oJycpCiAgICAuLnN1Y2Nlc3MoJ0NyZWF0ZWQgYSBwcm9kdWN0aW9uIGJ1aWxkIScpCiAgICAuLmluZm8oJycpCiAgICAuLmluZm8oJ1N0YXJ0IHRoZSBwcm9kdWN0aW9uIHNlcnZlciBieSBydW5uaW5nOicpCiAgICAuLmluZm8oJycpCiAgICAuLmluZm8oCiAgICAgICcnJyR7bGlnaHRDeWFuLndyYXAoJ2RhcnQgJHtwYXRoLmpvaW4ocmVsYXRpdmVCdWlsZFBhdGgsICdiaW4nLCAnc2VydmVyLmRhcnQnKX0nKX0nJycsCiAgICApOwp9Cg==", - "type": "text" + "type": "text", }, { "path": "pre_gen.dart", "data": "aW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfZ2VuL2RhcnRfZnJvZ19nZW4uZGFydCc7CmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXJfaG9va3MvZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6aW8vaW8uZGFydCcgYXMgaW9fZXhwYW5kZWQ7CmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JwogICAgc2hvdyBIb29rQ29udGV4dCwgZGVmYXVsdEZvcmVncm91bmQsIGxpZ2h0Q3lhbjsKaW1wb3J0ICdwYWNrYWdlOnBhdGgvcGF0aC5kYXJ0JyBhcyBwYXRoOwoKdHlwZWRlZiBSb3V0ZUNvbmZpZ3VyYXRpb25CdWlsZGVyID0gUm91dGVDb25maWd1cmF0aW9uIEZ1bmN0aW9uKAogIGlvLkRpcmVjdG9yeSBkaXJlY3RvcnksCik7Cgp2b2lkIF9kZWZhdWx0RXhpdChpbnQgY29kZSkgPT4gRXhpdE92ZXJyaWRlcy5jdXJyZW50Py5leGl0ID8/IGlvLmV4aXQ7CgpGdXR1cmU8dm9pZD4gcnVuKEhvb2tDb250ZXh0IGNvbnRleHQpID0+IHByZUdlbihjb250ZXh0KTsKCkZ1dHVyZTx2b2lkPiBwcmVHZW4oCiAgSG9va0NvbnRleHQgY29udGV4dCwgewogIGlvLkRpcmVjdG9yeT8gZGlyZWN0b3J5LAogIFByb2Nlc3NSdW5uZXIgcnVuUHJvY2VzcyA9IGlvLlByb2Nlc3MucnVuLAogIFJvdXRlQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRDb25maWd1cmF0aW9uID0gYnVpbGRSb3V0ZUNvbmZpZ3VyYXRpb24sCiAgdm9pZCBGdW5jdGlvbihpbnQgZXhpdENvZGUpIGV4aXQgPSBfZGVmYXVsdEV4aXQsCiAgRnV0dXJlPHZvaWQ+IEZ1bmN0aW9uKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIGNvcHlQYXRoID0gaW9fZXhwYW5kZWQuY29weVBhdGgsCn0pIGFzeW5jIHsKICBmaW5hbCBwcm9qZWN0RGlyZWN0b3J5ID0gZGlyZWN0b3J5ID8/IGlvLkRpcmVjdG9yeS5jdXJyZW50OwoKICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBwdWJzcGVjLmxvY2sgZmlsZSBpcyB1cCB0byBkYXRlCiAgYXdhaXQgZGFydFB1YkdldCgKICAgIGNvbnRleHQsCiAgICB3b3JraW5nRGlyZWN0b3J5OiBwcm9qZWN0RGlyZWN0b3J5LnBhdGgsCiAgICBydW5Qcm9jZXNzOiBydW5Qcm9jZXNzLAogICAgZXhpdDogZXhpdCwKICApOwoKICBmaW5hbCBidWlsZERpcmVjdG9yeSA9IGlvLkRpcmVjdG9yeSgKICAgIHBhdGguam9pbihwcm9qZWN0RGlyZWN0b3J5LnBhdGgsICdidWlsZCcpLAogICk7CgogIGF3YWl0IGNyZWF0ZUJ1bmRsZSgKICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICBwcm9qZWN0RGlyZWN0b3J5OiBwcm9qZWN0RGlyZWN0b3J5LAogICAgYnVpbGREaXJlY3Rvcnk6IGJ1aWxkRGlyZWN0b3J5LAogICAgZXhpdDogZXhpdCwKICApOwoKICBmaW5hbCBSb3V0ZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKICB0cnkgewogICAgY29uZmlndXJhdGlvbiA9IGJ1aWxkQ29uZmlndXJhdGlvbihwcm9qZWN0RGlyZWN0b3J5KTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29udGV4dC5sb2dnZXIuZXJyKCckZXJyb3InKTsKICAgIHJldHVybiBleGl0KDEpOwogIH0KCiAgcmVwb3J0Um91dGVDb25mbGljdHMoCiAgICBjb25maWd1cmF0aW9uLAogICAgb25Sb3V0ZUNvbmZsaWN0OiAoCiAgICAgIG9yaWdpbmFsRmlsZVBhdGgsCiAgICAgIGNvbmZsaWN0aW5nRmlsZVBhdGgsCiAgICAgIGNvbmZsaWN0aW5nRW5kcG9pbnQsCiAgICApIHsKICAgICAgY29udGV4dC5sb2dnZXIuZXJyKAogICAgICAgICcnJ1JvdXRlIGNvbmZsaWN0IGRldGVjdGVkLiAke2xpZ2h0Q3lhbi53cmFwKG9yaWdpbmFsRmlsZVBhdGgpfSBhbmQgJHtsaWdodEN5YW4ud3JhcChjb25mbGljdGluZ0ZpbGVQYXRoKX0gYm90aCByZXNvbHZlIHRvICR7bGlnaHRDeWFuLndyYXAoY29uZmxpY3RpbmdFbmRwb2ludCl9LicnJywKICAgICAgKTsKICAgIH0sCiAgICBvblZpb2xhdGlvbkVuZDogKCkgewogICAgICBleGl0KDEpOwogICAgfSwKICApOwoKICByZXBvcnRSb2d1ZVJvdXRlcygKICAgIGNvbmZpZ3VyYXRpb24sCiAgICBvblJvZ3VlUm91dGU6IChmaWxlUGF0aCwgaWRlYWxQYXRoKSB7CiAgICAgIGNvbnRleHQubG9nZ2VyLmVycigKICAgICAgICAnJydSb2d1ZSByb3V0ZSBkZXRlY3RlZC4ke2RlZmF1bHRGb3JlZ3JvdW5kLndyYXAoJyAnKX1SZW5hbWUgJHtsaWdodEN5YW4ud3JhcChmaWxlUGF0aCl9IHRvICR7bGlnaHRDeWFuLndyYXAoaWRlYWxQYXRoKX0uJycnLAogICAgICApOwogICAgfSwKICAgIG9uVmlvbGF0aW9uRW5kOiAoKSB7CiAgICAgIGV4aXQoMSk7CiAgICB9LAogICk7CgogIGZpbmFsIGN1c3RvbURvY2tlckZpbGUgPSBpby5GaWxlKAogICAgcGF0aC5qb2luKHByb2plY3REaXJlY3RvcnkucGF0aCwgJ0RvY2tlcmZpbGUnKSwKICApOwoKICBmaW5hbCBpbnRlcm5hbFBhdGhEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRJbnRlcm5hbFBhdGhEZXBlbmRlbmNpZXMoCiAgICBwcm9qZWN0RGlyZWN0b3J5LAogICk7CgogIGZpbmFsIGV4dGVybmFsRGVwZW5kZW5jaWVzID0gYXdhaXQgY3JlYXRlRXh0ZXJuYWxQYWNrYWdlc0ZvbGRlcigKICAgIHByb2plY3REaXJlY3Rvcnk6IHByb2plY3REaXJlY3RvcnksCiAgICBidWlsZERpcmVjdG9yeTogYnVpbGREaXJlY3RvcnksCiAgICBjb3B5UGF0aDogY29weVBhdGgsCiAgKTsKCiAgZmluYWwgYWRkRG9ja2VyZmlsZSA9ICFjdXN0b21Eb2NrZXJGaWxlLmV4aXN0c1N5bmMoKTsKCiAgY29udGV4dC52YXJzID0gewogICAgJ2RpcmVjdG9yaWVzJzogY29uZmlndXJhdGlvbi5kaXJlY3RvcmllcwogICAgICAgIC5tYXAoKGMpID0+IGMudG9Kc29uKCkpCiAgICAgICAgLnRvTGlzdCgpCiAgICAgICAgLnJldmVyc2VkCiAgICAgICAgLnRvTGlzdCgpLAogICAgJ3JvdXRlcyc6IGNvbmZpZ3VyYXRpb24ucm91dGVzLm1hcCgocikgPT4gci50b0pzb24oKSkudG9MaXN0KCksCiAgICAnbWlkZGxld2FyZSc6IGNvbmZpZ3VyYXRpb24ubWlkZGxld2FyZS5tYXAoKG0pID0+IG0udG9Kc29uKCkpLnRvTGlzdCgpLAogICAgJ2dsb2JhbE1pZGRsZXdhcmUnOiBjb25maWd1cmF0aW9uLmdsb2JhbE1pZGRsZXdhcmUgIT0gbnVsbAogICAgICAgID8gY29uZmlndXJhdGlvbi5nbG9iYWxNaWRkbGV3YXJlIS50b0pzb24oKQogICAgICAgIDogZmFsc2UsCiAgICAnc2VydmVTdGF0aWNGaWxlcyc6IGNvbmZpZ3VyYXRpb24uc2VydmVTdGF0aWNGaWxlcywKICAgICdpbnZva2VDdXN0b21FbnRyeXBvaW50JzogY29uZmlndXJhdGlvbi5pbnZva2VDdXN0b21FbnRyeXBvaW50LAogICAgJ2ludm9rZUN1c3RvbUluaXQnOiBjb25maWd1cmF0aW9uLmludm9rZUN1c3RvbUluaXQsCiAgICAncGF0aERlcGVuZGVuY2llcyc6IGludGVybmFsUGF0aERlcGVuZGVuY2llcywKICAgICdoYXNFeHRlcm5hbERlcGVuZGVuY2llcyc6IGV4dGVybmFsRGVwZW5kZW5jaWVzLmlzTm90RW1wdHksCiAgICAnZGFydFZlcnNpb24nOiBjb250ZXh0LnZhcnNbJ2RhcnRWZXJzaW9uJ10sCiAgICAnYWRkRG9ja2VyZmlsZSc6IGFkZERvY2tlcmZpbGUsCiAgfTsKfQo=", - "type": "text" + "type": "text", }, { "path": "pubspec.yaml", "data": "bmFtZTogZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzCnB1Ymxpc2hfdG86IG5vbmUKCmVudmlyb25tZW50OgogIHNkazogIj49My4wLjAgPDQuMC4wIgoKZGVwZW5kZW5jaWVzOgogIGRhcnRfZnJvZ19nZW46IF4yLjAuMAogIGVxdWF0YWJsZTogXjIuMC41CiAgaW86IF4xLjAuMwogIG1hc29uOiBeMC4xLjAtZGV2LjM5CiAgcGF0aDogXjEuOC4xCiAgeWFtbDogXjMuMS4yCgpkZXZfZGVwZW5kZW5jaWVzOgogIG1vY2t0YWlsOiBeMS4wLjAKICB0ZXN0OiBeMS4yNS4wCiAgdmVyeV9nb29kX2FuYWx5c2lzOiBeNi4wLjAK", - "type": "text" + "type": "text", }, { "path": "test/post_gen_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXJfaG9va3MvZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6bWFzb24vbWFzb24uZGFydCcKICAgIHNob3cgRXhpdENvZGUsIEhvb2tDb250ZXh0LCBMb2dnZXIsIFByb2dyZXNzLCBsaWdodEN5YW47CmltcG9ydCAncGFja2FnZTptb2NrdGFpbC9tb2NrdGFpbC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOnBhdGgvcGF0aC5kYXJ0JyBhcyBwYXRoOwppbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwoKaW1wb3J0ICcuLi9wb3N0X2dlbi5kYXJ0JyBhcyBwb3N0X2dlbjsKCmNsYXNzIF9GYWtlSG9va0NvbnRleHQgZXh0ZW5kcyBGYWtlIGltcGxlbWVudHMgSG9va0NvbnRleHQgewogIF9GYWtlSG9va0NvbnRleHQoe0xvZ2dlcj8gbG9nZ2VyfSkgOiBfbG9nZ2VyID0gbG9nZ2VyID8/IF9Nb2NrTG9nZ2VyKCk7CgogIGZpbmFsIExvZ2dlciBfbG9nZ2VyOwoKICB2YXIgX3ZhcnMgPSA8U3RyaW5nLCBkeW5hbWljPnt9OwoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgdmFycyA9PiBfdmFyczsKCiAgQG92ZXJyaWRlCiAgc2V0IHZhcnMoTWFwPFN0cmluZywgZHluYW1pYz4gdmFsdWUpID0+IF92YXJzID0gdmFsdWU7CgogIEBvdmVycmlkZQogIExvZ2dlciBnZXQgbG9nZ2VyID0+IF9sb2dnZXI7Cn0KCmNsYXNzIF9Nb2NrTG9nZ2VyIGV4dGVuZHMgTW9jayBpbXBsZW1lbnRzIExvZ2dlciB7fQoKY2xhc3MgX01vY2tQcm9ncmVzcyBleHRlbmRzIE1vY2sgaW1wbGVtZW50cyBQcm9ncmVzcyB7fQoKdm9pZCBtYWluKCkgewogIGdyb3VwKCdwb3N0R2VuJywgKCkgewogICAgbGF0ZSBIb29rQ29udGV4dCBjb250ZXh0OwogICAgbGF0ZSBMb2dnZXIgbG9nZ2VyOwoKICAgIGNvbnN0IHByb2Nlc3NJZCA9IDQyOwogICAgZmluYWwgcHJvY2Vzc1Jlc3VsdCA9IFByb2Nlc3NSZXN1bHQoCiAgICAgIHByb2Nlc3NJZCwKICAgICAgRXhpdENvZGUuc3VjY2Vzcy5jb2RlLAogICAgICAnJywKICAgICAgJycsCiAgICApOwoKICAgIHNldFVwKCgpIHsKICAgICAgbG9nZ2VyID0gX01vY2tMb2dnZXIoKTsKICAgICAgY29udGV4dCA9IF9GYWtlSG9va0NvbnRleHQobG9nZ2VyOiBsb2dnZXIpOwoKICAgICAgd2hlbigoKSA9PiBsb2dnZXIucHJvZ3Jlc3MoYW55KCkpKS50aGVuUmV0dXJuKF9Nb2NrUHJvZ3Jlc3MoKSk7CiAgICB9KTsKCiAgICB0ZXN0KCdydW4gY29tcGxldGVzJywgKCkgewogICAgICBleHBlY3QoCiAgICAgICAgRXhpdE92ZXJyaWRlcy5ydW5ab25lZCgKICAgICAgICAgICgpID0+IHBvc3RfZ2VuLnJ1bihfRmFrZUhvb2tDb250ZXh0KGxvZ2dlcjogbG9nZ2VyKSksCiAgICAgICAgICBleGl0OiAoXykge30sCiAgICAgICAgKSwKICAgICAgICBjb21wbGV0ZXMsCiAgICAgICk7CiAgICB9KTsKCiAgICB0ZXN0KCdydW5zIGRhcnQgcHViIGdldCBhbmQgb3V0cHV0cyBuZXh0IHN0ZXBzJywgKCkgYXN5bmMgewogICAgICB2YXIgcHJvY2Vzc1J1bm5lckNhbGxDb3VudCA9IDA7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CgogICAgICBhd2FpdCBwb3N0X2dlbi5wb3N0R2VuKAogICAgICAgIGNvbnRleHQsCiAgICAgICAgcnVuUHJvY2VzczogKAogICAgICAgICAgZXhlY3V0YWJsZSwKICAgICAgICAgIGFyZ3MsIHsKICAgICAgICAgIFN0cmluZz8gd29ya2luZ0RpcmVjdG9yeSwKICAgICAgICAgIGJvb2w/IHJ1bkluU2hlbGwsCiAgICAgICAgfSkgYXN5bmMgewogICAgICAgICAgcHJvY2Vzc1J1bm5lckNhbGxDb3VudCsrOwogICAgICAgICAgZXhwZWN0KGV4ZWN1dGFibGUsIGVxdWFscygnZGFydCcpKTsKICAgICAgICAgIGV4cGVjdChhcmdzLCBlcXVhbHMoWydwdWInLCAnZ2V0J10pKTsKICAgICAgICAgIGV4cGVjdCgKICAgICAgICAgICAgd29ya2luZ0RpcmVjdG9yeSwKICAgICAgICAgICAgZXF1YWxzKHBhdGguam9pbihEaXJlY3RvcnkuY3VycmVudC5wYXRoLCAnYnVpbGQnKSksCiAgICAgICAgICApOwogICAgICAgICAgZXhwZWN0KHJ1bkluU2hlbGwsIGlzVHJ1ZSk7CiAgICAgICAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdDsKICAgICAgICB9LAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICk7CiAgICAgIGV4cGVjdChwcm9jZXNzUnVubmVyQ2FsbENvdW50LCBlcXVhbHMoMSkpOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgICAgdmVyaWZ5KCgpID0+IGxvZ2dlci5zdWNjZXNzKCdDcmVhdGVkIGEgcHJvZHVjdGlvbiBidWlsZCEnKSkuY2FsbGVkKDEpOwogICAgICB2ZXJpZnkoCiAgICAgICAgKCkgPT4gbG9nZ2VyLmluZm8oJ1N0YXJ0IHRoZSBwcm9kdWN0aW9uIHNlcnZlciBieSBydW5uaW5nOicpLAogICAgICApLmNhbGxlZCgxKTsKICAgICAgdmVyaWZ5KAogICAgICAgICgpID0+IGxvZ2dlci5pbmZvKCcke2xpZ2h0Q3lhbi53cmFwKCdkYXJ0IGJ1aWxkL2Jpbi9zZXJ2ZXIuZGFydCcpfScpLAogICAgICApLmNhbGxlZCgxKTsKICAgICAgdmVyaWZ5TmV2ZXIoKCkgPT4gbG9nZ2VyLmVycihhbnkoKSkpOwogICAgfSk7CiAgfSk7Cn0K", - "type": "text" + "type": "text", }, { "path": "test/pre_gen_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfZ2VuL2RhcnRfZnJvZ19nZW4uZGFydCc7CmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXJfaG9va3MvZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6bWFzb24vbWFzb24uZGFydCcKICAgIHNob3cgSG9va0NvbnRleHQsIExvZ2dlciwgUHJvZ3Jlc3MsIGRlZmF1bHRGb3JlZ3JvdW5kLCBsaWdodEN5YW47CmltcG9ydCAncGFja2FnZTptb2NrdGFpbC9tb2NrdGFpbC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOnBhdGgvcGF0aC5kYXJ0JyBhcyBwYXRoOwppbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwoKaW1wb3J0ICcuLi9wcmVfZ2VuLmRhcnQnIGFzIHByZV9nZW47CmltcG9ydCAncHVic3BlY19sb2Nrcy5kYXJ0JzsKCmNsYXNzIF9GYWtlSG9va0NvbnRleHQgZXh0ZW5kcyBGYWtlIGltcGxlbWVudHMgSG9va0NvbnRleHQgewogIF9GYWtlSG9va0NvbnRleHQoe0xvZ2dlcj8gbG9nZ2VyfSkgOiBfbG9nZ2VyID0gbG9nZ2VyID8/IF9Nb2NrTG9nZ2VyKCk7CgogIGZpbmFsIExvZ2dlciBfbG9nZ2VyOwoKICB2YXIgX3ZhcnMgPSA8U3RyaW5nLCBkeW5hbWljPnt9OwoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgdmFycyA9PiBfdmFyczsKCiAgQG92ZXJyaWRlCiAgc2V0IHZhcnMoTWFwPFN0cmluZywgZHluYW1pYz4gdmFsdWUpID0+IF92YXJzID0gdmFsdWU7CgogIEBvdmVycmlkZQogIExvZ2dlciBnZXQgbG9nZ2VyID0+IF9sb2dnZXI7Cn0KCmNsYXNzIF9Nb2NrTG9nZ2VyIGV4dGVuZHMgTW9jayBpbXBsZW1lbnRzIExvZ2dlciB7fQoKY2xhc3MgX01vY2tQcm9ncmVzcyBleHRlbmRzIE1vY2sgaW1wbGVtZW50cyBQcm9ncmVzcyB7fQoKdm9pZCBtYWluKCkgewogIGdyb3VwKCdwcmVHZW4nLCAoKSB7CiAgICBsYXRlIEhvb2tDb250ZXh0IGNvbnRleHQ7CiAgICBsYXRlIExvZ2dlciBsb2dnZXI7CgogICAgRnV0dXJlPFByb2Nlc3NSZXN1bHQ+IHN1Y2Nlc3NSdW5Qcm9jZXNzKAogICAgICBleGVjdXRhYmxlLAogICAgICBhcmdzLCB7CiAgICAgIFN0cmluZz8gd29ya2luZ0RpcmVjdG9yeSwKICAgICAgYm9vbD8gcnVuSW5TaGVsbCwKICAgIH0pID0+CiAgICAgICAgRnV0dXJlLnZhbHVlKFByb2Nlc3NSZXN1bHQoMCwgMCwgJycsICcnKSk7CgogICAgc2V0VXAoKCkgewogICAgICBsb2dnZXIgPSBfTW9ja0xvZ2dlcigpOwogICAgICBjb250ZXh0ID0gX0Zha2VIb29rQ29udGV4dChsb2dnZXI6IGxvZ2dlcikKICAgICAgICAuLnZhcnNbJ2RhcnRWZXJzaW9uJ10gPSAnc3RhYmxlJzsKCiAgICAgIHdoZW4oKCkgPT4gbG9nZ2VyLnByb2dyZXNzKGFueSgpKSkudGhlblJldHVybihfTW9ja1Byb2dyZXNzKCkpOwogICAgfSk7CgogICAgdGVzdCgncnVuIGNvbXBsZXRlcycsICgpIHsKICAgICAgZXhwZWN0KAogICAgICAgIEV4aXRPdmVycmlkZXMucnVuWm9uZWQoCiAgICAgICAgICAoKSA9PiBwcmVfZ2VuLnJ1bihfRmFrZUhvb2tDb250ZXh0KGxvZ2dlcjogbG9nZ2VyKSksCiAgICAgICAgICBleGl0OiAoXykge30sCiAgICAgICAgKSwKICAgICAgICBjb21wbGV0ZXMsCiAgICAgICk7CiAgICB9KTsKCiAgICB0ZXN0KCdleGl0KDEpIGlmIGJ1aWxkUm91dGVDb25maWd1cmF0aW9uIHRocm93cycsICgpIGFzeW5jIHsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgZmluYWwgZXhjZXB0aW9uID0gRXhjZXB0aW9uKCdvb3BzJyk7CiAgICAgIGF3YWl0IHByZV9nZW4ucHJlR2VuKAogICAgICAgIGNvbnRleHQsCiAgICAgICAgYnVpbGRDb25maWd1cmF0aW9uOiAoXykgPT4gdGhyb3cgZXhjZXB0aW9uLAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgcnVuUHJvY2Vzczogc3VjY2Vzc1J1blByb2Nlc3MsCiAgICAgICk7CiAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGVxdWFscyhbMV0pKTsKICAgICAgdmVyaWZ5KCgpID0+IGxvZ2dlci5lcnIoZXhjZXB0aW9uLnRvU3RyaW5nKCkpKS5jYWxsZWQoMSk7CiAgICB9KTsKCiAgICB0ZXN0KCdleGl0KDEpIGZvciByb3V0ZSBjb25mbGljdHMnLCAoKSBhc3luYyB7CiAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBSb3V0ZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgbWlkZGxld2FyZTogW10sCiAgICAgICAgZGlyZWN0b3JpZXM6IFtdLAogICAgICAgIHJvdXRlczogW10sCiAgICAgICAgcm9ndWVSb3V0ZXM6IFtdLAogICAgICAgIGVuZHBvaW50czogewogICAgICAgICAgJy8nOiBbCiAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiAnaW5kZXgnLAogICAgICAgICAgICAgIHBhdGg6ICdpbmRleC5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy8nLAogICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICApLAogICAgICAgICAgXSwKICAgICAgICAgICcvaGVsbG8nOiBbCiAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiAnaGVsbG8nLAogICAgICAgICAgICAgIHBhdGg6ICdoZWxsby5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy9oZWxsbycsCiAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiAnaGVsbG9faW5kZXgnLAogICAgICAgICAgICAgIHBhdGg6ICdoZWxsby9pbmRleC5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy8nLAogICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICApLAogICAgICAgICAgXSwKICAgICAgICB9LAogICAgICApOwoKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgYXdhaXQgcHJlX2dlbi5wcmVHZW4oCiAgICAgICAgY29udGV4dCwKICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiBjb25maWd1cmF0aW9uLAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgcnVuUHJvY2Vzczogc3VjY2Vzc1J1blByb2Nlc3MsCiAgICAgICk7CgogICAgICB2ZXJpZnkoCiAgICAgICAgKCkgPT4gbG9nZ2VyLmVycigKICAgICAgICAgICcnJ1JvdXRlIGNvbmZsaWN0IGRldGVjdGVkLiAke2xpZ2h0Q3lhbi53cmFwKCdyb3V0ZXMvaGVsbG8uZGFydCcpfSBhbmQgJHtsaWdodEN5YW4ud3JhcCgncm91dGVzL2hlbGxvL2luZGV4LmRhcnQnKX0gYm90aCByZXNvbHZlIHRvICR7bGlnaHRDeWFuLndyYXAoJy9oZWxsbycpfS4nJycsCiAgICAgICAgKSwKICAgICAgKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgZXF1YWxzKFsxXSkpOwogICAgfSk7CgogICAgdGVzdCgnZXhpdCgxKSBmb3Igcm9ndWUgcm91dGVzJywgKCkgYXN5bmMgewogICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gUm91dGVDb25maWd1cmF0aW9uKAogICAgICAgIG1pZGRsZXdhcmU6IFtdLAogICAgICAgIGRpcmVjdG9yaWVzOiBbXSwKICAgICAgICByb3V0ZXM6IFtdLAogICAgICAgIHJvZ3VlUm91dGVzOiBbCiAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgIG5hbWU6ICdoZWxsbycsCiAgICAgICAgICAgIHBhdGg6ICdoZWxsby5kYXJ0JywKICAgICAgICAgICAgcm91dGU6ICcvaGVsbG8nLAogICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICApLAogICAgICAgIF0sCiAgICAgICAgZW5kcG9pbnRzOiB7fSwKICAgICAgICBpbnZva2VDdXN0b21FbnRyeXBvaW50OiB0cnVlLAogICAgICApOwoKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgYXdhaXQgcHJlX2dlbi5wcmVHZW4oCiAgICAgICAgY29udGV4dCwKICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiBjb25maWd1cmF0aW9uLAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgcnVuUHJvY2Vzczogc3VjY2Vzc1J1blByb2Nlc3MsCiAgICAgICk7CgogICAgICB2ZXJpZnkoCiAgICAgICAgKCkgPT4gbG9nZ2VyLmVycigKICAgICAgICAgICcnJ1JvZ3VlIHJvdXRlIGRldGVjdGVkLiR7ZGVmYXVsdEZvcmVncm91bmQud3JhcCgnICcpfVJlbmFtZSAke2xpZ2h0Q3lhbi53cmFwKCdyb3V0ZXMvaGVsbG8uZGFydCcpfSB0byAke2xpZ2h0Q3lhbi53cmFwKCdyb3V0ZXMvaGVsbG8vaW5kZXguZGFydCcpfS4nJycsCiAgICAgICAgKSwKICAgICAgKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgZXF1YWxzKFsxXSkpOwogICAgfSk7CgogICAgdGVzdCgKICAgICAgJ3dvcmtzIHdpdGggZXh0ZXJuYWwgZGVwZW5kZW5jaWVzJywKICAgICAgKCkgYXN5bmMgewogICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBSb3V0ZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgICBtaWRkbGV3YXJlOiBbXSwKICAgICAgICAgIGRpcmVjdG9yaWVzOiBbXSwKICAgICAgICAgIHJvdXRlczogW10sCiAgICAgICAgICByb2d1ZVJvdXRlczogW10sCiAgICAgICAgICBlbmRwb2ludHM6IHt9LAogICAgICAgICk7CgogICAgICAgIGZpbmFsIGRpcmVjdG9yeSA9IERpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKCk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LnBhdGgsICdwdWJzcGVjLnlhbWwnKSkud3JpdGVBc1N0cmluZ1N5bmMoCiAgICAgICAgICAnJycKbmFtZTogZXhhbXBsZQp2ZXJzaW9uOiAwLjEuMAplbnZpcm9ubWVudDoKICBzZGs6IF4yLjE3LjAKZGVwZW5kZW5jaWVzOgogIG1hc29uOiBhbnkKICBmb286CiAgICBwYXRoOiAuLi8uLi9mb28KZGV2X2RlcGVuZGVuY2llczoKICB0ZXN0OiBhbnkKJycnLAogICAgICAgICk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LnBhdGgsICdwdWJzcGVjLmxvY2snKSkud3JpdGVBc1N0cmluZ1N5bmMoCiAgICAgICAgICBmb29QYXRoLAogICAgICAgICk7CiAgICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgICBhd2FpdCBwcmVfZ2VuLnByZUdlbigKICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiBjb25maWd1cmF0aW9uLAogICAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgICAgIGRpcmVjdG9yeTogZGlyZWN0b3J5LAogICAgICAgICAgcnVuUHJvY2Vzczogc3VjY2Vzc1J1blByb2Nlc3MsCiAgICAgICAgICBjb3B5UGF0aDogKF8sIF9fKSBhc3luYyB7fSwKICAgICAgICApOwoKICAgICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgICAgICBkaXJlY3RvcnkuZGVsZXRlKHJlY3Vyc2l2ZTogdHJ1ZSkuaWdub3JlKCk7CiAgICAgIH0sCiAgICApOwoKICAgIHRlc3QoJ3JldGFpbnMgaW52b2tlQ3VzdG9tRW50cnlwb2ludCAodHJ1ZSknLCAoKSBhc3luYyB7CiAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBSb3V0ZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgbWlkZGxld2FyZTogW10sCiAgICAgICAgZGlyZWN0b3JpZXM6IFtdLAogICAgICAgIHJvdXRlczogW10sCiAgICAgICAgcm9ndWVSb3V0ZXM6IFtdLAogICAgICAgIGVuZHBvaW50czoge30sCiAgICAgICAgaW52b2tlQ3VzdG9tRW50cnlwb2ludDogdHJ1ZSwKICAgICAgKTsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgYXdhaXQgcHJlX2dlbi5wcmVHZW4oCiAgICAgICAgY29udGV4dCwKICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiBjb25maWd1cmF0aW9uLAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgcnVuUHJvY2Vzczogc3VjY2Vzc1J1blByb2Nlc3MsCiAgICAgICk7CiAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGlzRW1wdHkpOwogICAgICB2ZXJpZnlOZXZlcigoKSA9PiBsb2dnZXIuZXJyKGFueSgpKSk7CiAgICAgIGV4cGVjdCgKICAgICAgICBjb250ZXh0LnZhcnMsCiAgICAgICAgZXF1YWxzKHsKICAgICAgICAgICdkaXJlY3Rvcmllcyc6IDxSb3V0ZURpcmVjdG9yeT5bXSwKICAgICAgICAgICdyb3V0ZXMnOiA8Um91dGVGaWxlPltdLAogICAgICAgICAgJ21pZGRsZXdhcmUnOiA8TWlkZGxld2FyZUZpbGU+W10sCiAgICAgICAgICAnZ2xvYmFsTWlkZGxld2FyZSc6IGZhbHNlLAogICAgICAgICAgJ3NlcnZlU3RhdGljRmlsZXMnOiBmYWxzZSwKICAgICAgICAgICdpbnZva2VDdXN0b21FbnRyeXBvaW50JzogdHJ1ZSwKICAgICAgICAgICdpbnZva2VDdXN0b21Jbml0JzogZmFsc2UsCiAgICAgICAgICAncGF0aERlcGVuZGVuY2llcyc6IDxTdHJpbmc+W10sCiAgICAgICAgICAnaGFzRXh0ZXJuYWxEZXBlbmRlbmNpZXMnOiBmYWxzZSwKICAgICAgICAgICdkYXJ0VmVyc2lvbic6ICdzdGFibGUnLAogICAgICAgICAgJ2FkZERvY2tlcmZpbGUnOiB0cnVlLAogICAgICAgIH0pLAogICAgICApOwogICAgfSk7CgogICAgdGVzdCgiZG9uJ3QgY3JlYXRlIHRoZSBkb2NrZXJmaWxlIGlmIG9uZSBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgZm9sZGVyLiIsCiAgICAgICAgKCkgYXN5bmMgewogICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gUm91dGVDb25maWd1cmF0aW9uKAogICAgICAgIG1pZGRsZXdhcmU6IFtdLAogICAgICAgIGRpcmVjdG9yaWVzOiBbXSwKICAgICAgICByb3V0ZXM6IFtdLAogICAgICAgIHJvZ3VlUm91dGVzOiBbXSwKICAgICAgICBlbmRwb2ludHM6IHt9LAogICAgICApOwoKICAgICAgZmluYWwgZGlyZWN0b3J5ID0gRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcFN5bmMoKTsKICAgICAgRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LnBhdGgsICdwdWJzcGVjLnlhbWwnKSkud3JpdGVBc1N0cmluZ1N5bmMoCiAgICAgICAgJycnCm5hbWU6IGV4YW1wbGUKdmVyc2lvbjogMC4xLjAKZW52aXJvbm1lbnQ6CiAgc2RrOiBeMi4xNy4wCmRlcGVuZGVuY2llczoKICBtYXNvbjogYW55CiAgdGVzdDogYW55CicnJywKICAgICAgKTsKCiAgICAgIEZpbGUocGF0aC5qb2luKGRpcmVjdG9yeS5wYXRoLCAncHVic3BlYy5sb2NrJykpLndyaXRlQXNTdHJpbmdTeW5jKAogICAgICAgIG5vUGF0aERlcGVuZGVuY2llcywKICAgICAgKTsKICAgICAgRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LnBhdGgsICdEb2NrZXJmaWxlJykpLndyaXRlQXNTdHJpbmdTeW5jKAogICAgICAgICcnLAogICAgICApOwoKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgYXdhaXQgcHJlX2dlbi5wcmVHZW4oCiAgICAgICAgY29udGV4dCwKICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiBjb25maWd1cmF0aW9uLAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgZGlyZWN0b3J5OiBkaXJlY3RvcnksCiAgICAgICAgcnVuUHJvY2Vzczogc3VjY2Vzc1J1blByb2Nlc3MsCiAgICAgICk7CgogICAgICBleHBlY3QoCiAgICAgICAgY29udGV4dC52YXJzLAogICAgICAgIGVxdWFscyh7CiAgICAgICAgICAnZGlyZWN0b3JpZXMnOiA8Um91dGVEaXJlY3Rvcnk+W10sCiAgICAgICAgICAncm91dGVzJzogPFJvdXRlRmlsZT5bXSwKICAgICAgICAgICdtaWRkbGV3YXJlJzogPE1pZGRsZXdhcmVGaWxlPltdLAogICAgICAgICAgJ2dsb2JhbE1pZGRsZXdhcmUnOiBmYWxzZSwKICAgICAgICAgICdzZXJ2ZVN0YXRpY0ZpbGVzJzogZmFsc2UsCiAgICAgICAgICAnaW52b2tlQ3VzdG9tRW50cnlwb2ludCc6IGZhbHNlLAogICAgICAgICAgJ2ludm9rZUN1c3RvbUluaXQnOiBmYWxzZSwKICAgICAgICAgICdoYXNFeHRlcm5hbERlcGVuZGVuY2llcyc6IGZhbHNlLAogICAgICAgICAgJ3BhdGhEZXBlbmRlbmNpZXMnOiA8U3RyaW5nPltdLAogICAgICAgICAgJ2RhcnRWZXJzaW9uJzogJ3N0YWJsZScsCiAgICAgICAgICAnYWRkRG9ja2VyZmlsZSc6IGZhbHNlLAogICAgICAgIH0pLAogICAgICApOwogICAgICBkaXJlY3RvcnkuZGVsZXRlKHJlY3Vyc2l2ZTogdHJ1ZSkuaWdub3JlKCk7CiAgICB9KTsKCiAgICB0ZXN0KCdyZXRhaW5zIGludm9rZUN1c3RvbUluaXQgKHRydWUpJywgKCkgYXN5bmMgewogICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gUm91dGVDb25maWd1cmF0aW9uKAogICAgICAgIG1pZGRsZXdhcmU6IFtdLAogICAgICAgIGRpcmVjdG9yaWVzOiBbXSwKICAgICAgICByb3V0ZXM6IFtdLAogICAgICAgIHJvZ3VlUm91dGVzOiBbXSwKICAgICAgICBlbmRwb2ludHM6IHt9LAogICAgICAgIGludm9rZUN1c3RvbUluaXQ6IHRydWUsCiAgICAgICk7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGF3YWl0IHByZV9nZW4ucHJlR2VuKAogICAgICAgIGNvbnRleHQsCiAgICAgICAgYnVpbGRDb25maWd1cmF0aW9uOiAoXykgPT4gY29uZmlndXJhdGlvbiwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICAgIHJ1blByb2Nlc3M6IHN1Y2Nlc3NSdW5Qcm9jZXNzLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgICAgdmVyaWZ5TmV2ZXIoKCkgPT4gbG9nZ2VyLmVycihhbnkoKSkpOwogICAgICBleHBlY3QoCiAgICAgICAgY29udGV4dC52YXJzLAogICAgICAgIGVxdWFscyh7CiAgICAgICAgICAnZGlyZWN0b3JpZXMnOiA8Um91dGVEaXJlY3Rvcnk+W10sCiAgICAgICAgICAncm91dGVzJzogPFJvdXRlRmlsZT5bXSwKICAgICAgICAgICdtaWRkbGV3YXJlJzogPE1pZGRsZXdhcmVGaWxlPltdLAogICAgICAgICAgJ2dsb2JhbE1pZGRsZXdhcmUnOiBmYWxzZSwKICAgICAgICAgICdzZXJ2ZVN0YXRpY0ZpbGVzJzogZmFsc2UsCiAgICAgICAgICAnaW52b2tlQ3VzdG9tRW50cnlwb2ludCc6IGZhbHNlLAogICAgICAgICAgJ2ludm9rZUN1c3RvbUluaXQnOiB0cnVlLAogICAgICAgICAgJ2hhc0V4dGVybmFsRGVwZW5kZW5jaWVzJzogZmFsc2UsCiAgICAgICAgICAncGF0aERlcGVuZGVuY2llcyc6IDxTdHJpbmc+W10sCiAgICAgICAgICAnZGFydFZlcnNpb24nOiAnc3RhYmxlJywKICAgICAgICAgICdhZGREb2NrZXJmaWxlJzogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgKTsKICAgIH0pOwoKICAgIHRlc3QoCiAgICAgICd1cGRhdGVzIGNvbnRleHQudmFycyB3aGVuIGJ1aWxkUm91dGVDb25maWd1cmF0aW9uIHN1Y2NlZWRzJywKICAgICAgKCkgYXN5bmMgewogICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBSb3V0ZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgICBnbG9iYWxNaWRkbGV3YXJlOiBNaWRkbGV3YXJlRmlsZSgKICAgICAgICAgICAgbmFtZTogJ21pZGRsZXdhcmUnLAogICAgICAgICAgICBwYXRoOiAnbWlkZGxld2FyZS5kYXJ0JywKICAgICAgICAgICksCiAgICAgICAgICBtaWRkbGV3YXJlOiBbCiAgICAgICAgICAgIE1pZGRsZXdhcmVGaWxlKAogICAgICAgICAgICAgIG5hbWU6ICdoZWxsb19taWRkbGV3YXJlJywKICAgICAgICAgICAgICBwYXRoOiAnaGVsbG8vbWlkZGxld2FyZS5kYXJ0JywKICAgICAgICAgICAgKSwKICAgICAgICAgIF0sCiAgICAgICAgICBkaXJlY3RvcmllczogWwogICAgICAgICAgICBSb3V0ZURpcmVjdG9yeSgKICAgICAgICAgICAgICBuYW1lOiAnXycsCiAgICAgICAgICAgICAgcm91dGU6ICcvJywKICAgICAgICAgICAgICBtaWRkbGV3YXJlOiBbXSwKICAgICAgICAgICAgICBmaWxlczogWwogICAgICAgICAgICAgICAgUm91dGVGaWxlKAogICAgICAgICAgICAgICAgICBuYW1lOiAnaW5kZXgnLAogICAgICAgICAgICAgICAgICBwYXRoOiAnaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgICAgIHJvdXRlOiAnLycsCiAgICAgICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgICAgIG5hbWU6ICdoZWxsbycsCiAgICAgICAgICAgICAgICAgIHBhdGg6ICdoZWxsby5kYXJ0JywKICAgICAgICAgICAgICAgICAgcm91dGU6ICcvaGVsbG8nLAogICAgICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgKSwKICAgICAgICAgIF0sCiAgICAgICAgICByb3V0ZXM6IFsKICAgICAgICAgICAgUm91dGVGaWxlKAogICAgICAgICAgICAgIG5hbWU6ICdpbmRleCcsCiAgICAgICAgICAgICAgcGF0aDogJ2luZGV4LmRhcnQnLAogICAgICAgICAgICAgIHJvdXRlOiAnLycsCiAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiAnaGVsbG8nLAogICAgICAgICAgICAgIHBhdGg6ICdoZWxsby5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy9oZWxsbycsCiAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICksCiAgICAgICAgICBdLAogICAgICAgICAgcm9ndWVSb3V0ZXM6IFtdLAogICAgICAgICAgZW5kcG9pbnRzOiB7CiAgICAgICAgICAgICcvJzogWwogICAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICAgIG5hbWU6ICdpbmRleCcsCiAgICAgICAgICAgICAgICBwYXRoOiAnaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgICByb3V0ZTogJy8nLAogICAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgICApLAogICAgICAgICAgICBdLAogICAgICAgICAgICAnL2hlbGxvJzogWwogICAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICAgIG5hbWU6ICdoZWxsbycsCiAgICAgICAgICAgICAgICBwYXRoOiAnaGVsbG8uZGFydCcsCiAgICAgICAgICAgICAgICByb3V0ZTogJy9oZWxsbycsCiAgICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICAgICksCiAgICAgICAgICAgIF0sCiAgICAgICAgICB9LAogICAgICAgICAgc2VydmVTdGF0aWNGaWxlczogdHJ1ZSwKICAgICAgICApOwogICAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgICAgYXdhaXQgcHJlX2dlbi5wcmVHZW4oCiAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgYnVpbGRDb25maWd1cmF0aW9uOiAoXykgPT4gY29uZmlndXJhdGlvbiwKICAgICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgICBydW5Qcm9jZXNzOiBzdWNjZXNzUnVuUHJvY2VzcywKICAgICAgICApOwogICAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGlzRW1wdHkpOwogICAgICAgIHZlcmlmeU5ldmVyKCgpID0+IGxvZ2dlci5lcnIoYW55KCkpKTsKICAgICAgICBleHBlY3QoCiAgICAgICAgICBjb250ZXh0LnZhcnMsCiAgICAgICAgICBlcXVhbHMoewogICAgICAgICAgICAnZGlyZWN0b3JpZXMnOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJ25hbWUnOiAnXycsCiAgICAgICAgICAgICAgICAncm91dGUnOiAnLycsCiAgICAgICAgICAgICAgICAnbWlkZGxld2FyZSc6IDxNYXA8U3RyaW5nLCBkeW5hbWljPj5bXSwKICAgICAgICAgICAgICAgICdmaWxlcyc6IFsKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2luZGV4JywKICAgICAgICAgICAgICAgICAgICAncGF0aCc6ICdpbmRleC5kYXJ0JywKICAgICAgICAgICAgICAgICAgICAncm91dGUnOiAnLycsCiAgICAgICAgICAgICAgICAgICAgJ2ZpbGVfcGFyYW1zJzogY29uc3QgPFN0cmluZz5bXSwKICAgICAgICAgICAgICAgICAgICAnd2lsZGNhcmQnOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2hlbGxvJywKICAgICAgICAgICAgICAgICAgICAncGF0aCc6ICdoZWxsby5kYXJ0JywKICAgICAgICAgICAgICAgICAgICAncm91dGUnOiAnL2hlbGxvJywKICAgICAgICAgICAgICAgICAgICAnZmlsZV9wYXJhbXMnOiBjb25zdCA8U3RyaW5nPltdLAogICAgICAgICAgICAgICAgICAgICd3aWxkY2FyZCc6IGZhbHNlLAogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgJ2RpcmVjdG9yeV9wYXJhbXMnOiBjb25zdCA8U3RyaW5nPltdLAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgJ3JvdXRlcyc6IFsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAnbmFtZSc6ICdpbmRleCcsCiAgICAgICAgICAgICAgICAncGF0aCc6ICdpbmRleC5kYXJ0JywKICAgICAgICAgICAgICAgICdyb3V0ZSc6ICcvJywKICAgICAgICAgICAgICAgICdmaWxlX3BhcmFtcyc6IGNvbnN0IDxTdHJpbmc+W10sCiAgICAgICAgICAgICAgICAnd2lsZGNhcmQnOiBmYWxzZSwKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICduYW1lJzogJ2hlbGxvJywKICAgICAgICAgICAgICAgICdwYXRoJzogJ2hlbGxvLmRhcnQnLAogICAgICAgICAgICAgICAgJ3JvdXRlJzogJy9oZWxsbycsCiAgICAgICAgICAgICAgICAnZmlsZV9wYXJhbXMnOiBjb25zdCA8U3RyaW5nPltdLAogICAgICAgICAgICAgICAgJ3dpbGRjYXJkJzogZmFsc2UsCiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAnbWlkZGxld2FyZSc6IFsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAnbmFtZSc6ICdoZWxsb19taWRkbGV3YXJlJywKICAgICAgICAgICAgICAgICdwYXRoJzogJ2hlbGxvL21pZGRsZXdhcmUuZGFydCcsCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgJ2dsb2JhbE1pZGRsZXdhcmUnOiB7CiAgICAgICAgICAgICAgJ25hbWUnOiAnbWlkZGxld2FyZScsCiAgICAgICAgICAgICAgJ3BhdGgnOiAnbWlkZGxld2FyZS5kYXJ0JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ3NlcnZlU3RhdGljRmlsZXMnOiB0cnVlLAogICAgICAgICAgICAnaW52b2tlQ3VzdG9tRW50cnlwb2ludCc6IGZhbHNlLAogICAgICAgICAgICAnaW52b2tlQ3VzdG9tSW5pdCc6IGZhbHNlLAogICAgICAgICAgICAnaGFzRXh0ZXJuYWxEZXBlbmRlbmNpZXMnOiBmYWxzZSwKICAgICAgICAgICAgJ3BhdGhEZXBlbmRlbmNpZXMnOiA8U3RyaW5nPltdLAogICAgICAgICAgICAnZGFydFZlcnNpb24nOiAnc3RhYmxlJywKICAgICAgICAgICAgJ2FkZERvY2tlcmZpbGUnOiB0cnVlLAogICAgICAgICAgfSksCiAgICAgICAgKTsKICAgICAgfSwKICAgICk7CiAgfSk7Cn0K", - "type": "text" + "type": "text", }, { "path": "test/pubspec_locks.dart", "data": "Ly8vIENvbGxlY3Rpb24gb2YgYHB1YnNwZWMubG9ja2AgZmlsZXMgdXNlZCBhcyBmaXh0dXJlcyBkdXJpbmcgdGVzdGluZy4KbGlicmFyeSBwdWJzcGVjX2xvY2tzOwoKLy8vIEFuIGFydGlmaWNpYWxseSBjcmFmdGVkIGBwdWJzcGVjLmxvY2tgIGZpbGUgd2l0aDoKLy8vCi8vLyAqIEEgdHJhbnNpdGl2ZSBkZXBlbmRlbmN5LgovLy8gKiBBIGRpcmVjdCBtYWluIHBhdGggZGVwZW5kZW5jeSB0aGF0IGlzIG5vdCBhIGNoaWxkIG9mIHRoZSBwcm9qZWN0Ci8vLyBkaXJlY3RvcnkuCi8vLyAqIEEgZGlyZWN0IG1haW4gcGF0aCBkZXBlbmRlbmN5IHRoYXQgaXMgbm90IGEgY2hpbGQgb2YgdGhlIHByb2plY3QKLy8vIGRpcmVjdG9yeSBhbmQgaGFzIGEgZGlmZmVyZW50IHBhY2thZ2UgbmFtZSB0aGFuIHRoZSBkaXJlY3RvcnkgbmFtZS4KLy8vICogQSBkaXJlY3QgbWFpbiBkZXBlbmRlbmN5IHRoYXQgaXMgaG9zdGVkLgovLy8gKiBBIGRpcmVjdCBkZXYgbWFpbiBkZXBlbmRlbmN5IHRoYXQgaXMgaG9zdGVkLgovLy8gKiBBIGRpcmVjdCBvdmVycmlkZGVuIGRlcGVuZGVuY3kgZnJvbSBnaXQuCmNvbnN0IGZvb1BhdGggPSAnJycKcGFja2FnZXM6CiAgYXJnczoKICAgIGRlcGVuZGVuY3k6IHRyYW5zaXRpdmUKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiBhcmdzCiAgICAgIHNoYTI1NjogZWVmNmM0NmI2MjJlMDQ5NGEzNmM1YTEyZDEwZDc3ZmI0ZTg1NTUwMWE5MWMxYjllZjkzMzkzMjZlNThmMDU5NgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjIuNC4yIgogIGZvbzoKICAgIGRlcGVuZGVuY3k6ICJkaXJlY3QgbWFpbiIKICAgIGRlc2NyaXB0aW9uOgogICAgICBwYXRoOiAiLi4vLi4vZm9vIgogICAgICByZWxhdGl2ZTogdHJ1ZQogICAgc291cmNlOiBwYXRoCiAgICB2ZXJzaW9uOiAiMC4wLjAiCiAgc2Vjb25kX2ZvbzoKICAgIGRlcGVuZGVuY3k6ICJkaXJlY3QgbWFpbiIKICAgIGRlc2NyaXB0aW9uOgogICAgICBwYXRoOiAiLi4vLi4vZm9vMiIKICAgICAgcmVsYXRpdmU6IHRydWUKICAgIHNvdXJjZTogcGF0aAogICAgdmVyc2lvbjogIjAuMC4wIgogIGRpcmVjdF9tYWluOgogICAgZGVwZW5kZW5jeTogImRpcmVjdCBtYWluIgogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGRpcmVjdF9tYWluCiAgICAgIHNoYTI1NjogZmRjOWVhOTA1ZTdjNjkwZmUzOWQyZjk5NDZiN2FlYWQ4NmZkOTc2ZjhlZGY5N2QyNTIxYTY1ZDI2MGJiZjUwOQogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjAuMS4wLWRldi41MCIKICB0ZXN0OgogICAgZGVwZW5kZW5jeTogImRpcmVjdCBkZXYiCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogdGVzdAogICAgICBzaGEyNTY6ICI5YjBkZDhlMzZhZjRhNWIxNTY5MDI5OTQ5ZDUwYTUyY2IyYTJhMmZkYWEyMGNlYmI5NmU2NjAzYjlhZTI0MWY5IgogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjEuMjQuNiIKICBkaXJlY3Rfb3ZlcnJpZGRlbjoKICAgIGRlcGVuZGVuY3k6ICJkaXJlY3Qgb3ZlcnJpZGRlbiIKICAgIGRlc2NyaXB0aW9uOgogICAgICBwYXRoOiAicGFja2FnZXMvbWFzb24iCiAgICAgIHJlZjogIjcyYzMwNmE4ZDhhYmYzMDZiNWQwMjRmOTVhYWMyOWJhNWZkOTY1NzciCiAgICAgIHJlc29sdmVkLXJlZjogIjcyYzMwNmE4ZDhhYmYzMDZiNWQwMjRmOTVhYWMyOWJhNWZkOTY1NzciCiAgICAgIHVybDogImh0dHBzOi8vZ2l0aHViLmNvbS9hbGVzdGlhZ28vbWFzb24iCiAgICBzb3VyY2U6IGdpdAogICAgdmVyc2lvbjogIjAuMS4wLWRldi41MiIKc2RrczoKICBkYXJ0OiAiPj0zLjAuMCA8NC4wLjAiCicnJzsKCi8vLyBBbiBhcnRpZmljaWFsbHkgY3JhZnRlZCBgcHVic3BlYy5sb2NrYCBmaWxlIHdpdGg6Ci8vLwovLy8gKiBBIHRyYW5zaXRpdmUgZGVwZW5kZW5jeS4KLy8vICogQSBkaXJlY3QgbWFpbiBwYXRoIGRlcGVuZGVuY3kgdGhhdCBpcyBub3QgYSBjaGlsZCBvZiB0aGUgcHJvamVjdAovLy8gZGlyZWN0b3J5LgovLy8gKiBBIGRpcmVjdCBtYWluIHBhdGggZGVwZW5kZW5jeSB0aGF0IGlzIGEgY2hpbGQgb2YgdGhlIHByb2plY3QgZGlyZWN0b3J5LgovLy8gKiBBIGRpcmVjdCBtYWluIGRlcGVuZGVuY3kgdGhhdCBpcyBob3N0ZWQuCi8vLyAqIEEgZGlyZWN0IGRldiBtYWluIGRlcGVuZGVuY3kgdGhhdCBpcyBob3N0ZWQuCmNvbnN0IGZvb1BhdGhXaXRoSW50ZXJuYWxEZXBlbmRlbmN5ID0gJycnCnBhY2thZ2VzOgogIGFyZ3M6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogYXJncwogICAgICBzaGEyNTY6IGVlZjZjNDZiNjIyZTA0OTRhMzZjNWExMmQxMGQ3N2ZiNGU4NTU1MDFhOTFjMWI5ZWY5MzM5MzI2ZTU4ZjA1OTYKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIyLjQuMiIKICBmb286CiAgICBkZXBlbmRlbmN5OiAiZGlyZWN0IG1haW4iCiAgICBkZXNjcmlwdGlvbjoKICAgICAgcGF0aDogIi4uLy4uL2ZvbyIKICAgICAgcmVsYXRpdmU6IHRydWUKICAgIHNvdXJjZTogcGF0aAogICAgdmVyc2lvbjogIjAuMC4wIgogIGJhcjoKICAgIGRlcGVuZGVuY3k6ICJkaXJlY3QgbWFpbiIKICAgIGRlc2NyaXB0aW9uOgogICAgICBwYXRoOiAicGFja2FnZXMvYmFyIgogICAgICByZWxhdGl2ZTogdHJ1ZQogICAgc291cmNlOiBwYXRoCiAgICB2ZXJzaW9uOiAiMC4wLjAiCiAgbWFzb246CiAgICBkZXBlbmRlbmN5OiAiZGlyZWN0IG1haW4iCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogbWFzb24KICAgICAgc2hhMjU2OiBmZGM5ZWE5MDVlN2M2OTBmZTM5ZDJmOTk0NmI3YWVhZDg2ZmQ5NzZmOGVkZjk3ZDI1MjFhNjVkMjYwYmJmNTA5CiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMC4xLjAtZGV2LjUwIgogIHRlc3Q6CiAgICBkZXBlbmRlbmN5OiAiZGlyZWN0IGRldiIKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB0ZXN0CiAgICAgIHNoYTI1NjogIjliMGRkOGUzNmFmNGE1YjE1NjkwMjk5NDlkNTBhNTJjYjJhMmEyZmRhYTIwY2ViYjk2ZTY2MDNiOWFlMjQxZjkiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4yNC42IgpzZGtzOgogIGRhcnQ6ICI+PTMuMC4wIDw0LjAuMCIKJycnOwoKLy8vIEFuIGFydGlmaWNpYWxseSBjcmFmdGVkIGBwdWJzcGVjLmxvY2tgIGZpbGUgd2l0aDoKLy8vCi8vLyAqIEEgdHJhbnNpdGl2ZSBkZXBlbmRlbmN5LgovLy8gKiBBIGRpcmVjdCBtYWluIGRlcGVuZGVuY3kgdGhhdCBpcyBob3N0ZWQuCi8vLyAqIEEgZGlyZWN0IGRldiBtYWluIGRlcGVuZGVuY3kgdGhhdCBpcyBob3N0ZWQuCmNvbnN0IG5vUGF0aERlcGVuZGVuY2llcyA9ICcnJwpwYWNrYWdlczoKICBhcmdzOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGFyZ3MKICAgICAgc2hhMjU2OiBlZWY2YzQ2YjYyMmUwNDk0YTM2YzVhMTJkMTBkNzdmYjRlODU1NTAxYTkxYzFiOWVmOTMzOTMyNmU1OGYwNTk2CiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMi40LjIiCiAgbWFzb246CiAgICBkZXBlbmRlbmN5OiAiZGlyZWN0IG1haW4iCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogbWFzb24KICAgICAgc2hhMjU2OiBmZGM5ZWE5MDVlN2M2OTBmZTM5ZDJmOTk0NmI3YWVhZDg2ZmQ5NzZmOGVkZjk3ZDI1MjFhNjVkMjYwYmJmNTA5CiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMC4xLjAtZGV2LjUwIgogIHRlc3Q6CiAgICBkZXBlbmRlbmN5OiAiZGlyZWN0IGRldiIKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB0ZXN0CiAgICAgIHNoYTI1NjogIjliMGRkOGUzNmFmNGE1YjE1NjkwMjk5NDlkNTBhNTJjYjJhMmEyZmRhYTIwY2ViYjk2ZTY2MDNiOWFlMjQxZjkiCiAgICAgIHVybDogImh0dHBzOi8vcHViLmRldiIKICAgIHNvdXJjZTogaG9zdGVkCiAgICB2ZXJzaW9uOiAiMS4yNC42IgpzZGtzOgogIGRhcnQ6ICI+PTMuMC4wIDw0LjAuMCIKJycnOwo=", - "type": "text" + "type": "text", }, { "path": "test/src/create_bundle_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXJfaG9va3MvZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6bWFzb24vbWFzb24uZGFydCcgaGlkZSBjcmVhdGVCdW5kbGU7CmltcG9ydCAncGFja2FnZTptb2NrdGFpbC9tb2NrdGFpbC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOnBhdGgvcGF0aC5kYXJ0JyBhcyBwYXRoOwppbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwoKY2xhc3MgX01vY2tMb2dnZXIgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgTG9nZ2VyIHt9CgpjbGFzcyBfTW9ja1Byb2dyZXNzIGV4dGVuZHMgTW9jayBpbXBsZW1lbnRzIFByb2dyZXNzIHt9CgpjbGFzcyBfRmFrZUhvb2tDb250ZXh0IGV4dGVuZHMgRmFrZSBpbXBsZW1lbnRzIEhvb2tDb250ZXh0IHsKICBfRmFrZUhvb2tDb250ZXh0KHtMb2dnZXI/IGxvZ2dlcn0pIDogX2xvZ2dlciA9IGxvZ2dlciA/PyBfTW9ja0xvZ2dlcigpOwoKICBmaW5hbCBMb2dnZXIgX2xvZ2dlcjsKCiAgdmFyIF92YXJzID0gPFN0cmluZywgZHluYW1pYz57fTsKCiAgQG92ZXJyaWRlCiAgTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0IHZhcnMgPT4gX3ZhcnM7CgogIEBvdmVycmlkZQogIHNldCB2YXJzKE1hcDxTdHJpbmcsIGR5bmFtaWM+IHZhbHVlKSA9PiBfdmFycyA9IHZhbHVlOwoKICBAb3ZlcnJpZGUKICBMb2dnZXIgZ2V0IGxvZ2dlciA9PiBfbG9nZ2VyOwp9Cgp2b2lkIG1haW4oKSB7CiAgZ3JvdXAoJ2NyZWF0ZUJ1bmRsZScsICgpIHsKICAgIGxhdGUgSG9va0NvbnRleHQgY29udGV4dDsKICAgIGxhdGUgTG9nZ2VyIGxvZ2dlcjsKCiAgICBzZXRVcCgoKSB7CiAgICAgIGxvZ2dlciA9IF9Nb2NrTG9nZ2VyKCk7CiAgICAgIGNvbnRleHQgPSBfRmFrZUhvb2tDb250ZXh0KGxvZ2dlcjogbG9nZ2VyKTsKCiAgICAgIHdoZW4oKCkgPT4gbG9nZ2VyLnByb2dyZXNzKGFueSgpKSkudGhlblJldHVybihfTW9ja1Byb2dyZXNzKCkpOwogICAgfSk7CgogICAgdGVzdCgnZXhpdCgxKSBpZiBidW5kbGluZyB0aHJvd3MnLCAoKSBhc3luYyB7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGF3YWl0IGNyZWF0ZUJ1bmRsZSgKICAgICAgICBjb250ZXh0OiBjb250ZXh0LAogICAgICAgIHByb2plY3REaXJlY3Rvcnk6IERpcmVjdG9yeSgnL2ludmFsaWQvZGlyJyksCiAgICAgICAgYnVpbGREaXJlY3Rvcnk6IERpcmVjdG9yeSgnL2ludmFsaWQvZGlyL2J1aWxkJyksCiAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgZXF1YWxzKFsxXSkpOwogICAgICB2ZXJpZnkoKCkgPT4gbG9nZ2VyLmVycihhbnkoKSkpLmNhbGxlZCgxKTsKICAgIH0pOwoKICAgIHRlc3QoJ2RvZXMgbm90IHRocm93IHdoZW4gYnVuZGxpbmcgc3VjY2VlZHMnLCAoKSBhc3luYyB7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGZpbmFsIHByb2plY3REaXJlY3RvcnkgPSBEaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wU3luYygpOwogICAgICBmaW5hbCBkb3REYXJ0RnJvZ0RpciA9CiAgICAgICAgICBEaXJlY3RvcnkocGF0aC5qb2luKHByb2plY3REaXJlY3RvcnkucGF0aCwgJy5kYXJ0X2Zyb2cnKSkKICAgICAgICAgICAgLi5jcmVhdGVTeW5jKCk7CiAgICAgIGZpbmFsIGJ1aWxkRGlyZWN0b3J5ID0KICAgICAgICAgIERpcmVjdG9yeShwYXRoLmpvaW4ocHJvamVjdERpcmVjdG9yeS5wYXRoLCAnYnVpbGQnKSkuLmNyZWF0ZVN5bmMoKTsKICAgICAgZmluYWwgb2xkQnVpbGRBcnRpZmFjdCA9CiAgICAgICAgICBGaWxlKHBhdGguam9pbihidWlsZERpcmVjdG9yeS5wYXRoLCAnYXJ0aWZhY3QudHh0JykpLi5jcmVhdGVTeW5jKCk7CgogICAgICBhd2FpdCBjcmVhdGVCdW5kbGUoCiAgICAgICAgY29udGV4dDogY29udGV4dCwKICAgICAgICBwcm9qZWN0RGlyZWN0b3J5OiBwcm9qZWN0RGlyZWN0b3J5LAogICAgICAgIGJ1aWxkRGlyZWN0b3J5OiBidWlsZERpcmVjdG9yeSwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICApOwoKICAgICAgZXhwZWN0KGRvdERhcnRGcm9nRGlyLmV4aXN0c1N5bmMoKSwgaXNGYWxzZSk7CiAgICAgIGV4cGVjdChidWlsZERpcmVjdG9yeS5leGlzdHNTeW5jKCksIGlzVHJ1ZSk7CiAgICAgIGV4cGVjdChvbGRCdWlsZEFydGlmYWN0LmV4aXN0c1N5bmMoKSwgaXNGYWxzZSk7CiAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGlzRW1wdHkpOwogICAgICB2ZXJpZnlOZXZlcigoKSA9PiBsb2dnZXIuZXJyKGFueSgpKSk7CiAgICB9KTsKICB9KTsKfQo=", - "type": "text" + "type": "text", }, { "path": "test/src/create_external_packages_folder_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXJfaG9va3MvZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgppbXBvcnQgJy4uL3B1YnNwZWNfbG9ja3MuZGFydCc7Cgp2b2lkIG1haW4oKSB7CiAgZ3JvdXAoJ2NyZWF0ZUV4dGVybmFsUGFja2FnZXNGb2xkZXInLCAoKSB7CiAgICB0ZXN0KAogICAgICAnYnVuZGxlcyBleHRlcm5hbCBkZXBlbmRlbmNpZXMgd2l0aCBleHRlcm5hbCBkZXBlbmRlbmNpZXMnLAogICAgICAoKSBhc3luYyB7CiAgICAgICAgZmluYWwgcHJvamVjdERpcmVjdG9yeSA9IERpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKCk7CiAgICAgICAgRmlsZShwYXRoLmpvaW4ocHJvamVjdERpcmVjdG9yeS5wYXRoLCAncHVic3BlYy5sb2NrJykpCiAgICAgICAgICAgIC53cml0ZUFzU3RyaW5nU3luYyhmb29QYXRoKTsKICAgICAgICBmaW5hbCBjb3B5Q2FsbHMgPSA8U3RyaW5nPltdOwoKICAgICAgICBhd2FpdCBjcmVhdGVFeHRlcm5hbFBhY2thZ2VzRm9sZGVyKAogICAgICAgICAgcHJvamVjdERpcmVjdG9yeTogcHJvamVjdERpcmVjdG9yeSwKICAgICAgICAgIGJ1aWxkRGlyZWN0b3J5OiBEaXJlY3RvcnkocGF0aC5qb2luKHByb2plY3REaXJlY3RvcnkucGF0aCwgJ2J1aWxkJykpLAogICAgICAgICAgY29weVBhdGg6IChmcm9tLCB0bykgewogICAgICAgICAgICBjb3B5Q2FsbHMuYWRkKCckZnJvbSAtPiAkdG8nKTsKICAgICAgICAgICAgcmV0dXJuIEZ1dHVyZS52YWx1ZSgpOwogICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBmaW5hbCBmb29QYWNrYWdlRGlyZWN0b3J5ID0KICAgICAgICAgICAgcGF0aC5qb2luKHByb2plY3REaXJlY3RvcnkucGF0aCwgJy4uLy4uL2ZvbycpOwogICAgICAgIGZpbmFsIGZvb1BhY2thZ2VEaXJlY3RvcnlUYXJnZXQgPSBwYXRoLmpvaW4oCiAgICAgICAgICBwcm9qZWN0RGlyZWN0b3J5LnBhdGgsCiAgICAgICAgICAnYnVpbGQnLAogICAgICAgICAgJy5kYXJ0X2Zyb2dfcGF0aF9kZXBlbmRlbmNpZXMnLAogICAgICAgICAgJ2ZvbycsCiAgICAgICAgKTsKCiAgICAgICAgZmluYWwgc2Vjb25kRm9vUGFja2FnZURpcmVjdG9yeSA9CiAgICAgICAgICAgIHBhdGguam9pbihwcm9qZWN0RGlyZWN0b3J5LnBhdGgsICcuLi8uLi9mb28yJyk7CiAgICAgICAgZmluYWwgc2Vjb25kRm9vUGFja2FnZURpcmVjdG9yeVRhcmdldCA9IHBhdGguam9pbigKICAgICAgICAgIHByb2plY3REaXJlY3RvcnkucGF0aCwKICAgICAgICAgICdidWlsZCcsCiAgICAgICAgICAnLmRhcnRfZnJvZ19wYXRoX2RlcGVuZGVuY2llcycsCiAgICAgICAgICAnc2Vjb25kX2ZvbycsCiAgICAgICAgKTsKICAgICAgICBleHBlY3QoY29weUNhbGxzLCBbCiAgICAgICAgICAnJGZvb1BhY2thZ2VEaXJlY3RvcnkgLT4gJGZvb1BhY2thZ2VEaXJlY3RvcnlUYXJnZXQnLAogICAgICAgICAgJyRzZWNvbmRGb29QYWNrYWdlRGlyZWN0b3J5IC0+ICRzZWNvbmRGb29QYWNrYWdlRGlyZWN0b3J5VGFyZ2V0JywKICAgICAgICBdKTsKICAgICAgfSwKICAgICk7CgogICAgdGVzdCgKICAgICAgImRvbid0IGJ1bmRsZSBpbnRlcm5hbCBwYXRoIGRlcGVuZGVuY2llcyIsCiAgICAgICgpIGFzeW5jIHsKICAgICAgICBmaW5hbCBwcm9qZWN0RGlyZWN0b3J5ID0gRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcFN5bmMoKTsKICAgICAgICBGaWxlKHBhdGguam9pbihwcm9qZWN0RGlyZWN0b3J5LnBhdGgsICdwdWJzcGVjLmxvY2snKSkKICAgICAgICAgICAgLndyaXRlQXNTdHJpbmdTeW5jKGZvb1BhdGhXaXRoSW50ZXJuYWxEZXBlbmRlbmN5KTsKICAgICAgICBmaW5hbCBjb3B5Q2FsbHMgPSA8U3RyaW5nPltdOwoKICAgICAgICBhd2FpdCBjcmVhdGVFeHRlcm5hbFBhY2thZ2VzRm9sZGVyKAogICAgICAgICAgcHJvamVjdERpcmVjdG9yeTogcHJvamVjdERpcmVjdG9yeSwKICAgICAgICAgIGJ1aWxkRGlyZWN0b3J5OiBEaXJlY3RvcnkocGF0aC5qb2luKHByb2plY3REaXJlY3RvcnkucGF0aCwgJ2J1aWxkJykpLAogICAgICAgICAgY29weVBhdGg6IChmcm9tLCB0bykgewogICAgICAgICAgICBjb3B5Q2FsbHMuYWRkKCckZnJvbSAtPiAkdG8nKTsKICAgICAgICAgICAgcmV0dXJuIEZ1dHVyZS52YWx1ZSgpOwogICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBmaW5hbCBmcm9tID0gcGF0aC5qb2luKHByb2plY3REaXJlY3RvcnkucGF0aCwgJy4uLy4uL2ZvbycpOwogICAgICAgIGZpbmFsIHRvID0gcGF0aC5qb2luKAogICAgICAgICAgcHJvamVjdERpcmVjdG9yeS5wYXRoLAogICAgICAgICAgJ2J1aWxkJywKICAgICAgICAgICcuZGFydF9mcm9nX3BhdGhfZGVwZW5kZW5jaWVzJywKICAgICAgICAgICdmb28nLAogICAgICAgICk7CiAgICAgICAgZXhwZWN0KGNvcHlDYWxscywgWyckZnJvbSAtPiAkdG8nXSk7CiAgICAgIH0sCiAgICApOwogIH0pOwp9Cg==", - "type": "text" + "type": "text", }, { "path": "test/src/dart_pub_get_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXJfaG9va3MvZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6bWFzb24vbWFzb24uZGFydCc7CmltcG9ydCAncGFja2FnZTptb2NrdGFpbC9tb2NrdGFpbC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKCmNsYXNzIF9GYWtlSG9va0NvbnRleHQgZXh0ZW5kcyBGYWtlIGltcGxlbWVudHMgSG9va0NvbnRleHQgewogIF9GYWtlSG9va0NvbnRleHQoe0xvZ2dlcj8gbG9nZ2VyfSkgOiBfbG9nZ2VyID0gbG9nZ2VyID8/IF9Nb2NrTG9nZ2VyKCk7CgogIGZpbmFsIExvZ2dlciBfbG9nZ2VyOwoKICB2YXIgX3ZhcnMgPSA8U3RyaW5nLCBkeW5hbWljPnt9OwoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgdmFycyA9PiBfdmFyczsKCiAgQG92ZXJyaWRlCiAgc2V0IHZhcnMoTWFwPFN0cmluZywgZHluYW1pYz4gdmFsdWUpID0+IF92YXJzID0gdmFsdWU7CgogIEBvdmVycmlkZQogIExvZ2dlciBnZXQgbG9nZ2VyID0+IF9sb2dnZXI7Cn0KCmNsYXNzIF9Nb2NrTG9nZ2VyIGV4dGVuZHMgTW9jayBpbXBsZW1lbnRzIExvZ2dlciB7fQoKY2xhc3MgX01vY2tQcm9ncmVzcyBleHRlbmRzIE1vY2sgaW1wbGVtZW50cyBQcm9ncmVzcyB7fQoKdm9pZCBtYWluKCkgewogIGdyb3VwKCdkYXJ0UHViR2V0JywgKCkgewogICAgbGF0ZSBIb29rQ29udGV4dCBjb250ZXh0OwogICAgbGF0ZSBMb2dnZXIgbG9nZ2VyOwoKICAgIGNvbnN0IHByb2Nlc3NJZCA9IDQyOwogICAgZmluYWwgcHJvY2Vzc1Jlc3VsdCA9IFByb2Nlc3NSZXN1bHQoCiAgICAgIHByb2Nlc3NJZCwKICAgICAgRXhpdENvZGUuc3VjY2Vzcy5jb2RlLAogICAgICAnJywKICAgICAgJycsCiAgICApOwoKICAgIHNldFVwKCgpIHsKICAgICAgbG9nZ2VyID0gX01vY2tMb2dnZXIoKTsKICAgICAgY29udGV4dCA9IF9GYWtlSG9va0NvbnRleHQobG9nZ2VyOiBsb2dnZXIpOwoKICAgICAgd2hlbigoKSA9PiBsb2dnZXIucHJvZ3Jlc3MoYW55KCkpKS50aGVuUmV0dXJuKF9Nb2NrUHJvZ3Jlc3MoKSk7CiAgICB9KTsKCiAgICB0ZXN0KCdjb21wbGV0ZXMgd2hlbiBwcm9jZXNzIHN1Y2NlZWRzJywgKCkgYXN5bmMgewogICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwoKICAgICAgYXdhaXQgZGFydFB1YkdldCgKICAgICAgICBjb250ZXh0LAogICAgICAgIHdvcmtpbmdEaXJlY3Rvcnk6ICcuJywKICAgICAgICBydW5Qcm9jZXNzOiAoCiAgICAgICAgICBleGVjdXRhYmxlLAogICAgICAgICAgYXJncywgewogICAgICAgICAgU3RyaW5nPyB3b3JraW5nRGlyZWN0b3J5LAogICAgICAgICAgYm9vbD8gcnVuSW5TaGVsbCwKICAgICAgICB9KSBhc3luYyB7CiAgICAgICAgICBleHBlY3QoZXhlY3V0YWJsZSwgZXF1YWxzKCdkYXJ0JykpOwogICAgICAgICAgZXhwZWN0KGFyZ3MsIGVxdWFscyhbJ3B1YicsICdnZXQnXSkpOwogICAgICAgICAgZXhwZWN0KHdvcmtpbmdEaXJlY3RvcnksIGVxdWFscygnLicpKTsKICAgICAgICAgIGV4cGVjdChydW5JblNoZWxsLCBpc1RydWUpOwogICAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXN1bHQ7CiAgICAgICAgfSwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgICAgdmVyaWZ5TmV2ZXIoKCkgPT4gbG9nZ2VyLmVycihhbnkoKSkpOwogICAgfSk7CgogICAgdGVzdCgnZXhpdHMgd2hlbiBwcm9jZXNzIGZhaWxzJywgKCkgYXN5bmMgewogICAgICBjb25zdCBlcnJvciA9ICdvb3BzIHNvbWV0aGluZyB3ZW50IHdyb25nJzsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKCiAgICAgIGZpbmFsIHByb2Nlc3NSZXN1bHQgPSBQcm9jZXNzUmVzdWx0KAogICAgICAgIHByb2Nlc3NJZCwKICAgICAgICBFeGl0Q29kZS5zb2Z0d2FyZS5jb2RlLAogICAgICAgICcnLAogICAgICAgIGVycm9yLAogICAgICApOwoKICAgICAgYXdhaXQgZGFydFB1YkdldCgKICAgICAgICBjb250ZXh0LAogICAgICAgIHdvcmtpbmdEaXJlY3Rvcnk6ICcuJywKICAgICAgICBydW5Qcm9jZXNzOiAoCiAgICAgICAgICBleGVjdXRhYmxlLAogICAgICAgICAgYXJncywgewogICAgICAgICAgU3RyaW5nPyB3b3JraW5nRGlyZWN0b3J5LAogICAgICAgICAgYm9vbD8gcnVuSW5TaGVsbCwKICAgICAgICB9KSBhc3luYyB7CiAgICAgICAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdDsKICAgICAgICB9LAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICk7CiAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGVxdWFscyhbRXhpdENvZGUuc29mdHdhcmUuY29kZV0pKTsKICAgICAgdmVyaWZ5KCgpID0+IGxvZ2dlci5lcnIoZXJyb3IpKS5jYWxsZWQoMSk7CiAgICB9KTsKCiAgICB0ZXN0KCdleGl0cyB3aGVuIFByb2Nlc3NFeGNlcHRpb24gb2NjdXJzJywgKCkgYXN5bmMgewogICAgICBjb25zdCBlcnJvciA9ICdvb3BzIHNvbWV0aGluZyB3ZW50IHdyb25nJzsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgYXdhaXQgZGFydFB1YkdldCgKICAgICAgICBjb250ZXh0LAogICAgICAgIHdvcmtpbmdEaXJlY3Rvcnk6ICcuJywKICAgICAgICBydW5Qcm9jZXNzOiAoCiAgICAgICAgICBleGVjdXRhYmxlLAogICAgICAgICAgYXJncywgewogICAgICAgICAgU3RyaW5nPyB3b3JraW5nRGlyZWN0b3J5LAogICAgICAgICAgYm9vbD8gcnVuSW5TaGVsbCwKICAgICAgICB9KSBhc3luYyB7CiAgICAgICAgICB0aHJvdyBQcm9jZXNzRXhjZXB0aW9uKAogICAgICAgICAgICAnZGFydCcsCiAgICAgICAgICAgIFsncHViJywgJ2dldCddLAogICAgICAgICAgICBlcnJvciwKICAgICAgICAgICAgRXhpdENvZGUuc29mdHdhcmUuY29kZSwKICAgICAgICAgICk7CiAgICAgICAgfSwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBlcXVhbHMoW0V4aXRDb2RlLnNvZnR3YXJlLmNvZGVdKSk7CiAgICAgIHZlcmlmeSgoKSA9PiBsb2dnZXIuZXJyKGVycm9yKSkuY2FsbGVkKDEpOwogICAgfSk7CiAgfSk7Cn0K", - "type": "text" + "type": "text", }, { "path": "test/src/exit_overrides_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXJfaG9va3MvZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwoKdm9pZCBtYWluKCkgewogIGdyb3VwKCdFeGl0T3ZlcnJpZGVzJywgKCkgewogICAgZ3JvdXAoJ3J1blpvbmVkJywgKCkgewogICAgICB0ZXN0KCd1c2VzIGRlZmF1bHQgZXhpdCB3aGVuIG5vdCBzcGVjaWZpZWQnLCAoKSB7CiAgICAgICAgRXhpdE92ZXJyaWRlcy5ydW5ab25lZCgoKSB7CiAgICAgICAgICBmaW5hbCBvdmVycmlkZXMgPSBFeGl0T3ZlcnJpZGVzLmN1cnJlbnQ7CiAgICAgICAgICBleHBlY3Qob3ZlcnJpZGVzIS5leGl0LCBlcXVhbHMoZXhpdCkpOwogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIHRlc3QoJ3VzZXMgY3VzdG9tIGV4aXQgd2hlbiBzcGVjaWZpZWQnLCAoKSB7CiAgICAgICAgRXhpdE92ZXJyaWRlcy5ydW5ab25lZCgKICAgICAgICAgICgpIHsKICAgICAgICAgICAgZmluYWwgb3ZlcnJpZGVzID0gRXhpdE92ZXJyaWRlcy5jdXJyZW50OwogICAgICAgICAgICBleHBlY3Qob3ZlcnJpZGVzIS5leGl0LCBpc05vdChlcXVhbHMoZXhpdCkpKTsKICAgICAgICAgIH0sCiAgICAgICAgICBleGl0OiAoXykge30sCiAgICAgICAgKTsKICAgICAgfSk7CiAgICB9KTsKICB9KTsKfQo=", - "type": "text" + "type": "text", }, { "path": "test/src/get_internal_path_dependencies_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXJfaG9va3MvZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7Cgp2b2lkIG1haW4oKSB7CiAgZ3JvdXAoJ2dldFBhdGhEZXBlbmRlbmNpZXMnLCAoKSB7CiAgICB0ZXN0KCdyZXR1cm5zIG5vdGhpbmcgd2hlbiB0aGVyZSBhcmUgbm8gcGF0aCBkZXBlbmRlbmNpZXMnLCAoKSB7CiAgICAgIGZpbmFsIGRpcmVjdG9yeSA9IERpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKCk7CiAgICAgIEZpbGUocGF0aC5qb2luKGRpcmVjdG9yeS5wYXRoLCAncHVic3BlYy5sb2NrJykpLndyaXRlQXNTdHJpbmdTeW5jKAogICAgICAgICcnJwpwYWNrYWdlczoKICB0ZXN0OgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGFuYWx5emVyCiAgICAgIHNoYTI1NjogZjg1NTY2ZWM3YjNkMjVjYmVhNjBmN2RkNGYxNTdjNTAyNWYyZjE5MjMzY2E0ZmVlZWQzM2I2MTZjNzhhMjZhMwogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjYuMS4wIgogIG1hc29uOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IGFuYWx5emVyCiAgICAgIHNoYTI1NjogZjg1NTY2ZWM3YjNkMjVjYmVhNjBmN2RkNGYxNTdjNTAyNWYyZjE5MjMzY2E0ZmVlZWQzM2I2MTZjNzhhMjZhMwogICAgICB1cmw6ICJodHRwczovL3B1Yi5kZXYiCiAgICBzb3VyY2U6IGhvc3RlZAogICAgdmVyc2lvbjogIjYuMS4wIgonJycsCiAgICAgICk7CiAgICAgIGV4cGVjdChnZXRJbnRlcm5hbFBhdGhEZXBlbmRlbmNpZXMoZGlyZWN0b3J5KSwgY29tcGxldGlvbihpc0VtcHR5KSk7CiAgICAgIGRpcmVjdG9yeS5kZWxldGUocmVjdXJzaXZlOiB0cnVlKS5pZ25vcmUoKTsKICAgIH0pOwoKICAgIHRlc3QoJ3JldHVybnMgY29ycmVjdCBwYXRoIGRlcGVuZGVuY2llcycsICgpIHsKICAgICAgZmluYWwgZGlyZWN0b3J5ID0gRGlyZWN0b3J5LnN5c3RlbVRlbXAuY3JlYXRlVGVtcFN5bmMoKTsKICAgICAgRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LnBhdGgsICdwdWJzcGVjLmxvY2snKSkud3JpdGVBc1N0cmluZ1N5bmMoCiAgICAgICAgJycnCnBhY2thZ2VzOgogIGRhcnRfZnJvZzoKICAgIGRlcGVuZGVuY3k6ICJkaXJlY3QgbWFpbiIKICAgIGRlc2NyaXB0aW9uOgogICAgICBwYXRoOiAicGF0aC90by9kYXJ0X2Zyb2ciCiAgICAgIHJlbGF0aXZlOiB0cnVlCiAgICBzb3VyY2U6IHBhdGgKICAgIHZlcnNpb246ICIwLjAuMCIKICBkYXJ0X2Zyb2dfZ2VuOgogICAgZGVwZW5kZW5jeTogImRpcmVjdCBtYWluIgogICAgZGVzY3JpcHRpb246CiAgICAgIHBhdGg6ICJwYXRoL3RvL2RhcnRfZnJvZ19nZW4iCiAgICAgIHJlbGF0aXZlOiB0cnVlCiAgICBzb3VyY2U6IHBhdGgKICAgIHZlcnNpb246ICIwLjAuMCIKJycnLAogICAgICApOwogICAgICBleHBlY3QoCiAgICAgICAgZ2V0SW50ZXJuYWxQYXRoRGVwZW5kZW5jaWVzKGRpcmVjdG9yeSksCiAgICAgICAgY29tcGxldGlvbigKICAgICAgICAgIGVxdWFscyhbJ3BhdGgvdG8vZGFydF9mcm9nJywgJ3BhdGgvdG8vZGFydF9mcm9nX2dlbiddKSwKICAgICAgICApLAogICAgICApOwogICAgICBkaXJlY3RvcnkuZGVsZXRlKHJlY3Vyc2l2ZTogdHJ1ZSkuaWdub3JlKCk7CiAgICB9KTsKICB9KTsKfQo=", - "type": "text" + "type": "text", }, { "path": "test/src/pubspec_lock/pubspec_lock_test.dart", "data": "Ly8gaWdub3JlX2Zvcl9maWxlOiBwcmVmZXJfY29uc3RfY29uc3RydWN0b3JzCgppbXBvcnQgJ3BhY2thZ2U6ZGFydF9mcm9nX3Byb2Rfc2VydmVyX2hvb2tzL3NyYy9wdWJzcGVjX2xvY2svcHVic3BlY19sb2NrLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6eWFtbC95YW1sLmRhcnQnOwoKdm9pZCBtYWluKCkgewogIGdyb3VwKCckUHVic3BlY0xvY2snLCAoKSB7CiAgICBncm91cCgnZnJvbVN0cmluZycsICgpIHsKICAgICAgdGVzdCgncGFyc2VzIGNvcnJlY3RseScsICgpIHsKICAgICAgICBmaW5hbCBwdWJzcGVjTG9jayA9IFB1YnNwZWNMb2NrLmZyb21TdHJpbmcoX3B1YnNwZWNMb2NrQ29udGVudCk7CgogICAgICAgIGV4cGVjdCgKICAgICAgICAgIHB1YnNwZWNMb2NrLnBhY2thZ2VzLAogICAgICAgICAgZXF1YWxzKAogICAgICAgICAgICBjb25zdCBbCiAgICAgICAgICAgICAgUHVic3BlY0xvY2tQYWNrYWdlKAogICAgICAgICAgICAgICAgbmFtZTogJ3ZlcnlfZ29vZF90ZXN0X3J1bm5lcicsCiAgICAgICAgICAgICAgICB0eXBlOiBQdWJzcGVjTG9ja1BhY2thZ2VEZXBlbmRlbmN5VHlwZS5kaXJlY3RNYWluLAogICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgUHVic3BlY0xvY2tQYWNrYWdlKAogICAgICAgICAgICAgICAgbmFtZTogJ3ZlcnlfZ29vZF9hbmFseXNpcycsCiAgICAgICAgICAgICAgICB0eXBlOiBQdWJzcGVjTG9ja1BhY2thZ2VEZXBlbmRlbmN5VHlwZS5kaXJlY3REZXYsCiAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICBQdWJzcGVjTG9ja1BhY2thZ2UoCiAgICAgICAgICAgICAgICBuYW1lOiAneWFtbCcsCiAgICAgICAgICAgICAgICB0eXBlOiBQdWJzcGVjTG9ja1BhY2thZ2VEZXBlbmRlbmN5VHlwZS50cmFuc2l0aXZlLAogICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgUHVic3BlY0xvY2tQYWNrYWdlKAogICAgICAgICAgICAgICAgbmFtZTogJ3BhdGgnLAogICAgICAgICAgICAgICAgdHlwZTogUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUuZGlyZWN0T3ZlcnJpZGRlbiwKICAgICAgICAgICAgICApLAogICAgICAgICAgICAgIFB1YnNwZWNMb2NrUGFja2FnZSgKICAgICAgICAgICAgICAgIG5hbWU6ICdmb28nLAogICAgICAgICAgICAgICAgdHlwZTogUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUuZGlyZWN0TWFpbiwKICAgICAgICAgICAgICAgIHBhdGhEZXNjcmlwdGlvbjogUHVic3BlY1BhY2thZ2VQYXRoRGVzY3JpcHRpb24oCiAgICAgICAgICAgICAgICAgIHBhdGg6ICdwYWNrYWdlcy9mb28nLAogICAgICAgICAgICAgICAgICByZWxhdGl2ZTogdHJ1ZSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICBQdWJzcGVjTG9ja1BhY2thZ2UoCiAgICAgICAgICAgICAgICBuYW1lOiAneWFtbDInLAogICAgICAgICAgICAgICAgdHlwZTogUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUudHJhbnNpdGl2ZSwKICAgICAgICAgICAgICApLAogICAgICAgICAgICBdLAogICAgICAgICAgKSwKICAgICAgICApOwogICAgICB9KTsKCiAgICAgIHRlc3QoJ3Rocm93cyBhICRQdWJzcGVjTG9ja1BhcnNlRXhjZXB0aW9uIHdoZW4gY29udGVudCBpcyBlbXB0eScsICgpIHsKICAgICAgICBleHBlY3QoCiAgICAgICAgICAoKSA9PiBQdWJzcGVjTG9jay5mcm9tU3RyaW5nKCcnKSwKICAgICAgICAgIHRocm93c0EoaXNBPFB1YnNwZWNMb2NrUGFyc2VFeGNlcHRpb24+KCkpLAogICAgICAgICk7CiAgICAgIH0pOwoKICAgICAgdGVzdCgncmV0dXJucyBlbXB0eSBQdWJzcGVjTG9jayB3aGVuIGNvbnRlbnQgaGFzIG5vIHBhY2thZ2VzIGVudHJ5JywgKCkgewogICAgICAgIGZpbmFsIHB1YnNwZWNMb2NrID0gUHVic3BlY0xvY2suZnJvbVN0cmluZyhfZW1wdHlQdWJzcGVjTG9ja0NvbnRlbnQpOwogICAgICAgIGV4cGVjdChwdWJzcGVjTG9jay5wYWNrYWdlcywgaXNFbXB0eSk7CiAgICAgIH0pOwogICAgfSk7CiAgfSk7CgogIGdyb3VwKCckUHVic3BlY0xvY2tQYWNrYWdlJywgKCkgewogICAgdGVzdCgnY2FuIGJlIGluc3RhbnRpYXRlZCcsICgpIHsKICAgICAgZXhwZWN0KAogICAgICAgIFB1YnNwZWNMb2NrUGFja2FnZSgKICAgICAgICAgIG5hbWU6ICdmb28nLAogICAgICAgICAgdHlwZTogUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUuZGlyZWN0TWFpbiwKICAgICAgICApLAogICAgICAgIGlzQTxQdWJzcGVjTG9ja1BhY2thZ2U+KCksCiAgICAgICk7CiAgICB9KTsKCiAgICB0ZXN0KCdzdXBwb3J0cyB2YWx1ZSBlcXVhbGl0eScsICgpIHsKICAgICAgZmluYWwgcGFja2FnZTEgPSBQdWJzcGVjTG9ja1BhY2thZ2UoCiAgICAgICAgbmFtZTogJ2ZvbycsCiAgICAgICAgdHlwZTogUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUuZGlyZWN0TWFpbiwKICAgICAgKTsKICAgICAgZmluYWwgcGFja2FnZTIgPSBQdWJzcGVjTG9ja1BhY2thZ2UoCiAgICAgICAgbmFtZTogJ2ZvbycsCiAgICAgICAgdHlwZTogUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUuZGlyZWN0TWFpbiwKICAgICAgKTsKICAgICAgZmluYWwgcGFja2FnZTMgPSBQdWJzcGVjTG9ja1BhY2thZ2UoCiAgICAgICAgbmFtZTogJ2JhcicsCiAgICAgICAgdHlwZTogUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUudHJhbnNpdGl2ZSwKICAgICAgKTsKCiAgICAgIGV4cGVjdChwYWNrYWdlMSwgZXF1YWxzKHBhY2thZ2UyKSk7CiAgICAgIGV4cGVjdChwYWNrYWdlMSwgaXNOb3QoZXF1YWxzKHBhY2thZ2UzKSkpOwogICAgICBleHBlY3QocGFja2FnZTIsIGlzTm90KGVxdWFscyhwYWNrYWdlMykpKTsKICAgIH0pOwogIH0pOwoKICBncm91cCgnJFB1YnNwZWNMb2NrUGFja2FnZURlcGVuZGVuY3lUeXBlJywgKCkgewogICAgZ3JvdXAoJ3BhcnNlJywgKCkgewogICAgICB0ZXN0KCdwYXJzZXMgc3VjY2Vzc2Z1bGx5IGBkaXJlY3QgbWFpbmAnLCAoKSB7CiAgICAgICAgZXhwZWN0KAogICAgICAgICAgUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUucGFyc2UoJ2RpcmVjdCBtYWluJyksCiAgICAgICAgICBlcXVhbHMoUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUuZGlyZWN0TWFpbiksCiAgICAgICAgKTsKICAgICAgfSk7CgogICAgICB0ZXN0KCdwYXJzZXMgc3VjY2Vzc2Z1bGx5IGBkaXJlY3QgZGV2YCcsICgpIHsKICAgICAgICBleHBlY3QoCiAgICAgICAgICBQdWJzcGVjTG9ja1BhY2thZ2VEZXBlbmRlbmN5VHlwZS5wYXJzZSgnZGlyZWN0IGRldicpLAogICAgICAgICAgZXF1YWxzKFB1YnNwZWNMb2NrUGFja2FnZURlcGVuZGVuY3lUeXBlLmRpcmVjdERldiksCiAgICAgICAgKTsKICAgICAgfSk7CgogICAgICB0ZXN0KCdwYXJzZXMgc3VjY2Vzc2Z1bGx5IGBkaXJlY3Qgb3ZlcnJpZGRlbmAnLCAoKSB7CiAgICAgICAgZXhwZWN0KAogICAgICAgICAgUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUucGFyc2UoJ2RpcmVjdCBvdmVycmlkZGVuJyksCiAgICAgICAgICBlcXVhbHMoUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUuZGlyZWN0T3ZlcnJpZGRlbiksCiAgICAgICAgKTsKICAgICAgfSk7CgogICAgICB0ZXN0KCdwYXJzZXMgc3VjY2Vzc2Z1bGx5IGB0cmFuc2l0aXZlYCcsICgpIHsKICAgICAgICBleHBlY3QoCiAgICAgICAgICBQdWJzcGVjTG9ja1BhY2thZ2VEZXBlbmRlbmN5VHlwZS5wYXJzZSgndHJhbnNpdGl2ZScpLAogICAgICAgICAgZXF1YWxzKFB1YnNwZWNMb2NrUGFja2FnZURlcGVuZGVuY3lUeXBlLnRyYW5zaXRpdmUpLAogICAgICAgICk7CiAgICAgIH0pOwoKICAgICAgdGVzdCgndGhyb3dzIGEgJEFyZ3VtZW50RXJyb3Igd2hlbiB0eXBlIGlzIGludmFsaWQnLCAoKSB7CiAgICAgICAgZXhwZWN0KAogICAgICAgICAgKCkgPT4gUHVic3BlY0xvY2tQYWNrYWdlRGVwZW5kZW5jeVR5cGUucGFyc2UoJ2ludmFsaWQnKSwKICAgICAgICAgIHRocm93c0EoaXNBPEFyZ3VtZW50RXJyb3I+KCkpLAogICAgICAgICk7CiAgICAgIH0pOwogICAgfSk7CiAgfSk7CgogIGdyb3VwKCckUHVic3BlY1BhY2thZ2VQYXRoRGVzY3JpcHRpb24nLCAoKSB7CiAgICB0ZXN0KCdjYW4gYmUgaW5zdGFudGlhdGVkJywgKCkgewogICAgICBleHBlY3QoCiAgICAgICAgUHVic3BlY1BhY2thZ2VQYXRoRGVzY3JpcHRpb24oCiAgICAgICAgICBwYXRoOiAncGFja2FnZXMvZm9vJywKICAgICAgICAgIHJlbGF0aXZlOiB0cnVlLAogICAgICAgICksCiAgICAgICAgaXNBPFB1YnNwZWNQYWNrYWdlUGF0aERlc2NyaXB0aW9uPigpLAogICAgICApOwogICAgfSk7CgogICAgdGVzdCgnc3VwcG9ydHMgdmFsdWUgZXF1YWxpdHknLCAoKSB7CiAgICAgIGZpbmFsIGRlc2NyaXB0aW9uMSA9IFB1YnNwZWNQYWNrYWdlUGF0aERlc2NyaXB0aW9uKAogICAgICAgIHBhdGg6ICdwYWNrYWdlcy9mb28nLAogICAgICAgIHJlbGF0aXZlOiB0cnVlLAogICAgICApOwogICAgICBmaW5hbCBkZXNjcmlwdGlvbjIgPSBQdWJzcGVjUGFja2FnZVBhdGhEZXNjcmlwdGlvbigKICAgICAgICBwYXRoOiAncGFja2FnZXMvZm9vJywKICAgICAgICByZWxhdGl2ZTogdHJ1ZSwKICAgICAgKTsKICAgICAgZmluYWwgZGVzY3JpcHRpb24zID0gUHVic3BlY1BhY2thZ2VQYXRoRGVzY3JpcHRpb24oCiAgICAgICAgcGF0aDogJ3BhY2thZ2VzL2JhcicsCiAgICAgICAgcmVsYXRpdmU6IHRydWUsCiAgICAgICk7CiAgICAgIGZpbmFsIGRlc2NyaXB0aW9uNCA9IFB1YnNwZWNQYWNrYWdlUGF0aERlc2NyaXB0aW9uKAogICAgICAgIHBhdGg6ICdwYWNrYWdlcy9mb28nLAogICAgICAgIHJlbGF0aXZlOiBmYWxzZSwKICAgICAgKTsKCiAgICAgIGV4cGVjdChkZXNjcmlwdGlvbjEsIGVxdWFscyhkZXNjcmlwdGlvbjIpKTsKICAgICAgZXhwZWN0KGRlc2NyaXB0aW9uMSwgaXNOb3QoZXF1YWxzKGRlc2NyaXB0aW9uMykpKTsKICAgICAgZXhwZWN0KGRlc2NyaXB0aW9uMSwgaXNOb3QoZXF1YWxzKGRlc2NyaXB0aW9uNCkpKTsKICAgICAgZXhwZWN0KGRlc2NyaXB0aW9uMywgaXNOb3QoZXF1YWxzKGRlc2NyaXB0aW9uNCkpKTsKICAgIH0pOwoKICAgIGdyb3VwKCd0cnlQYXJzZScsICgpIHsKICAgICAgdGVzdCgncGFyc2VzJywgKCkgewogICAgICAgIGZpbmFsIGRhdGEgPSBsb2FkWWFtbCgKICAgICAgICAgICcnJwpwYXRoOiAicGFja2FnZXMvZm9vIgpyZWxhdGl2ZTogdHJ1ZQogICAgICAgICAgICAnJycsCiAgICAgICAgKSBhcyBZYW1sTWFwOwoKICAgICAgICBmaW5hbCBkZXNjcmlwdGlvbiA9IFB1YnNwZWNQYWNrYWdlUGF0aERlc2NyaXB0aW9uLnRyeVBhcnNlKGRhdGEpOwoKICAgICAgICBleHBlY3QoCiAgICAgICAgICBkZXNjcmlwdGlvbiwKICAgICAgICAgIGVxdWFscygKICAgICAgICAgICAgUHVic3BlY1BhY2thZ2VQYXRoRGVzY3JpcHRpb24oCiAgICAgICAgICAgICAgcGF0aDogJ3BhY2thZ2VzL2ZvbycsCiAgICAgICAgICAgICAgcmVsYXRpdmU6IHRydWUsCiAgICAgICAgICAgICksCiAgICAgICAgICApLAogICAgICAgICk7CiAgICAgIH0pOwoKICAgICAgZ3JvdXAoJ3JldHVybnMgbnVsbCcsICgpIHsKICAgICAgICB0ZXN0KCd3aGVuIG1pc3NpbmcgInBhdGgiJywgKCkgewogICAgICAgICAgZmluYWwgZGF0YSA9IGxvYWRZYW1sKAogICAgICAgICAgICAnJycKcmVsYXRpdmU6IHRydWUKICAgICAgICAgICAgJycnLAogICAgICAgICAgKSBhcyBZYW1sTWFwOwoKICAgICAgICAgIGZpbmFsIGRlc2NyaXB0aW9uID0gUHVic3BlY1BhY2thZ2VQYXRoRGVzY3JpcHRpb24udHJ5UGFyc2UoZGF0YSk7CgogICAgICAgICAgZXhwZWN0KGRlc2NyaXB0aW9uLCBpc051bGwpOwogICAgICAgIH0pOwoKICAgICAgICB0ZXN0KCd3aGVuICJwYXRoIiBpcyBub3QgYSBTdHJpbmcnLCAoKSB7CiAgICAgICAgICBmaW5hbCBkYXRhID0gbG9hZFlhbWwoCiAgICAgICAgICAgICcnJwpwYXRoOiAxCnJlbGF0aXZlOiB0cnVlCiAgICAgICAgICAgICcnJywKICAgICAgICAgICkgYXMgWWFtbE1hcDsKCiAgICAgICAgICBmaW5hbCBkZXNjcmlwdGlvbiA9IFB1YnNwZWNQYWNrYWdlUGF0aERlc2NyaXB0aW9uLnRyeVBhcnNlKGRhdGEpOwoKICAgICAgICAgIGV4cGVjdChkZXNjcmlwdGlvbiwgaXNOdWxsKTsKICAgICAgICB9KTsKCiAgICAgICAgdGVzdCgnd2hlbiBtaXNzaW5nICJyZWxhdGl2ZSInLCAoKSB7CiAgICAgICAgICBmaW5hbCBkYXRhID0gbG9hZFlhbWwoCiAgICAgICAgICAgICcnJwpwYXRoOiAicGFja2FnZXMvZm9vIgogICAgICAgICAgICAnJycsCiAgICAgICAgICApIGFzIFlhbWxNYXA7CgogICAgICAgICAgZmluYWwgZGVzY3JpcHRpb24gPSBQdWJzcGVjUGFja2FnZVBhdGhEZXNjcmlwdGlvbi50cnlQYXJzZShkYXRhKTsKCiAgICAgICAgICBleHBlY3QoZGVzY3JpcHRpb24sIGlzTnVsbCk7CiAgICAgICAgfSk7CgogICAgICAgIHRlc3QoJ3doZW4gInJlbGF0aXZlIiBpcyBub3QgYSBib29sJywgKCkgewogICAgICAgICAgZmluYWwgZGF0YSA9IGxvYWRZYW1sKAogICAgICAgICAgICAnJycKcGF0aDogInBhY2thZ2VzL2ZvbyIKcmVsYXRpdmU6IDUKICAgICAgICAgICAgJycnLAogICAgICAgICAgKSBhcyBZYW1sTWFwOwoKICAgICAgICAgIGZpbmFsIGRlc2NyaXB0aW9uID0gUHVic3BlY1BhY2thZ2VQYXRoRGVzY3JpcHRpb24udHJ5UGFyc2UoZGF0YSk7CgogICAgICAgICAgZXhwZWN0KGRlc2NyaXB0aW9uLCBpc051bGwpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pOwogIH0pOwp9CgovLy8gQW4gZXhhbXBsZSBwdWJzcGVjLmxvY2sgY29udGVudCB1c2VkIHRvIHRlc3QgdGhlIFtQdWJzcGVjTG9ja10gY2xhc3MuCi8vLwovLy8gSXQgaGFzIGJlZW4gYXJ0aWZpY2lhbGx5IGNyYWZ0ZWQgdG8gaW5jbHVkZToKLy8vIC0gb25lIHB1YiBob3N0ZWQgZGlyZWN0IG1haW4gcGFja2FnZSBlbnRyeQovLy8gLSBvbmUgcHViIGhvc3RlZCBkaXJlY3QgZGV2IHBhY2thZ2UgZW50cnkKLy8vIC0gb25lIHB1YiBob3N0ZWQgdHJhbnNpdGl2ZSBwYWNrYWdlIGVudHJ5Ci8vLyAtIG9uZSBwdWIgaG9zdGVkIG92ZXJyaWRkZW4gcGFja2FnZSBlbnRyeQovLy8gLSBvbmUgcGF0aCBkaXJlY3QgbWFpbiBwYWNrYWdlIGVudHJ5Ci8vLyAtIG9uZSBub3QgcHViIGhvc3RlZCB0cmFuc2l0aXZlIHBhY2thZ2UgZW50cnkKLy8vIC0gb25lIGludmFsaWQgcGFja2FnZSBlbnRyeQpjb25zdCBfcHVic3BlY0xvY2tDb250ZW50ID0gJycnCnBhY2thZ2VzOgogIHZlcnlfZ29vZF90ZXN0X3J1bm5lcjoKICAgIGRlcGVuZGVuY3k6ICJkaXJlY3QgbWFpbiIKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB2ZXJ5X2dvb2RfdGVzdF9ydW5uZXIKICAgICAgc2hhMjU2OiAiNGQ0MWU1ZDc2NzdkMjU5YjlhMTU5OWM3ODY0NWFjMmQzNmJjMmJkNmZmNzc3MzUwN2JjYjBiYWI0MTQxN2ZlMiIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIwLjEuMiIKICB2ZXJ5X2dvb2RfYW5hbHlzaXM6CiAgICBkZXBlbmRlbmN5OiAiZGlyZWN0IGRldiIKICAgIGRlc2NyaXB0aW9uOgogICAgICBuYW1lOiB2ZXJ5X2dvb2RfYW5hbHlzaXMKICAgICAgc2hhMjU2OiAiOWFlN2YzYTNiZDU3NjRmYjAyMWIzMzVjYTI4YTM0ZjA0MGNkMGFiNmVlYzAwYTFiMjEzYjQ0NWRhZTU4YTRiOCIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICI1LjEuMCIKICB5YW1sOgogICAgZGVwZW5kZW5jeTogdHJhbnNpdGl2ZQogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHlhbWwKICAgICAgc2hhMjU2OiAiNzU3Njk1MDFlYTM0ODlmY2E1NjYwMWZmMzM0NTRmZTQ1NTA3ZWEzYmZiMDE0MTYxYWJjM2I0M2FlMjU5ODlkNSIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIzLjEuMiIKICBwYXRoOgogICAgZGVwZW5kZW5jeTogImRpcmVjdCBvdmVycmlkZGVuIgogICAgZGVzY3JpcHRpb246CiAgICAgIG5hbWU6IHBhdGgKICAgICAgc2hhMjU2OiAiMDg3Y2U0OWMzZjBkYzM5MTgwYmVmZWZjNjBmZGI0YWNkOGY4NjIwZTU2ODJmZTI0NzZhZmQwYjM2ODhiYjRhZiIKICAgICAgdXJsOiAiaHR0cHM6Ly9wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIxLjkuMCIKICBmb286CiAgICBkZXBlbmRlbmN5OiAiZGlyZWN0IG1haW4iCiAgICBkZXNjcmlwdGlvbjoKICAgICAgcGF0aDogInBhY2thZ2VzL2ZvbyIKICAgICAgcmVsYXRpdmU6IHRydWUKICAgIHNvdXJjZTogcGF0aAogICAgdmVyc2lvbjogIjEuMC4wKzEiCiAgeWFtbDI6CiAgICBkZXBlbmRlbmN5OiB0cmFuc2l0aXZlCiAgICBkZXNjcmlwdGlvbjoKICAgICAgbmFtZTogeWFtbAogICAgICBzaGEyNTY6ICI3NTc2OTUwMWVhMzQ4OWZjYTU2NjAxZmYzMzQ1NGZlNDU1MDdlYTNiZmIwMTQxNjFhYmMzYjQzYWUyNTk4OWQ1IgogICAgICB1cmw6ICJodHRwczovL25vdC1wdWIuZGV2IgogICAgc291cmNlOiBob3N0ZWQKICAgIHZlcnNpb246ICIzLjEuMiIKICBiYWRfcGFja2FnZToKICAgIG5vdF9kZXBlbmRlbmN5OiAiYmFkIgpzZGtzOgogIGRhcnQ6ICI+PTMuMS4wIDw0LjAuMCIKCicnJzsKCi8vLyBBIHZhbGlkIHB1YnNwZWMgbG9jayBmaWxlIHdpdGggbm8gcGFja2FnZXMuCmNvbnN0IF9lbXB0eVB1YnNwZWNMb2NrQ29udGVudCA9ICcnJwpzZGtzOgogIGRhcnQ6ICI+PTMuMS4wIDw0LjAuMCIKCicnJzsK", - "type": "text" - } + "type": "text", + }, ], "name": "dart_frog_prod_server", "description": "A dart_frog prod server", @@ -154,26 +154,26 @@ final dartFrogProdServerBundle = MasonBundle.fromJson({ "path": "README.md", "data": "IyBkYXJ0X2Zyb2dfcHJvZF9zZXJ2ZXIKClshW1Bvd2VyZWQgYnkgTWFzb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZW5kcG9pbnQ/dXJsPWh0dHBzJTNBJTJGJTJGdGlueXVybC5jb20lMkZtYXNvbi1iYWRnZSldKGh0dHBzOi8vZ2l0aHViLmNvbS9mZWxhbmdlbC9tYXNvbikKCkEgYGRhcnRfZnJvZ2AgcHJvZHVjdGlvbiBzZXJ2ZXIuCgpfR2VuZXJhdGVkIGJ5IFttYXNvbl1bMV0g8J+nsV8KClsxXTogaHR0cHM6Ly9naXRodWIuY29tL2ZlbGFuZ2VsL21hc29uCg==", - "type": "text" + "type": "text", }, "changelog": { "path": "CHANGELOG.md", "data": "IyAwLjEuMCsxCgotIGZlYXQ6IGJhc2ljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZGFydCBmcm9nIHByb2R1Y3Rpb24gc2VydmVyCg==", - "type": "text" + "type": "text", }, "license": { "path": "LICENSE", "data": "TUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAyMiBWZXJ5IEdvb2QgVmVudHVyZXMKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCg==", - "type": "text" + "type": "text", }, "vars": { "dartVersion": { "type": "string", "description": "Dart version to be used in the generated Dockerfile.", "default": "stable", - "prompt": "Dart version?" - } - } + "prompt": "Dart version?", + }, + }, }); diff --git a/packages/dart_frog_cli/lib/src/commands/create/create.dart b/packages/dart_frog_cli/lib/src/commands/create/create.dart index aa2318a10..6771d995c 100644 --- a/packages/dart_frog_cli/lib/src/commands/create/create.dart +++ b/packages/dart_frog_cli/lib/src/commands/create/create.dart @@ -17,13 +17,12 @@ final RegExp _identifierRegExp = RegExp('[a-z_][a-z0-9_]*'); /// {@endtemplate} class CreateCommand extends DartFrogCommand { /// {@macro create_command} - CreateCommand({ - super.logger, - GeneratorBuilder? generator, - }) : _generator = generator ?? MasonGenerator.fromBundle { + CreateCommand({super.logger, GeneratorBuilder? generator}) + : _generator = generator ?? MasonGenerator.fromBundle { argParser.addOption( 'project-name', - help: 'The project name for this new project. ' + help: + 'The project name for this new project. ' 'This must be a valid dart package name.', ); } @@ -66,7 +65,8 @@ class CreateCommand extends DartFrogCommand { /// Uses the current directory path name /// if the `--project-name` option is not explicitly specified. String get _projectName { - final projectName = results['project-name'] as String? ?? + final projectName = + results['project-name'] as String? ?? path.basename(path.normalize(_outputDirectory.absolute.path)); _validateProjectName(projectName); return projectName; diff --git a/packages/dart_frog_cli/lib/src/commands/create/templates/create_dart_frog_bundle.dart b/packages/dart_frog_cli/lib/src/commands/create/templates/create_dart_frog_bundle.dart index e13285e21..871e6b97e 100644 --- a/packages/dart_frog_cli/lib/src/commands/create/templates/create_dart_frog_bundle.dart +++ b/packages/dart_frog_cli/lib/src/commands/create/templates/create_dart_frog_bundle.dart @@ -9,64 +9,64 @@ final createDartFrogBundle = MasonBundle.fromJson({ "path": ".gitignore", "data": "IyBTZWUgaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL2d1aWRlcy9saWJyYXJpZXMvcHJpdmF0ZS1maWxlcwoKIyBGaWxlcyBhbmQgZGlyZWN0b3JpZXMgY3JlYXRlZCBieSB0aGUgT3BlcmF0aW5nIFN5c3RlbQouRFNfU3RvcmUKCiMgRmlsZXMgYW5kIGRpcmVjdG9yaWVzIGNyZWF0ZWQgYnkgcHViCi5kYXJ0X3Rvb2wvCi5wYWNrYWdlcwpwdWJzcGVjLmxvY2sKCiMgRmlsZXMgYW5kIGRpcmVjdG9yaWVzIGNyZWF0ZWQgYnkgZGFydF9mcm9nCmJ1aWxkLwouZGFydF9mcm9nCgojIFRlc3QgcmVsYXRlZCBmaWxlcwpjb3ZlcmFnZS8=", - "type": "text" + "type": "text", }, { "path": ".vscode/extensions.json", "data": "ewoJInJlY29tbWVuZGF0aW9ucyI6IFsiVmVyeUdvb2RWZW50dXJlcy5kYXJ0LWZyb2ciXQp9", - "type": "text" + "type": "text", }, { "path": "analysis_options.yaml", "data": "aW5jbHVkZTogcGFja2FnZTp2ZXJ5X2dvb2RfYW5hbHlzaXMvYW5hbHlzaXNfb3B0aW9ucy41LjEuMC55YW1sCmFuYWx5emVyOgogIGV4Y2x1ZGU6CiAgICAtIGJ1aWxkLyoqCmxpbnRlcjoKICBydWxlczoKICAgIGZpbGVfbmFtZXM6IGZhbHNlCg==", - "type": "text" + "type": "text", }, { "path": "pubspec.yaml", "data": "bmFtZToge3tuYW1lLnNuYWtlQ2FzZSgpfX0KZGVzY3JpcHRpb246IEEgbmV3IERhcnQgRnJvZyBhcHBsaWNhdGlvbgp2ZXJzaW9uOiAxLjAuMCsxCnB1Ymxpc2hfdG86IG5vbmUKCmVudmlyb25tZW50OgogIHNkazogIj49My4wLjAgPDQuMC4wIgoKZGVwZW5kZW5jaWVzOgogIGRhcnRfZnJvZzogXjEuMS4wCgpkZXZfZGVwZW5kZW5jaWVzOgogIG1vY2t0YWlsOiBeMS4wLjMKICB0ZXN0OiBeMS4yNS41CiAgdmVyeV9nb29kX2FuYWx5c2lzOiBeNS4xLjAK", - "type": "text" + "type": "text", }, { "path": "README.md", "data": "IyB7e25hbWUuc25ha2VDYXNlKCl9fQoKWyFbc3R5bGU6IHZlcnkgZ29vZCBhbmFseXNpc11bdmVyeV9nb29kX2FuYWx5c2lzX2JhZGdlXV1bdmVyeV9nb29kX2FuYWx5c2lzX2xpbmtdClshW0xpY2Vuc2U6IE1JVF1bbGljZW5zZV9iYWRnZV1dW2xpY2Vuc2VfbGlua10KWyFbUG93ZXJlZCBieSBEYXJ0IEZyb2ddKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZW5kcG9pbnQ/dXJsPWh0dHBzOi8vdGlueXVybC5jb20vZGFydGZyb2ctYmFkZ2UpXShodHRwczovL2RhcnRmcm9nLnZndi5kZXYpCgpBbiBleGFtcGxlIGFwcGxpY2F0aW9uIGJ1aWx0IHdpdGggZGFydF9mcm9nCgpbbGljZW5zZV9iYWRnZV06IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvbGljZW5zZS1NSVQtYmx1ZS5zdmcKW2xpY2Vuc2VfbGlua106IGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUClt2ZXJ5X2dvb2RfYW5hbHlzaXNfYmFkZ2VdOiBodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3N0eWxlLXZlcnlfZ29vZF9hbmFseXNpcy1CMjJDODkuc3ZnClt2ZXJ5X2dvb2RfYW5hbHlzaXNfbGlua106IGh0dHBzOi8vcHViLmRldi9wYWNrYWdlcy92ZXJ5X2dvb2RfYW5hbHlzaXM=", - "type": "text" + "type": "text", }, { "path": "routes/index.dart", "data": "aW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZy9kYXJ0X2Zyb2cuZGFydCc7CgpSZXNwb25zZSBvblJlcXVlc3QoUmVxdWVzdENvbnRleHQgY29udGV4dCkgewogIHJldHVybiBSZXNwb25zZShib2R5OiAnV2VsY29tZSB0byBEYXJ0IEZyb2chJyk7Cn0K", - "type": "text" + "type": "text", }, { "path": "test/routes/index_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2cvZGFydF9mcm9nLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6bW9ja3RhaWwvbW9ja3RhaWwuZGFydCc7CmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgppbXBvcnQgJy4uLy4uL3JvdXRlcy9pbmRleC5kYXJ0JyBhcyByb3V0ZTsKCmNsYXNzIF9Nb2NrUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgUmVxdWVzdENvbnRleHQge30KCnZvaWQgbWFpbigpIHsKICBncm91cCgnR0VUIC8nLCAoKSB7CiAgICB0ZXN0KCdyZXNwb25kcyB3aXRoIGEgMjAwIGFuZCAiV2VsY29tZSB0byBEYXJ0IEZyb2chIi4nLCAoKSB7CiAgICAgIGZpbmFsIGNvbnRleHQgPSBfTW9ja1JlcXVlc3RDb250ZXh0KCk7CiAgICAgIGZpbmFsIHJlc3BvbnNlID0gcm91dGUub25SZXF1ZXN0KGNvbnRleHQpOwogICAgICBleHBlY3QocmVzcG9uc2Uuc3RhdHVzQ29kZSwgZXF1YWxzKEh0dHBTdGF0dXMub2spKTsKICAgICAgZXhwZWN0KAogICAgICAgIHJlc3BvbnNlLmJvZHkoKSwKICAgICAgICBjb21wbGV0aW9uKGVxdWFscygnV2VsY29tZSB0byBEYXJ0IEZyb2chJykpLAogICAgICApOwogICAgfSk7CiAgfSk7Cn0K", - "type": "text" - } + "type": "text", + }, ], "hooks": [ { "path": "post_gen.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKaW1wb3J0ICdwYWNrYWdlOm1hc29uL21hc29uLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CgpGdXR1cmU8dm9pZD4gcnVuKEhvb2tDb250ZXh0IGNvbnRleHQpIGFzeW5jIHsKICBmaW5hbCBwcm9qZWN0RGlyZWN0b3J5ID0gcGF0aC5jYW5vbmljYWxpemUoCiAgICBjb250ZXh0LnZhcnNbJ291dHB1dF9kaXJlY3RvcnknXSBhcyBTdHJpbmc/ID8/IERpcmVjdG9yeS5jdXJyZW50LnBhdGgsCiAgKTsKICBmaW5hbCBwcm9ncmVzcyA9IGNvbnRleHQubG9nZ2VyLnByb2dyZXNzKCdJbnN0YWxsaW5nIGRlcGVuZGVuY2llcycpOwogIGF3YWl0IFByb2Nlc3MucnVuKAogICAgJ2RhcnQnLAogICAgWydwdWInLCAnZ2V0J10sCiAgICBydW5JblNoZWxsOiB0cnVlLAogICAgd29ya2luZ0RpcmVjdG9yeTogcHJvamVjdERpcmVjdG9yeSwKICApOwogIHByb2dyZXNzLmNvbXBsZXRlKCk7CgogIGNvbnRleHQubG9nZ2VyCiAgICAuLmluZm8oJycpCiAgICAuLnN1Y2Nlc3MoJ0NyZWF0ZWQgJHtjb250ZXh0LnZhcnNbJ25hbWUnXX0gYXQgJHByb2plY3REaXJlY3RvcnkuJykKICAgIC4uaW5mbygnJykKICAgIC4uaW5mbygnR2V0IHN0YXJ0ZWQgYnkgdHlwaW5nOicpCiAgICAuLmluZm8oJycpCiAgICAuLmluZm8oJyR7bGlnaHRDeWFuLndyYXAoJ2NkJyl9ICRwcm9qZWN0RGlyZWN0b3J5JykKICAgIC4uaW5mbygnJHtsaWdodEN5YW4ud3JhcCgnZGFydF9mcm9nIGRldicpfScpOwp9Cg==", - "type": "text" + "type": "text", }, { "path": "pubspec.yaml", "data": "bmFtZTogY3JlYXRlX2RhcnRfZnJvZ19ob29rcwoKZW52aXJvbm1lbnQ6CiAgc2RrOiAiPj0zLjAuMCA8NC4wLjAiCgpkZXBlbmRlbmNpZXM6CiAgbWFzb246IF4wLjEuMC1kZXYuMzkKICBwYXRoOiBeMS44LjEKCmRldl9kZXBlbmRlbmNpZXM6CiAgbW9ja3RhaWw6IF4xLjAuMAogIHRlc3Q6IF4xLjI1LjAKICB2ZXJ5X2dvb2RfYW5hbHlzaXM6IF42LjAuMAo=", - "type": "text" + "type": "text", }, { "path": "test/post_gen_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1vY2t0YWlsL21vY2t0YWlsLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwoKaW1wb3J0ICcuLi9wb3N0X2dlbi5kYXJ0JzsKCmNsYXNzIF9GYWtlSG9va0NvbnRleHQgZXh0ZW5kcyBGYWtlIGltcGxlbWVudHMgSG9va0NvbnRleHQgewogIF9GYWtlSG9va0NvbnRleHQoe0xvZ2dlcj8gbG9nZ2VyfSkgOiBfbG9nZ2VyID0gbG9nZ2VyID8/IF9Nb2NrTG9nZ2VyKCk7CgogIGZpbmFsIExvZ2dlciBfbG9nZ2VyOwoKICB2YXIgX3ZhcnMgPSA8U3RyaW5nLCBkeW5hbWljPnt9OwoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgdmFycyA9PiBfdmFyczsKCiAgQG92ZXJyaWRlCiAgc2V0IHZhcnMoTWFwPFN0cmluZywgZHluYW1pYz4gdmFsdWUpID0+IF92YXJzID0gdmFsdWU7CgogIEBvdmVycmlkZQogIExvZ2dlciBnZXQgbG9nZ2VyID0+IF9sb2dnZXI7Cn0KCmNsYXNzIF9Nb2NrTG9nZ2VyIGV4dGVuZHMgTW9jayBpbXBsZW1lbnRzIExvZ2dlciB7fQoKY2xhc3MgX01vY2tQcm9ncmVzcyBleHRlbmRzIE1vY2sgaW1wbGVtZW50cyBQcm9ncmVzcyB7fQoKdm9pZCBtYWluKCkgewogIGdyb3VwKCdwb3N0R2VuJywgKCkgewogICAgbGF0ZSBIb29rQ29udGV4dCBjb250ZXh0OwogICAgbGF0ZSBMb2dnZXIgbG9nZ2VyOwoKICAgIHNldFVwKCgpIHsKICAgICAgbG9nZ2VyID0gX01vY2tMb2dnZXIoKTsKICAgICAgY29udGV4dCA9IF9GYWtlSG9va0NvbnRleHQobG9nZ2VyOiBsb2dnZXIpOwoKICAgICAgd2hlbigoKSA9PiBsb2dnZXIucHJvZ3Jlc3MoYW55KCkpKS50aGVuUmV0dXJuKF9Nb2NrUHJvZ3Jlc3MoKSk7CiAgICB9KTsKCiAgICB0ZXN0KCdydW4gY29tcGxldGVzIHdoZW4gcHVic3BlYy55YW1sIGV4aXN0cycsICgpIGFzeW5jIHsKICAgICAgY29uc3QgbmFtZSA9ICdleGFtcGxlJzsKICAgICAgZmluYWwgcHJvamVjdERpcmVjdG9yeSA9IERpcmVjdG9yeS5jdXJyZW50LnBhdGg7CiAgICAgIGNvbnRleHQudmFycyA9IHsnbmFtZSc6IG5hbWV9OwogICAgICBhd2FpdCBleHBlY3RMYXRlcihydW4oY29udGV4dCksIGNvbXBsZXRlcyk7CiAgICAgIHZlcmlmeUluT3JkZXIoWwogICAgICAgICgpID0+IGxvZ2dlci5pbmZvKCcnKSwKICAgICAgICAoKSA9PiBsb2dnZXIKICAgICAgICAgICAgLnN1Y2Nlc3MoJ0NyZWF0ZWQgJHtjb250ZXh0LnZhcnNbJ25hbWUnXX0gYXQgJHByb2plY3REaXJlY3RvcnkuJyksCiAgICAgICAgKCkgPT4gbG9nZ2VyLmluZm8oJycpLAogICAgICAgICgpID0+IGxvZ2dlci5pbmZvKCdHZXQgc3RhcnRlZCBieSB0eXBpbmc6JyksCiAgICAgICAgKCkgPT4gbG9nZ2VyLmluZm8oJycpLAogICAgICAgICgpID0+IGxvZ2dlci5pbmZvKCcke2xpZ2h0Q3lhbi53cmFwKCdjZCcpfSAkcHJvamVjdERpcmVjdG9yeScpLAogICAgICAgICgpID0+IGxvZ2dlci5pbmZvKCcke2xpZ2h0Q3lhbi53cmFwKCdkYXJ0X2Zyb2cgZGV2Jyl9JyksCiAgICAgIF0pOwogICAgfSk7CgogICAgdGVzdCgncnVuIHRocm93cyB3aGVuIHB1YnNwZWMueWFtbCBkb2VzIG5vdCBleGlzdCcsICgpIGFzeW5jIHsKICAgICAgY29udGV4dC52YXJzID0geydvdXRwdXRfZGlyZWN0b3J5JzogJy9pbnZhbGlkJ307CiAgICAgIGF3YWl0IGV4cGVjdExhdGVyKCgpID0+IHJ1bihjb250ZXh0KSwgdGhyb3dzQShpc0E8RXhjZXB0aW9uPigpKSk7CiAgICB9KTsKICB9KTsKfQo=", - "type": "text" - } + "type": "text", + }, ], "name": "create_dart_frog", "description": "A Dart Frog starter app template", @@ -76,26 +76,26 @@ final createDartFrogBundle = MasonBundle.fromJson({ "path": "README.md", "data": "IyBjcmVhdGVfZGFydF9mcm9nCgpbIVtQb3dlcmVkIGJ5IE1hc29uXShodHRwczovL2ltZy5zaGllbGRzLmlvL2VuZHBvaW50P3VybD1odHRwcyUzQSUyRiUyRnRpbnl1cmwuY29tJTJGbWFzb24tYmFkZ2UpXShodHRwczovL2dpdGh1Yi5jb20vZmVsYW5nZWwvbWFzb24pCgpBIERhcnQgRnJvZyBzdGFydGVyIGFwcCB0ZW1wbGF0ZQoKX0dlbmVyYXRlZCBieSBbbWFzb25dWzFdIPCfp7FfCgpbMV06IGh0dHBzOi8vZ2l0aHViLmNvbS9mZWxhbmdlbC9tYXNvbgo=", - "type": "text" + "type": "text", }, "changelog": { "path": "CHANGELOG.md", "data": "IyAwLjEuMCsxCgotIGZlYXQ6IGJhc2ljIGRhcnQgZnJvZyBzdGFydGVyIHRlbXBsYXRlCg==", - "type": "text" + "type": "text", }, "license": { "path": "LICENSE", "data": "TUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAyMiBWZXJ5IEdvb2QgVmVudHVyZXMKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCg==", - "type": "text" + "type": "text", }, "vars": { "name": { "type": "string", "description": "Your application name", "default": "example", - "prompt": "What is your app name?" - } - } + "prompt": "What is your app name?", + }, + }, }); diff --git a/packages/dart_frog_cli/lib/src/commands/daemon/daemon.dart b/packages/dart_frog_cli/lib/src/commands/daemon/daemon.dart index 6bc733b2d..12699ec0d 100644 --- a/packages/dart_frog_cli/lib/src/commands/daemon/daemon.dart +++ b/packages/dart_frog_cli/lib/src/commands/daemon/daemon.dart @@ -10,10 +10,8 @@ typedef DaemonBuilder = DaemonServer Function(); /// {@endtemplate} class DaemonCommand extends DartFrogCommand { /// {@macro daemon_command} - DaemonCommand({ - super.logger, - DaemonBuilder? daemonBuilder, - }) : _daemonBuilder = daemonBuilder ?? DaemonServer.new; + DaemonCommand({super.logger, DaemonBuilder? daemonBuilder}) + : _daemonBuilder = daemonBuilder ?? DaemonServer.new; final DaemonBuilder _daemonBuilder; diff --git a/packages/dart_frog_cli/lib/src/commands/dev/dev.dart b/packages/dart_frog_cli/lib/src/commands/dev/dev.dart index fc3aa6c8d..518c40d13 100644 --- a/packages/dart_frog_cli/lib/src/commands/dev/dev.dart +++ b/packages/dart_frog_cli/lib/src/commands/dev/dev.dart @@ -16,9 +16,9 @@ class DevCommand extends DartFrogCommand { super.logger, GeneratorBuilder? generator, DevServerRunnerConstructor? devServerRunnerConstructor, - }) : _generator = generator ?? MasonGenerator.fromBundle, - _devServerRunnerConstructor = - devServerRunnerConstructor ?? DevServerRunner.new { + }) : _generator = generator ?? MasonGenerator.fromBundle, + _devServerRunnerConstructor = + devServerRunnerConstructor ?? DevServerRunner.new { argParser ..addOption( 'port', @@ -103,7 +103,8 @@ class DevCommand extends DartFrogCommand { Future run() async { final port = io.Platform.environment['PORT'] ?? results['port'] as String; - final dartVmServicePort = (results['dart-vm-service-port'] as String?) ?? + final dartVmServicePort = + (results['dart-vm-service-port'] as String?) ?? _defaultDartVmServicePort; final generator = await _generator(dartFrogDevServerBundle); diff --git a/packages/dart_frog_cli/lib/src/commands/dev/templates/dart_frog_dev_server_bundle.dart b/packages/dart_frog_cli/lib/src/commands/dev/templates/dart_frog_dev_server_bundle.dart index 5ae309bbb..2ac5232df 100644 --- a/packages/dart_frog_cli/lib/src/commands/dev/templates/dart_frog_dev_server_bundle.dart +++ b/packages/dart_frog_cli/lib/src/commands/dev/templates/dart_frog_dev_server_bundle.dart @@ -9,40 +9,40 @@ final dartFrogDevServerBundle = MasonBundle.fromJson({ "path": "server.dart", "data": "Ly8gR0VORVJBVEVEIENPREUgLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKLy8gaWdub3JlX2Zvcl9maWxlOiB0eXBlPWxpbnQsIGltcGxpY2l0X2R5bmFtaWNfbGlzdF9saXRlcmFsCgppbXBvcnQgJ2RhcnQ6aW8nOwoKaW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZy9kYXJ0X2Zyb2cuZGFydCc7Cgp7eyNpbnZva2VDdXN0b21FbnRyeXBvaW50fX1pbXBvcnQgJy4uL21haW4uZGFydCcgYXMgZW50cnlwb2ludDt7ey9pbnZva2VDdXN0b21FbnRyeXBvaW50fX0Ke3sjcm91dGVzfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Owp7ey9yb3V0ZXN9fQp7eyNtaWRkbGV3YXJlfX1pbXBvcnQgJ3t7e3BhdGh9fX0nIGFzIHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Owp7ey9taWRkbGV3YXJlfX0Kdm9pZCBtYWluKCkgYXN5bmMgewogIGZpbmFsIGFkZHJlc3MgPSBJbnRlcm5ldEFkZHJlc3MudHJ5UGFyc2UoJ3t7e2hvc3R9fX0nKSA/PyBJbnRlcm5ldEFkZHJlc3MuYW55SVB2NjsKICBmaW5hbCBwb3J0ID0gaW50LnRyeVBhcnNlKFBsYXRmb3JtLmVudmlyb25tZW50WydQT1JUJ10gPz8gJ3t7e3BvcnR9fX0nKSA/PyB7e3twb3J0fX19O3t7I2ludm9rZUN1c3RvbUluaXR9fQogIGF3YWl0IGVudHJ5cG9pbnQuaW5pdChhZGRyZXNzLCBwb3J0KTt7ey9pbnZva2VDdXN0b21Jbml0fX0KICBob3RSZWxvYWQoKCkgPT4gY3JlYXRlU2VydmVyKGFkZHJlc3MsIHBvcnQpKTsKfQoKRnV0dXJlPEh0dHBTZXJ2ZXI+IGNyZWF0ZVNlcnZlcihJbnRlcm5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnQpIHsKICBmaW5hbCBoYW5kbGVyID0gQ2FzY2FkZSgpe3sjc2VydmVTdGF0aWNGaWxlc319LmFkZChjcmVhdGVTdGF0aWNGaWxlSGFuZGxlcigpKXt7L3NlcnZlU3RhdGljRmlsZXN9fS5hZGQoYnVpbGRSb290SGFuZGxlcigpKS5oYW5kbGVyOwogIHt7I2ludm9rZUN1c3RvbUVudHJ5cG9pbnR9fXJldHVybiBlbnRyeXBvaW50LnJ1bihoYW5kbGVyLCBhZGRyZXNzLCBwb3J0KTt7ey9pbnZva2VDdXN0b21FbnRyeXBvaW50fX17e15pbnZva2VDdXN0b21FbnRyeXBvaW50fX1yZXR1cm4gc2VydmUoaGFuZGxlciwgYWRkcmVzcywgcG9ydCk7e3svaW52b2tlQ3VzdG9tRW50cnlwb2ludH19Cn0KCkhhbmRsZXIgYnVpbGRSb290SGFuZGxlcigpIHsKICBmaW5hbCBwaXBlbGluZSA9IGNvbnN0IFBpcGVsaW5lKCl7eyNnbG9iYWxNaWRkbGV3YXJlfX0uYWRkTWlkZGxld2FyZSh7eyNzbmFrZUNhc2V9fXt7e25hbWV9fX17ey9zbmFrZUNhc2V9fS5taWRkbGV3YXJlKXt7L2dsb2JhbE1pZGRsZXdhcmV9fTsKICBmaW5hbCByb3V0ZXIgPSBSb3V0ZXIoKXt7I2RpcmVjdG9yaWVzfX0KICAgIC4ubW91bnQoJ3t7e3JvdXRlfX19JywgKGNvbnRleHR7eyNkaXJlY3RvcnlfcGFyYW1zLjB9fSx7eyNkaXJlY3RvcnlfcGFyYW1zfX17ey59fSx7ey9kaXJlY3RvcnlfcGFyYW1zfX17ey9kaXJlY3RvcnlfcGFyYW1zLjB9fSkgPT4gYnVpbGR7eyNwYXNjYWxDYXNlfX17e3tuYW1lfX19e3svcGFzY2FsQ2FzZX19SGFuZGxlcih7eyNkaXJlY3RvcnlfcGFyYW1zfX17ey59fSx7ey9kaXJlY3RvcnlfcGFyYW1zfX0pKGNvbnRleHQpKXt7L2RpcmVjdG9yaWVzfX07CiAgcmV0dXJuIHBpcGVsaW5lLmFkZEhhbmRsZXIocm91dGVyKTsKfQp7eyNkaXJlY3Rvcmllc319CkhhbmRsZXIgYnVpbGR7eyNwYXNjYWxDYXNlfX17e3tuYW1lfX19e3svcGFzY2FsQ2FzZX19SGFuZGxlcih7eyNkaXJlY3RvcnlfcGFyYW1zfX1TdHJpbmcge3sufX0se3svZGlyZWN0b3J5X3BhcmFtc319KSB7CiAgZmluYWwgcGlwZWxpbmUgPSBjb25zdCBQaXBlbGluZSgpe3sjbWlkZGxld2FyZS4wfX17eyNtaWRkbGV3YXJlfX0uYWRkTWlkZGxld2FyZSh7eyNzbmFrZUNhc2V9fXt7e25hbWV9fX17ey9zbmFrZUNhc2V9fS5taWRkbGV3YXJlKXt7L21pZGRsZXdhcmV9fXt7L21pZGRsZXdhcmUuMH19OwogIGZpbmFsIHJvdXRlciA9IFJvdXRlcigpCiAgICB7eyNmaWxlc319e3sjd2lsZGNhcmR9fS4ubW91bnQoJ3t7e3JvdXRlfX19JywgKGNvbnRleHQpID0+IHt7I3NuYWtlQ2FzZX19e3t7bmFtZX19fXt7L3NuYWtlQ2FzZX19Lm9uUmVxdWVzdChjb250ZXh0LGNvbnRleHQucmVxdWVzdC51cmwucGF0aCkpe3svd2lsZGNhcmR9fXt7XndpbGRjYXJkfX0uLmFsbCgne3t7cm91dGV9fX0nLCAoY29udGV4dHt7I2ZpbGVfcGFyYW1zLjB9fSx7eyNmaWxlX3BhcmFtc319e3sufX0se3svZmlsZV9wYXJhbXN9fXt7L2ZpbGVfcGFyYW1zLjB9fSkgPT4ge3sjc25ha2VDYXNlfX17e3tuYW1lfX19e3svc25ha2VDYXNlfX0ub25SZXF1ZXN0KGNvbnRleHQse3sjZGlyZWN0b3J5X3BhcmFtc319e3sufX0se3svZGlyZWN0b3J5X3BhcmFtc319e3sjZmlsZV9wYXJhbXN9fXt7Ln19LHt7L2ZpbGVfcGFyYW1zfX0pKXt7L3dpbGRjYXJkfX17ey9maWxlc319OwogIHJldHVybiBwaXBlbGluZS5hZGRIYW5kbGVyKHJvdXRlcik7Cn0Ke3svZGlyZWN0b3JpZXN9fQo=", - "type": "text" - } + "type": "text", + }, ], "hooks": [ { "path": "pre_gen.dart", "data": "aW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfZ2VuL2RhcnRfZnJvZ19nZW4uZGFydCc7CmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JwogICAgc2hvdyBIb29rQ29udGV4dCwgZGVmYXVsdEZvcmVncm91bmQsIGxpZ2h0Q3lhbjsKCmltcG9ydCAnc3JjL2V4aXRfb3ZlcnJpZGVzLmRhcnQnOwoKdHlwZWRlZiBSb3V0ZUNvbmZpZ3VyYXRpb25CdWlsZGVyID0gUm91dGVDb25maWd1cmF0aW9uIEZ1bmN0aW9uKAogIGlvLkRpcmVjdG9yeSBkaXJlY3RvcnksCik7Cgp2b2lkIF9kZWZhdWx0RXhpdChpbnQgY29kZSkgPT4gRXhpdE92ZXJyaWRlcy5jdXJyZW50Py5leGl0ID8/IGlvLmV4aXQ7CgpGdXR1cmU8dm9pZD4gcnVuKEhvb2tDb250ZXh0IGNvbnRleHQpIGFzeW5jID0+IHByZUdlbihjb250ZXh0KTsKCkZ1dHVyZTx2b2lkPiBwcmVHZW4oCiAgSG9va0NvbnRleHQgY29udGV4dCwgewogIFJvdXRlQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRDb25maWd1cmF0aW9uID0gYnVpbGRSb3V0ZUNvbmZpZ3VyYXRpb24sCiAgdm9pZCBGdW5jdGlvbihpbnQgZXhpdENvZGUpIGV4aXQgPSBfZGVmYXVsdEV4aXQsCn0pIGFzeW5jIHsKICBmaW5hbCBSb3V0ZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKICB0cnkgewogICAgY29uZmlndXJhdGlvbiA9IGJ1aWxkQ29uZmlndXJhdGlvbihpby5EaXJlY3RvcnkuY3VycmVudCk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGNvbnRleHQubG9nZ2VyLmVycignJGVycm9yJyk7CiAgICByZXR1cm4gZXhpdCgxKTsKICB9CgogIHJlcG9ydFJvdXRlQ29uZmxpY3RzKAogICAgY29uZmlndXJhdGlvbiwKICAgIG9uVmlvbGF0aW9uU3RhcnQ6ICgpIHsKICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygnJyk7CiAgICB9LAogICAgb25Sb3V0ZUNvbmZsaWN0OiAoCiAgICAgIG9yaWdpbmFsRmlsZVBhdGgsCiAgICAgIGNvbmZsaWN0aW5nRmlsZVBhdGgsCiAgICAgIGNvbmZsaWN0aW5nRW5kcG9pbnQsCiAgICApIHsKICAgICAgY29udGV4dC5sb2dnZXIuZXJyKAogICAgICAgICcnJ1JvdXRlIGNvbmZsaWN0IGRldGVjdGVkLiAke2xpZ2h0Q3lhbi53cmFwKG9yaWdpbmFsRmlsZVBhdGgpfSBhbmQgJHtsaWdodEN5YW4ud3JhcChjb25mbGljdGluZ0ZpbGVQYXRoKX0gYm90aCByZXNvbHZlIHRvICR7bGlnaHRDeWFuLndyYXAoY29uZmxpY3RpbmdFbmRwb2ludCl9LicnJywKICAgICAgKTsKICAgIH0sCiAgKTsKICByZXBvcnRSb2d1ZVJvdXRlcygKICAgIGNvbmZpZ3VyYXRpb24sCiAgICBvblZpb2xhdGlvblN0YXJ0OiAoKSB7CiAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oJycpOwogICAgfSwKICAgIG9uUm9ndWVSb3V0ZTogKGZpbGVQYXRoLCBpZGVhbFBhdGgpIHsKICAgICAgY29udGV4dC5sb2dnZXIuZXJyKAogICAgICAgICcnJ1JvZ3VlIHJvdXRlIGRldGVjdGVkLiR7ZGVmYXVsdEZvcmVncm91bmQud3JhcCgnICcpfVJlbmFtZSAke2xpZ2h0Q3lhbi53cmFwKGZpbGVQYXRoKX0gdG8gJHtsaWdodEN5YW4ud3JhcChpZGVhbFBhdGgpfS4nJycsCiAgICAgICk7CiAgICB9LAogICk7CgogIGNvbnRleHQudmFycyA9IHsKICAgICdob3N0JzogY29udGV4dC52YXJzWydob3N0J10gPz8gJycsCiAgICAncG9ydCc6IGNvbnRleHQudmFyc1sncG9ydCddID8/ICc4MDgwJywKICAgICdkaXJlY3Rvcmllcyc6IGNvbmZpZ3VyYXRpb24uZGlyZWN0b3JpZXMKICAgICAgICAubWFwKChjKSA9PiBjLnRvSnNvbigpKQogICAgICAgIC50b0xpc3QoKQogICAgICAgIC5yZXZlcnNlZAogICAgICAgIC50b0xpc3QoKSwKICAgICdyb3V0ZXMnOiBjb25maWd1cmF0aW9uLnJvdXRlcy5tYXAoKHIpID0+IHIudG9Kc29uKCkpLnRvTGlzdCgpLAogICAgJ21pZGRsZXdhcmUnOiBjb25maWd1cmF0aW9uLm1pZGRsZXdhcmUubWFwKChtKSA9PiBtLnRvSnNvbigpKS50b0xpc3QoKSwKICAgICdnbG9iYWxNaWRkbGV3YXJlJzogY29uZmlndXJhdGlvbi5nbG9iYWxNaWRkbGV3YXJlICE9IG51bGwKICAgICAgICA/IGNvbmZpZ3VyYXRpb24uZ2xvYmFsTWlkZGxld2FyZSEudG9Kc29uKCkKICAgICAgICA6IGZhbHNlLAogICAgJ3NlcnZlU3RhdGljRmlsZXMnOiBjb25maWd1cmF0aW9uLnNlcnZlU3RhdGljRmlsZXMsCiAgICAnaW52b2tlQ3VzdG9tRW50cnlwb2ludCc6IGNvbmZpZ3VyYXRpb24uaW52b2tlQ3VzdG9tRW50cnlwb2ludCwKICAgICdpbnZva2VDdXN0b21Jbml0JzogY29uZmlndXJhdGlvbi5pbnZva2VDdXN0b21Jbml0LAogIH07Cn0K", - "type": "text" + "type": "text", }, { "path": "pubspec.yaml", "data": "bmFtZTogZGFydF9mcm9nX2Rldl9zZXJ2ZXJfaG9va3MKcHVibGlzaF90bzogbm9uZQoKZW52aXJvbm1lbnQ6CiAgc2RrOiAiPj0zLjAuMCA8NC4wLjAiCgpkZXBlbmRlbmNpZXM6CiAgZGFydF9mcm9nX2dlbjogXjIuMC4wCiAgbWFzb246IF4wLjEuMC1kZXYuMzkKICBwdWJzcGVjX3BhcnNlOiBeMS4yLjAKCmRldl9kZXBlbmRlbmNpZXM6CiAgbW9ja3RhaWw6IF4xLjAuMAogIHBhdGg6IF4xLjguMgogIHRlc3Q6IF4xLjI1LjAKICB2ZXJ5X2dvb2RfYW5hbHlzaXM6IF42LjAuMAo=", - "type": "text" + "type": "text", }, { "path": "src/exit_overrides.dart", "data": "aW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmNvbnN0IF9hc3luY1J1blpvbmVkID0gcnVuWm9uZWQ7CgphYnN0cmFjdCBjbGFzcyBFeGl0T3ZlcnJpZGVzIHsKICBzdGF0aWMgZmluYWwgX3Rva2VuID0gT2JqZWN0KCk7CgogIHN0YXRpYyBFeGl0T3ZlcnJpZGVzPyBnZXQgY3VycmVudCB7CiAgICByZXR1cm4gWm9uZS5jdXJyZW50W190b2tlbl0gYXMgRXhpdE92ZXJyaWRlcz87CiAgfQoKICBzdGF0aWMgUiBydW5ab25lZDxSPihSIEZ1bmN0aW9uKCkgYm9keSwge3ZvaWQgRnVuY3Rpb24oaW50KT8gZXhpdH0pIHsKICAgIGZpbmFsIG92ZXJyaWRlcyA9IF9FeGl0T3ZlcnJpZGVzU2NvcGUoZXhpdCk7CiAgICByZXR1cm4gX2FzeW5jUnVuWm9uZWQoYm9keSwgem9uZVZhbHVlczoge190b2tlbjogb3ZlcnJpZGVzfSk7CiAgfQoKICB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZ2V0IGV4aXQgPT4gaW8uZXhpdDsKfQoKY2xhc3MgX0V4aXRPdmVycmlkZXNTY29wZSBleHRlbmRzIEV4aXRPdmVycmlkZXMgewogIF9FeGl0T3ZlcnJpZGVzU2NvcGUodGhpcy5fZXhpdCk7CgogIGZpbmFsIEV4aXRPdmVycmlkZXM/IF9wcmV2aW91cyA9IEV4aXRPdmVycmlkZXMuY3VycmVudDsKICBmaW5hbCB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSk/IF9leGl0OwoKICBAb3ZlcnJpZGUKICB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZ2V0IGV4aXQgewogICAgcmV0dXJuIF9leGl0ID8/IF9wcmV2aW91cz8uZXhpdCA/PyBzdXBlci5leGl0OwogIH0KfQo=", - "type": "text" + "type": "text", }, { "path": "test/pre_gen_test.dart", "data": "aW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19nZW4vZGFydF9mcm9nX2dlbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1hc29uL21hc29uLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6bW9ja3RhaWwvbW9ja3RhaWwuZGFydCc7CmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgppbXBvcnQgJy4uL3ByZV9nZW4uZGFydCc7CmltcG9ydCAnLi4vc3JjL2V4aXRfb3ZlcnJpZGVzLmRhcnQnOwoKY2xhc3MgX0Zha2VIb29rQ29udGV4dCBleHRlbmRzIEZha2UgaW1wbGVtZW50cyBIb29rQ29udGV4dCB7CiAgX0Zha2VIb29rQ29udGV4dCh7TG9nZ2VyPyBsb2dnZXJ9KSA6IF9sb2dnZXIgPSBsb2dnZXIgPz8gX01vY2tMb2dnZXIoKTsKCiAgZmluYWwgTG9nZ2VyIF9sb2dnZXI7CgogIHZhciBfdmFycyA9IDxTdHJpbmcsIGR5bmFtaWM+e307CgogIEBvdmVycmlkZQogIE1hcDxTdHJpbmcsIGR5bmFtaWM+IGdldCB2YXJzID0+IF92YXJzOwoKICBAb3ZlcnJpZGUKICBzZXQgdmFycyhNYXA8U3RyaW5nLCBkeW5hbWljPiB2YWx1ZSkgPT4gX3ZhcnMgPSB2YWx1ZTsKCiAgQG92ZXJyaWRlCiAgTG9nZ2VyIGdldCBsb2dnZXIgPT4gX2xvZ2dlcjsKfQoKY2xhc3MgX01vY2tMb2dnZXIgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgTG9nZ2VyIHt9Cgp2b2lkIG1haW4oKSB7CiAgZ3JvdXAoJ3ByZUdlbicsICgpIHsKICAgIGxhdGUgSG9va0NvbnRleHQgY29udGV4dDsKICAgIGxhdGUgTG9nZ2VyIGxvZ2dlcjsKCiAgICBzZXRVcCgoKSB7CiAgICAgIGxvZ2dlciA9IF9Nb2NrTG9nZ2VyKCk7CiAgICAgIGNvbnRleHQgPSBfRmFrZUhvb2tDb250ZXh0KGxvZ2dlcjogbG9nZ2VyKTsKICAgIH0pOwoKICAgIHRlc3QoJ3J1biBjb21wbGV0ZXMnLCAoKSB7CiAgICAgIGV4cGVjdCgKICAgICAgICBFeGl0T3ZlcnJpZGVzLnJ1blpvbmVkKAogICAgICAgICAgKCkgPT4gcnVuKF9GYWtlSG9va0NvbnRleHQoKSksCiAgICAgICAgICBleGl0OiAoXykge30sCiAgICAgICAgKSwKICAgICAgICBjb21wbGV0ZXMsCiAgICAgICk7CiAgICB9KTsKCiAgICB0ZXN0KCdleGl0KDEpIGlmIGJ1aWxkUm91dGVDb25maWd1cmF0aW9uIHRocm93cycsICgpIGFzeW5jIHsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgZmluYWwgZXhjZXB0aW9uID0gRXhjZXB0aW9uKCdvb3BzJyk7CiAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IHRocm93IGV4Y2VwdGlvbiwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBlcXVhbHMoWzFdKSk7CiAgICAgIHZlcmlmeSgoKSA9PiBsb2dnZXIuZXJyKGV4Y2VwdGlvbi50b1N0cmluZygpKSkuY2FsbGVkKDEpOwogICAgfSk7CgogICAgdGVzdCgnY29tcGxhaW5zIGFib3V0IHJvdXRlIGNvbmZsaWN0cycsICgpIGFzeW5jIHsKICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9IFJvdXRlQ29uZmlndXJhdGlvbigKICAgICAgICBtaWRkbGV3YXJlOiBbXSwKICAgICAgICBkaXJlY3RvcmllczogW10sCiAgICAgICAgcm91dGVzOiBbXSwKICAgICAgICByb2d1ZVJvdXRlczogW10sCiAgICAgICAgZW5kcG9pbnRzOiB7CiAgICAgICAgICAnLyc6IFsKICAgICAgICAgICAgUm91dGVGaWxlKAogICAgICAgICAgICAgIG5hbWU6ICdpbmRleCcsCiAgICAgICAgICAgICAgcGF0aDogJ2luZGV4LmRhcnQnLAogICAgICAgICAgICAgIHJvdXRlOiAnLycsCiAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICksCiAgICAgICAgICBdLAogICAgICAgICAgJy9oZWxsbyc6IFsKICAgICAgICAgICAgUm91dGVGaWxlKAogICAgICAgICAgICAgIG5hbWU6ICdoZWxsbycsCiAgICAgICAgICAgICAgcGF0aDogJ2hlbGxvLmRhcnQnLAogICAgICAgICAgICAgIHJvdXRlOiAnL2hlbGxvJywKICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgUm91dGVGaWxlKAogICAgICAgICAgICAgIG5hbWU6ICdoZWxsb19pbmRleCcsCiAgICAgICAgICAgICAgcGF0aDogJ2hlbGxvL2luZGV4LmRhcnQnLAogICAgICAgICAgICAgIHJvdXRlOiAnLycsCiAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICksCiAgICAgICAgICBdLAogICAgICAgIH0sCiAgICAgICk7CgogICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwogICAgICBhd2FpdCBwcmVHZW4oCiAgICAgICAgY29udGV4dCwKICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiBjb25maWd1cmF0aW9uLAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICk7CgogICAgICB2ZXJpZnkoCiAgICAgICAgKCkgPT4gbG9nZ2VyLmVycigKICAgICAgICAgICcnJ1JvdXRlIGNvbmZsaWN0IGRldGVjdGVkLiAke2xpZ2h0Q3lhbi53cmFwKCdyb3V0ZXMvaGVsbG8uZGFydCcpfSBhbmQgJHtsaWdodEN5YW4ud3JhcCgncm91dGVzL2hlbGxvL2luZGV4LmRhcnQnKX0gYm90aCByZXNvbHZlIHRvICR7bGlnaHRDeWFuLndyYXAoJy9oZWxsbycpfS4nJycsCiAgICAgICAgKSwKICAgICAgKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgaXNFbXB0eSk7CiAgICB9KTsKCiAgICB0ZXN0KCdjb21wbGFpbnMgYWJvdXQgcm9ndWUgcm91dGVzJywgKCkgYXN5bmMgewogICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gUm91dGVDb25maWd1cmF0aW9uKAogICAgICAgIG1pZGRsZXdhcmU6IFtdLAogICAgICAgIGRpcmVjdG9yaWVzOiBbXSwKICAgICAgICByb3V0ZXM6IFtdLAogICAgICAgIHJvZ3VlUm91dGVzOiBbCiAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgIG5hbWU6ICdoZWxsbycsCiAgICAgICAgICAgIHBhdGg6ICdoZWxsby5kYXJ0JywKICAgICAgICAgICAgcm91dGU6ICcvaGVsbG8nLAogICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICApLAogICAgICAgIF0sCiAgICAgICAgZW5kcG9pbnRzOiB7fSwKICAgICAgKTsKCiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IGNvbmZpZ3VyYXRpb24sCiAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgKTsKCiAgICAgIHZlcmlmeSgKICAgICAgICAoKSA9PiBsb2dnZXIuZXJyKAogICAgICAgICAgJycnUm9ndWUgcm91dGUgZGV0ZWN0ZWQuJHtkZWZhdWx0Rm9yZWdyb3VuZC53cmFwKCcgJyl9UmVuYW1lICR7bGlnaHRDeWFuLndyYXAoJ3JvdXRlcy9oZWxsby5kYXJ0Jyl9IHRvICR7bGlnaHRDeWFuLndyYXAoJ3JvdXRlcy9oZWxsby9pbmRleC5kYXJ0Jyl9LicnJywKICAgICAgICApLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgIH0pOwoKICAgIHRlc3QoJ3JldGFpbnMgY3VzdG9tIHBvcnQgaWYgc3BlY2lmaWVkJywgKCkgYXN5bmMgewogICAgICBjb25zdCBjdXN0b21Qb3J0ID0gJzgwODEnOwogICAgICBjb250ZXh0LnZhcnNbJ3BvcnQnXSA9IGN1c3RvbVBvcnQ7CiAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBSb3V0ZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgbWlkZGxld2FyZTogW10sCiAgICAgICAgZGlyZWN0b3JpZXM6IFtdLAogICAgICAgIHJvdXRlczogW10sCiAgICAgICAgcm9ndWVSb3V0ZXM6IFtdLAogICAgICAgIGVuZHBvaW50czoge30sCiAgICAgICk7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IGNvbmZpZ3VyYXRpb24sCiAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgaXNFbXB0eSk7CiAgICAgIHZlcmlmeU5ldmVyKCgpID0+IGxvZ2dlci5lcnIoYW55KCkpKTsKICAgICAgZXhwZWN0KAogICAgICAgIGNvbnRleHQudmFycywKICAgICAgICBlcXVhbHMoCiAgICAgICAgICB7CiAgICAgICAgICAgICdwb3J0JzogY3VzdG9tUG9ydCwKICAgICAgICAgICAgJ2hvc3QnOiAnJywKICAgICAgICAgICAgJ2RpcmVjdG9yaWVzJzogPFJvdXRlRGlyZWN0b3J5PltdLAogICAgICAgICAgICAncm91dGVzJzogPFJvdXRlRmlsZT5bXSwKICAgICAgICAgICAgJ21pZGRsZXdhcmUnOiA8TWlkZGxld2FyZUZpbGU+W10sCiAgICAgICAgICAgICdnbG9iYWxNaWRkbGV3YXJlJzogZmFsc2UsCiAgICAgICAgICAgICdzZXJ2ZVN0YXRpY0ZpbGVzJzogZmFsc2UsCiAgICAgICAgICAgICdpbnZva2VDdXN0b21FbnRyeXBvaW50JzogZmFsc2UsCiAgICAgICAgICAgICdpbnZva2VDdXN0b21Jbml0JzogZmFsc2UsCiAgICAgICAgICB9LAogICAgICAgICksCiAgICAgICk7CiAgICB9KTsKCiAgICB0ZXN0KCdyZXRhaW5zIGN1c3RvbSBob3N0IGlmIHNwZWNpZmllZCcsICgpIGFzeW5jIHsKICAgICAgY29uc3QgY3VzdG9tSG9zdCA9ICcxOTIuMTY4LjEuMic7CiAgICAgIGNvbnRleHQudmFyc1snaG9zdCddID0gY3VzdG9tSG9zdDsKICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9IFJvdXRlQ29uZmlndXJhdGlvbigKICAgICAgICBtaWRkbGV3YXJlOiBbXSwKICAgICAgICBkaXJlY3RvcmllczogW10sCiAgICAgICAgcm91dGVzOiBbXSwKICAgICAgICByb2d1ZVJvdXRlczogW10sCiAgICAgICAgZW5kcG9pbnRzOiB7fSwKICAgICAgKTsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgYXdhaXQgcHJlR2VuKAogICAgICAgIGNvbnRleHQsCiAgICAgICAgYnVpbGRDb25maWd1cmF0aW9uOiAoXykgPT4gY29uZmlndXJhdGlvbiwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgICAgdmVyaWZ5TmV2ZXIoKCkgPT4gbG9nZ2VyLmVycihhbnkoKSkpOwogICAgICBleHBlY3QoCiAgICAgICAgY29udGV4dC52YXJzLAogICAgICAgIGVxdWFscygKICAgICAgICAgIHsKICAgICAgICAgICAgJ3BvcnQnOiAnODA4MCcsCiAgICAgICAgICAgICdob3N0JzogJzE5Mi4xNjguMS4yJywKICAgICAgICAgICAgJ2RpcmVjdG9yaWVzJzogPFJvdXRlRGlyZWN0b3J5PltdLAogICAgICAgICAgICAncm91dGVzJzogPFJvdXRlRmlsZT5bXSwKICAgICAgICAgICAgJ21pZGRsZXdhcmUnOiA8TWlkZGxld2FyZUZpbGU+W10sCiAgICAgICAgICAgICdnbG9iYWxNaWRkbGV3YXJlJzogZmFsc2UsCiAgICAgICAgICAgICdzZXJ2ZVN0YXRpY0ZpbGVzJzogZmFsc2UsCiAgICAgICAgICAgICdpbnZva2VDdXN0b21FbnRyeXBvaW50JzogZmFsc2UsCiAgICAgICAgICAgICdpbnZva2VDdXN0b21Jbml0JzogZmFsc2UsCiAgICAgICAgICB9LAogICAgICAgICksCiAgICAgICk7CiAgICB9KTsKCiAgICB0ZXN0KCdyZXRhaW5zIGludm9rZUN1c3RvbUVudHJ5cG9pbnQgKHRydWUpJywgKCkgYXN5bmMgewogICAgICBjb25zdCBjdXN0b21Qb3J0ID0gJzgwODEnOwogICAgICBjb250ZXh0LnZhcnNbJ3BvcnQnXSA9IGN1c3RvbVBvcnQ7CiAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBSb3V0ZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgbWlkZGxld2FyZTogW10sCiAgICAgICAgZGlyZWN0b3JpZXM6IFtdLAogICAgICAgIHJvdXRlczogW10sCiAgICAgICAgcm9ndWVSb3V0ZXM6IFtdLAogICAgICAgIGVuZHBvaW50czoge30sCiAgICAgICAgaW52b2tlQ3VzdG9tRW50cnlwb2ludDogdHJ1ZSwKICAgICAgKTsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgYXdhaXQgcHJlR2VuKAogICAgICAgIGNvbnRleHQsCiAgICAgICAgYnVpbGRDb25maWd1cmF0aW9uOiAoXykgPT4gY29uZmlndXJhdGlvbiwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgICAgdmVyaWZ5TmV2ZXIoKCkgPT4gbG9nZ2VyLmVycihhbnkoKSkpOwogICAgICBleHBlY3QoCiAgICAgICAgY29udGV4dC52YXJzLAogICAgICAgIGVxdWFscygKICAgICAgICAgIHsKICAgICAgICAgICAgJ3BvcnQnOiBjdXN0b21Qb3J0LAogICAgICAgICAgICAnaG9zdCc6ICcnLAogICAgICAgICAgICAnZGlyZWN0b3JpZXMnOiA8Um91dGVEaXJlY3Rvcnk+W10sCiAgICAgICAgICAgICdyb3V0ZXMnOiA8Um91dGVGaWxlPltdLAogICAgICAgICAgICAnbWlkZGxld2FyZSc6IDxNaWRkbGV3YXJlRmlsZT5bXSwKICAgICAgICAgICAgJ2dsb2JhbE1pZGRsZXdhcmUnOiBmYWxzZSwKICAgICAgICAgICAgJ3NlcnZlU3RhdGljRmlsZXMnOiBmYWxzZSwKICAgICAgICAgICAgJ2ludm9rZUN1c3RvbUVudHJ5cG9pbnQnOiB0cnVlLAogICAgICAgICAgICAnaW52b2tlQ3VzdG9tSW5pdCc6IGZhbHNlLAogICAgICAgICAgfSwKICAgICAgICApLAogICAgICApOwogICAgfSk7CgogICAgdGVzdCgncmV0YWlucyBpbnZva2VDdXN0b21Jbml0ICh0cnVlKScsICgpIGFzeW5jIHsKICAgICAgY29uc3QgY3VzdG9tUG9ydCA9ICc4MDgxJzsKICAgICAgY29udGV4dC52YXJzWydwb3J0J10gPSBjdXN0b21Qb3J0OwogICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gUm91dGVDb25maWd1cmF0aW9uKAogICAgICAgIG1pZGRsZXdhcmU6IFtdLAogICAgICAgIGRpcmVjdG9yaWVzOiBbXSwKICAgICAgICByb3V0ZXM6IFtdLAogICAgICAgIHJvZ3VlUm91dGVzOiBbXSwKICAgICAgICBlbmRwb2ludHM6IHt9LAogICAgICAgIGludm9rZUN1c3RvbUluaXQ6IHRydWUsCiAgICAgICk7CiAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgIGF3YWl0IHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IGNvbmZpZ3VyYXRpb24sCiAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgaXNFbXB0eSk7CiAgICAgIHZlcmlmeU5ldmVyKCgpID0+IGxvZ2dlci5lcnIoYW55KCkpKTsKICAgICAgZXhwZWN0KAogICAgICAgIGNvbnRleHQudmFycywKICAgICAgICBlcXVhbHMoCiAgICAgICAgICB7CiAgICAgICAgICAgICdwb3J0JzogY3VzdG9tUG9ydCwKICAgICAgICAgICAgJ2hvc3QnOiAnJywKICAgICAgICAgICAgJ2RpcmVjdG9yaWVzJzogPFJvdXRlRGlyZWN0b3J5PltdLAogICAgICAgICAgICAncm91dGVzJzogPFJvdXRlRmlsZT5bXSwKICAgICAgICAgICAgJ21pZGRsZXdhcmUnOiA8TWlkZGxld2FyZUZpbGU+W10sCiAgICAgICAgICAgICdnbG9iYWxNaWRkbGV3YXJlJzogZmFsc2UsCiAgICAgICAgICAgICdzZXJ2ZVN0YXRpY0ZpbGVzJzogZmFsc2UsCiAgICAgICAgICAgICdpbnZva2VDdXN0b21FbnRyeXBvaW50JzogZmFsc2UsCiAgICAgICAgICAgICdpbnZva2VDdXN0b21Jbml0JzogdHJ1ZSwKICAgICAgICAgIH0sCiAgICAgICAgKSwKICAgICAgKTsKICAgIH0pOwoKICAgIHRlc3QoJ3VwZGF0ZXMgY29udGV4dC52YXJzIHdoZW4gYnVpbGRSb3V0ZUNvbmZpZ3VyYXRpb24gc3VjY2VlZHMnLAogICAgICAgICgpIGFzeW5jIHsKICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9IFJvdXRlQ29uZmlndXJhdGlvbigKICAgICAgICBnbG9iYWxNaWRkbGV3YXJlOiBNaWRkbGV3YXJlRmlsZSgKICAgICAgICAgIG5hbWU6ICdtaWRkbGV3YXJlJywKICAgICAgICAgIHBhdGg6ICdtaWRkbGV3YXJlLmRhcnQnLAogICAgICAgICksCiAgICAgICAgbWlkZGxld2FyZTogWwogICAgICAgICAgTWlkZGxld2FyZUZpbGUoCiAgICAgICAgICAgIG5hbWU6ICdoZWxsb19taWRkbGV3YXJlJywKICAgICAgICAgICAgcGF0aDogJ2hlbGxvL21pZGRsZXdhcmUuZGFydCcsCiAgICAgICAgICApLAogICAgICAgIF0sCiAgICAgICAgZGlyZWN0b3JpZXM6IFsKICAgICAgICAgIFJvdXRlRGlyZWN0b3J5KAogICAgICAgICAgICBuYW1lOiAnXycsCiAgICAgICAgICAgIHJvdXRlOiAnLycsCiAgICAgICAgICAgIG1pZGRsZXdhcmU6IFtdLAogICAgICAgICAgICBmaWxlczogWwogICAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICAgIG5hbWU6ICdpbmRleCcsCiAgICAgICAgICAgICAgICBwYXRoOiAnaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgICByb3V0ZTogJy8nLAogICAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgICApLAogICAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICAgIG5hbWU6ICdoZWxsbycsCiAgICAgICAgICAgICAgICBwYXRoOiAnaGVsbG8uZGFydCcsCiAgICAgICAgICAgICAgICByb3V0ZTogJy9oZWxsbycsCiAgICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICAgICksCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICApLAogICAgICAgIF0sCiAgICAgICAgcm91dGVzOiBbCiAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgIG5hbWU6ICdpbmRleCcsCiAgICAgICAgICAgIHBhdGg6ICdpbmRleC5kYXJ0JywKICAgICAgICAgICAgcm91dGU6ICcvJywKICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgKSwKICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgbmFtZTogJ2hlbGxvJywKICAgICAgICAgICAgcGF0aDogJ2hlbGxvLmRhcnQnLAogICAgICAgICAgICByb3V0ZTogJy9oZWxsbycsCiAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICksCiAgICAgICAgXSwKICAgICAgICBlbmRwb2ludHM6IHsKICAgICAgICAgICcvJzogWwogICAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgbmFtZTogJ2luZGV4JywKICAgICAgICAgICAgICBwYXRoOiAnaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgcm91dGU6ICcvJywKICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgKSwKICAgICAgICAgIF0sCiAgICAgICAgICAnL2hlbGxvJzogWwogICAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgbmFtZTogJ2hlbGxvJywKICAgICAgICAgICAgICBwYXRoOiAnaGVsbG8uZGFydCcsCiAgICAgICAgICAgICAgcm91dGU6ICcvaGVsbG8nLAogICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICApLAogICAgICAgICAgXSwKICAgICAgICB9LAogICAgICAgIHJvZ3VlUm91dGVzOiBbXSwKICAgICAgICBzZXJ2ZVN0YXRpY0ZpbGVzOiB0cnVlLAogICAgICApOwogICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwogICAgICBhd2FpdCBwcmVHZW4oCiAgICAgICAgY29udGV4dCwKICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiBjb25maWd1cmF0aW9uLAogICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICk7CiAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGlzRW1wdHkpOwogICAgICB2ZXJpZnlOZXZlcigoKSA9PiBsb2dnZXIuZXJyKGFueSgpKSk7CiAgICAgIGV4cGVjdCgKICAgICAgICBjb250ZXh0LnZhcnMsCiAgICAgICAgZXF1YWxzKAogICAgICAgICAgewogICAgICAgICAgICAncG9ydCc6ICc4MDgwJywKICAgICAgICAgICAgJ2hvc3QnOiAnJywKICAgICAgICAgICAgJ2RpcmVjdG9yaWVzJzogWwogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICduYW1lJzogJ18nLAogICAgICAgICAgICAgICAgJ3JvdXRlJzogJy8nLAogICAgICAgICAgICAgICAgJ21pZGRsZXdhcmUnOiA8TWFwPFN0cmluZywgZHluYW1pYz4+W10sCiAgICAgICAgICAgICAgICAnZmlsZXMnOiBbCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdpbmRleCcsCiAgICAgICAgICAgICAgICAgICAgJ3BhdGgnOiAnaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgICAgICAgJ3JvdXRlJzogJy8nLAogICAgICAgICAgICAgICAgICAgICdmaWxlX3BhcmFtcyc6IDxTdHJpbmc+W10sCiAgICAgICAgICAgICAgICAgICAgJ3dpbGRjYXJkJzogZmFsc2UsCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdoZWxsbycsCiAgICAgICAgICAgICAgICAgICAgJ3BhdGgnOiAnaGVsbG8uZGFydCcsCiAgICAgICAgICAgICAgICAgICAgJ3JvdXRlJzogJy9oZWxsbycsCiAgICAgICAgICAgICAgICAgICAgJ2ZpbGVfcGFyYW1zJzogPFN0cmluZz5bXSwKICAgICAgICAgICAgICAgICAgICAnd2lsZGNhcmQnOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICdkaXJlY3RvcnlfcGFyYW1zJzogPFN0cmluZz5bXSwKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICdyb3V0ZXMnOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJ25hbWUnOiAnaW5kZXgnLAogICAgICAgICAgICAgICAgJ3BhdGgnOiAnaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgICAncm91dGUnOiAnLycsCiAgICAgICAgICAgICAgICAnZmlsZV9wYXJhbXMnOiBjb25zdCA8U3RyaW5nPltdLAogICAgICAgICAgICAgICAgJ3dpbGRjYXJkJzogZmFsc2UsCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAnbmFtZSc6ICdoZWxsbycsCiAgICAgICAgICAgICAgICAncGF0aCc6ICdoZWxsby5kYXJ0JywKICAgICAgICAgICAgICAgICdyb3V0ZSc6ICcvaGVsbG8nLAogICAgICAgICAgICAgICAgJ2ZpbGVfcGFyYW1zJzogY29uc3QgPFN0cmluZz5bXSwKICAgICAgICAgICAgICAgICd3aWxkY2FyZCc6IGZhbHNlLAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgJ21pZGRsZXdhcmUnOiBbCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJ25hbWUnOiAnaGVsbG9fbWlkZGxld2FyZScsCiAgICAgICAgICAgICAgICAncGF0aCc6ICdoZWxsby9taWRkbGV3YXJlLmRhcnQnLAogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICdnbG9iYWxNaWRkbGV3YXJlJzogewogICAgICAgICAgICAgICduYW1lJzogJ21pZGRsZXdhcmUnLAogICAgICAgICAgICAgICdwYXRoJzogJ21pZGRsZXdhcmUuZGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdzZXJ2ZVN0YXRpY0ZpbGVzJzogdHJ1ZSwKICAgICAgICAgICAgJ2ludm9rZUN1c3RvbUVudHJ5cG9pbnQnOiBmYWxzZSwKICAgICAgICAgICAgJ2ludm9rZUN1c3RvbUluaXQnOiBmYWxzZSwKICAgICAgICAgIH0sCiAgICAgICAgKSwKICAgICAgKTsKICAgIH0pOwogIH0pOwp9Cg==", - "type": "text" + "type": "text", }, { "path": "test/src/exit_overrides_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgppbXBvcnQgJy4uLy4uL3NyYy9leGl0X292ZXJyaWRlcy5kYXJ0JzsKCnZvaWQgbWFpbigpIHsKICBncm91cCgnRXhpdE92ZXJyaWRlcycsICgpIHsKICAgIGdyb3VwKCdydW5ab25lZCcsICgpIHsKICAgICAgdGVzdCgndXNlcyBkZWZhdWx0IGV4aXQgd2hlbiBub3Qgc3BlY2lmaWVkJywgKCkgewogICAgICAgIEV4aXRPdmVycmlkZXMucnVuWm9uZWQoKCkgewogICAgICAgICAgZmluYWwgb3ZlcnJpZGVzID0gRXhpdE92ZXJyaWRlcy5jdXJyZW50OwogICAgICAgICAgZXhwZWN0KG92ZXJyaWRlcyEuZXhpdCwgZXF1YWxzKGV4aXQpKTsKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICB0ZXN0KCd1c2VzIGN1c3RvbSBleGl0IHdoZW4gc3BlY2lmaWVkJywgKCkgewogICAgICAgIEV4aXRPdmVycmlkZXMucnVuWm9uZWQoCiAgICAgICAgICAoKSB7CiAgICAgICAgICAgIGZpbmFsIG92ZXJyaWRlcyA9IEV4aXRPdmVycmlkZXMuY3VycmVudDsKICAgICAgICAgICAgZXhwZWN0KG92ZXJyaWRlcyEuZXhpdCwgaXNOb3QoZXF1YWxzKGV4aXQpKSk7CiAgICAgICAgICB9LAogICAgICAgICAgZXhpdDogKF8pIHt9LAogICAgICAgICk7CiAgICAgIH0pOwogICAgfSk7CiAgfSk7Cn0K", - "type": "text" - } + "type": "text", + }, ], "name": "dart_frog_dev_server", "description": "A dart_frog dev server", @@ -52,19 +52,19 @@ final dartFrogDevServerBundle = MasonBundle.fromJson({ "path": "README.md", "data": "IyBkYXJ0X2Zyb2dfZGV2X3NlcnZlcgoKWyFbUG93ZXJlZCBieSBNYXNvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZ0aW55dXJsLmNvbSUyRm1hc29uLWJhZGdlKV0oaHR0cHM6Ly9naXRodWIuY29tL2ZlbGFuZ2VsL21hc29uKQoKQSBkYXJ0X2Zyb2cgZGV2IHNlcnZlcgoKX0dlbmVyYXRlZCBieSBbbWFzb25dWzFdIPCfp7FfCgpbMV06IGh0dHBzOi8vZ2l0aHViLmNvbS9mZWxhbmdlbC9tYXNvbgo=", - "type": "text" + "type": "text", }, "changelog": { "path": "CHANGELOG.md", "data": "IyAwLjEuMCsxCgotIGZlYXQ6IGJhc2ljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZGFydCBmcm9nIGRldiBzZXJ2ZXIK", - "type": "text" + "type": "text", }, "license": { "path": "LICENSE", "data": "TUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAyMiBWZXJ5IEdvb2QgVmVudHVyZXMKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCg==", - "type": "text" + "type": "text", }, - "vars": {} + "vars": {}, }); diff --git a/packages/dart_frog_cli/lib/src/commands/list/list.dart b/packages/dart_frog_cli/lib/src/commands/list/list.dart index c2d0a6ec1..444c595fd 100644 --- a/packages/dart_frog_cli/lib/src/commands/list/list.dart +++ b/packages/dart_frog_cli/lib/src/commands/list/list.dart @@ -7,9 +7,8 @@ import 'package:mason/mason.dart'; /// Definition for a function that builds a [RouteConfiguration] from a /// [Directory]. -typedef RouteConfigurationBuilder = RouteConfiguration Function( - Directory directory, -); +typedef RouteConfigurationBuilder = + RouteConfiguration Function(Directory directory); /// {@template list_command} /// `dart_frog list "path/to/project"` @@ -25,7 +24,8 @@ class ListCommand extends DartFrogCommand { argParser.addFlag( 'plain', abbr: 'p', - help: 'Return the output in a plain format, printing each route on a new ' + help: + 'Return the output in a plain format, printing each route on a new ' 'line.', negatable: false, ); @@ -66,9 +66,7 @@ class ListCommand extends DartFrogCommand { Directory get _projectDirectory { final rest = results.rest; _validateProjectDirectoryArg(rest); - return Directory( - rest.isEmpty ? Directory.current.path : rest.first, - ); + return Directory(rest.isEmpty ? Directory.current.path : rest.first); } void _validateProjectDirectoryArg(List args) { diff --git a/packages/dart_frog_cli/lib/src/commands/new/new.dart b/packages/dart_frog_cli/lib/src/commands/new/new.dart index eb4574db4..aa80842e4 100644 --- a/packages/dart_frog_cli/lib/src/commands/new/new.dart +++ b/packages/dart_frog_cli/lib/src/commands/new/new.dart @@ -16,10 +16,8 @@ import 'package:path/path.dart' as path; /// {@endtemplate} class NewCommand extends DartFrogCommand { /// {@macro new_command} - NewCommand({ - super.logger, - GeneratorBuilder? generator, - }) : _generator = generator ?? MasonGenerator.fromBundle { + NewCommand({super.logger, GeneratorBuilder? generator}) + : _generator = generator ?? MasonGenerator.fromBundle { addSubcommand(newRouteCommand = _NewSubCommand('route')); addSubcommand(newMiddlewareCommand = _NewSubCommand('middleware')); } @@ -79,21 +77,16 @@ class _NewSubCommand extends DartFrogCommand { } final routeName = rest.first; if (routeName.isEmpty) { - throw UsageException( - 'Route path must not be empty', - usageString, - ); + throw UsageException('Route path must not be empty', usageString); } - final segments = - routeName.split('/').skipWhile((element) => element.isEmpty); + final segments = routeName + .split('/') + .skipWhile((element) => element.isEmpty); for (final segment in segments) { if (segment.isEmpty) { - throw UsageException( - 'Route path cannot contain empty segments', - '', - ); + throw UsageException('Route path cannot contain empty segments', ''); } if (segment.contains(RegExp(r'[^a-zA-Z\d_\[\]]'))) { throw UsageException( @@ -112,10 +105,7 @@ class _NewSubCommand extends DartFrogCommand { final generator = await parent._generator(dartFrogNewBundle); - final vars = { - 'route_path': routePath, - 'type': name, - }; + final vars = {'route_path': routePath, 'type': name}; final routesDirectory = Directory(path.join(cwd.path, 'routes')); if (!routesDirectory.existsSync()) { diff --git a/packages/dart_frog_cli/lib/src/commands/new/templates/dart_frog_new_bundle.dart b/packages/dart_frog_cli/lib/src/commands/new/templates/dart_frog_new_bundle.dart index f2e0f03d1..875f077e2 100644 --- a/packages/dart_frog_cli/lib/src/commands/new/templates/dart_frog_new_bundle.dart +++ b/packages/dart_frog_cli/lib/src/commands/new/templates/dart_frog_new_bundle.dart @@ -9,124 +9,124 @@ final dartFrogNewBundle = MasonBundle.fromJson({ "path": "{{filename}}", "data": "aW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZy9kYXJ0X2Zyb2cuZGFydCc7Cnt7I2lzX3JvdXRlfX0Ke3s+IHJvdXRlLmRhcnR9fQp7ey9pc19yb3V0ZX19e3sjaXNfbWlkZGxld2FyZX19Cnt7PiBtaWRkbGV3YXJlLmRhcnR9fQp7ey9pc19taWRkbGV3YXJlfX0=", - "type": "text" + "type": "text", }, { "path": "{{~ middleware.dart }}", "data": "SGFuZGxlciBtaWRkbGV3YXJlKEhhbmRsZXIgaGFuZGxlcikgewogIC8vIFRPRE86IGltcGxlbWVudCBtaWRkbGV3YXJlCiAgcmV0dXJuIGhhbmRsZXI7Cn0=", - "type": "text" + "type": "text", }, { "path": "{{~ route.dart }}", "data": "e3tecGFyYW1zfX1SZXNwb25zZSBvblJlcXVlc3QoUmVxdWVzdENvbnRleHQgY29udGV4dCkgewp7ey9wYXJhbXN9fXt7I3BhcmFtcy4wfX1SZXNwb25zZSBvblJlcXVlc3QoCiAgUmVxdWVzdENvbnRleHQgY29udGV4dCx7eyNwYXJhbXN9fQogIFN0cmluZyB7eyNjYW1lbENhc2V9fXt7Ln19e3svY2FtZWxDYXNlfX0se3svcGFyYW1zfX0KKSB7Cnt7L3BhcmFtcy4wfX0gIC8vIFRPRE86IGltcGxlbWVudCByb3V0ZSBoYW5kbGVyCiAgcmV0dXJuIFJlc3BvbnNlKGJvZHk6ICdUaGlzIGlzIGEgbmV3IHJvdXRlIScpOwp9", - "type": "text" - } + "type": "text", + }, ], "hooks": [ { "path": "lib/post_gen.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfbmV3X2hvb2tzL3NyYy9leGl0X292ZXJyaWRlcy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1hc29uL21hc29uLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7Cgp2b2lkIF9kZWZhdWx0RXhpdChpbnQgY29kZSkgPT4gRXhpdE92ZXJyaWRlcy5jdXJyZW50Py5leGl0ID8/IGlvLmV4aXQ7CgpGdXR1cmU8dm9pZD4gcG9zdEdlbigKICBIb29rQ29udGV4dCBjb250ZXh0LCB7CiAgaW8uRGlyZWN0b3J5PyBkaXJlY3RvcnksCiAgdm9pZCBGdW5jdGlvbihpbnQgZXhpdENvZGUpIGV4aXQgPSBfZGVmYXVsdEV4aXQsCn0pIGFzeW5jIHsKICBmaW5hbCBzdWNjZWVkZWQgPSBjb250ZXh0LnZhcnMuY29udGFpbnNLZXkoJ2Rpcl9wYXRoJyk7CiAgaWYgKCFzdWNjZWVkZWQpIHsKICAgIHJldHVybiBleGl0KDEpOwogIH0KCiAgZmluYWwgZGlyUGF0aCA9IGNvbnRleHQudmFyc1snZGlyX3BhdGgnXSBhcyBTdHJpbmc7CiAgZmluYWwgY3VycmVudERpcmVjdG9yeSA9IGRpcmVjdG9yeSA/PyBpby5EaXJlY3RvcnkuY3VycmVudDsKCiAgZmluYWwgY29udGFpbmluZ0RpcmVjdG9yeVBhdGggPSBwYXRoLnJlbGF0aXZlKAogICAgaW8uRGlyZWN0b3J5KHBhdGguam9pbihjdXJyZW50RGlyZWN0b3J5LnBhdGgsIGRpclBhdGgpKS5wYXRoLAogICk7CiAgZmluYWwgZmlsZW5hbWUgPSBjb250ZXh0LnZhcnNbJ2ZpbGVuYW1lJ10gYXMgU3RyaW5nOwogIHRyeSB7CiAgICBpby5EaXJlY3RvcnkoY29udGFpbmluZ0RpcmVjdG9yeVBhdGgpLmNyZWF0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgIGlvLkZpbGUoCiAgICAgIHBhdGguam9pbihjdXJyZW50RGlyZWN0b3J5LnBhdGgsIGZpbGVuYW1lKSwKICAgICkucmVuYW1lU3luYygnJGNvbnRhaW5pbmdEaXJlY3RvcnlQYXRoLyRmaWxlbmFtZScpOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBjb250ZXh0LmxvZ2dlci5lcnIoJyRlcnJvcicpOwogICAgcmV0dXJuIGV4aXQoMSk7CiAgfQp9Cg==", - "type": "text" + "type": "text", }, { "path": "lib/pre_gen.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfZ2VuL2RhcnRfZnJvZ19nZW4uZGFydCc7CmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfbmV3X2hvb2tzL3NyYy9leGl0X292ZXJyaWRlcy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19uZXdfaG9va3Mvc3JjL25vcm1hbGl6ZV9yb3V0ZV9wYXRoLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6ZGFydF9mcm9nX25ld19ob29rcy9zcmMvcGFyYW1ldGVyX3N5bnRheC5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19uZXdfaG9va3Mvc3JjL3JvdXRlX2NvbmZpZ3VyYXRpb25fdXRpbHMuZGFydCc7CmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfbmV3X2hvb2tzL3NyYy9yb3V0ZV90b19wYXRoLmRhcnQnOwoKaW1wb3J0ICdwYWNrYWdlOm1hc29uL21hc29uLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7Cgp0eXBlZGVmIFJvdXRlQ29uZmlndXJhdGlvbkJ1aWxkZXIgPSBSb3V0ZUNvbmZpZ3VyYXRpb24gRnVuY3Rpb24oCiAgaW8uRGlyZWN0b3J5IGRpcmVjdG9yeSwKKTsKCnZvaWQgX2RlZmF1bHRFeGl0KGludCBjb2RlKSA9PiBFeGl0T3ZlcnJpZGVzLmN1cnJlbnQ/LmV4aXQgPz8gaW8uZXhpdDsKCnZvaWQgcHJlR2VuKAogIEhvb2tDb250ZXh0IGNvbnRleHQsIHsKICBpby5EaXJlY3Rvcnk/IGRpcmVjdG9yeSwKICBSb3V0ZUNvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkQ29uZmlndXJhdGlvbiA9IGJ1aWxkUm91dGVDb25maWd1cmF0aW9uLAogIHZvaWQgRnVuY3Rpb24oaW50IGV4aXRDb2RlKSBleGl0ID0gX2RlZmF1bHRFeGl0LAp9KSB7CiAgLy8gVGhlIGRhcnQgZnJvZyBzZXJ2ZXIgcHJvamVjdCBkaXJlY3RvcnkKICBmaW5hbCBwcm9qZWN0RGlyZWN0b3J5ID0gZGlyZWN0b3J5ID8/IGlvLkRpcmVjdG9yeS5jdXJyZW50OwoKICAvLyBCdWlsZCB0aGUgcm91dGUgY29uZmlndXJhdGlvbgogIGZpbmFsIFJvdXRlQ29uZmlndXJhdGlvbiByb3V0ZUNvbmZpZ3VyYXRpb247CiAgdHJ5IHsKICAgIHJvdXRlQ29uZmlndXJhdGlvbiA9IGJ1aWxkQ29uZmlndXJhdGlvbihwcm9qZWN0RGlyZWN0b3J5KTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29udGV4dC5sb2dnZXIuZXJyKCckZXJyb3InKTsKICAgIHJldHVybiBleGl0KDEpOwogIH0KCiAgLy8gR2V0IHRoZSBkZXNpcmVkIHR5cGUgb2YgY3JlYXRpb24KICBmaW5hbCB0eXBlID0gY29udGV4dC52YXJzWyd0eXBlJ10gYXMgU3RyaW5nOwoKICAvLyBWZXJpZnkgaWYgY3VycmVudCByb3V0ZSBjb25maWd1cmF0aW9uIGhhdmUgY29uZmxpY3RzIGFuZCBiYWlsIG91dCBpZgogIC8vIGFueSBhcmUgZm91bmQKICB0cnkgewogICAgcm91dGVDb25maWd1cmF0aW9uLnZhbGlkYXRlKCk7CiAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgY29udGV4dC5sb2dnZXIuZXJyKCdGYWlsZWQgdG8gY3JlYXRlICR0eXBlOiAke2V4Y2VwdGlvbi5tZXNzYWdlfScpOwogICAgcmV0dXJuIGV4aXQoMSk7CiAgfQoKICAvLyBUaGUgcGF0aCBpbiB3aGljaCB0aGUgcm91dGUgb3IgbWlkZGxld2FyZSB3aWxsIGJlIGNyZWF0ZWQKICBmaW5hbCByb3V0ZVBhdGggPSBub3JtYWxpemVSb3V0ZVBhdGgoY29udGV4dC52YXJzWydyb3V0ZV9wYXRoJ10gYXMgU3RyaW5nKTsKCiAgaWYgKHR5cGUgPT0gJ3JvdXRlJykgewogICAgcmV0dXJuIF9wcmVHZW5Sb3V0ZSgKICAgICAgY29udGV4dCwKICAgICAgcm91dGVQYXRoOiByb3V0ZVBhdGgsCiAgICAgIHJvdXRlQ29uZmlndXJhdGlvbjogcm91dGVDb25maWd1cmF0aW9uLAogICAgICBwcm9qZWN0RGlyZWN0b3J5OiBwcm9qZWN0RGlyZWN0b3J5LAogICAgICBleGl0OiBleGl0LAogICAgKTsKICB9CgogIGlmICh0eXBlID09ICdtaWRkbGV3YXJlJykgewogICAgcmV0dXJuIF9wcmVHZW5NaWRkbGV3YXJlKAogICAgICBjb250ZXh0LAogICAgICByb3V0ZVBhdGg6IHJvdXRlUGF0aCwKICAgICAgcm91dGVDb25maWd1cmF0aW9uOiByb3V0ZUNvbmZpZ3VyYXRpb24sCiAgICAgIHByb2plY3REaXJlY3Rvcnk6IHByb2plY3REaXJlY3RvcnksCiAgICAgIGV4aXQ6IGV4aXQsCiAgICApOwogIH0KCiAgY29udGV4dC5sb2dnZXIuZXJyKCdVbnJlY29nbml6ZWQgdHlwZTogJHR5cGUnKTsKICByZXR1cm4gZXhpdCgxKTsKfQoKdm9pZCBfcHJlR2VuUm91dGUoCiAgSG9va0NvbnRleHQgY29udGV4dCwgewogIHJlcXVpcmVkIFN0cmluZyByb3V0ZVBhdGgsCiAgcmVxdWlyZWQgUm91dGVDb25maWd1cmF0aW9uIHJvdXRlQ29uZmlndXJhdGlvbiwKICByZXF1aXJlZCBpby5EaXJlY3RvcnkgcHJvamVjdERpcmVjdG9yeSwKICByZXF1aXJlZCB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZXhpdCwKfSkgewogIGZpbmFsIHJvdXRlc0RpcmVjdG9yeVBhdGggPSBwYXRoLnJlbGF0aXZlKAogICAgaW8uRGlyZWN0b3J5KHBhdGguam9pbihwcm9qZWN0RGlyZWN0b3J5LnBhdGgsICdyb3V0ZXMnKSkucGF0aCwKICApOwoKICAvLyBWZXJpZnkgaWYgdGhlIGVuZHBvaW50IGRvZXMgYWxyZWFkeSBleGlzdC4KICBmaW5hbCBlbmRwb2ludEV4aXN0cyA9IHJvdXRlQ29uZmlndXJhdGlvbi5lbmRwb2ludHMuY29udGFpbnNLZXkocm91dGVQYXRoKTsKICBpZiAoZW5kcG9pbnRFeGlzdHMpIHsKICAgIGNvbnRleHQubG9nZ2VyLmVycignRmFpbGVkIHRvIGNyZWF0ZSByb3V0ZTogJHJvdXRlUGF0aCBhbHJlYWR5IGV4aXN0cy4nKTsKICAgIHJldHVybiBleGl0KDEpOwogIH0KCiAgLy8gVmVyaWZ5IGlmIHRoZSBnaXZlbiByb3V0ZSBhbHJlYWR5IGV4aXN0cyBhcyBkaXJlY3RvcnkuCiAgZmluYWwgZXhpc3RzQXNEaXJlY3RvcnkgPSBpby5EaXJlY3RvcnkoCiAgICBwYXRoLndpdGhvdXRFeHRlbnNpb24oCiAgICAgIHJvdXRlVG9QYXRoKAogICAgICAgIHJvdXRlUGF0aCwKICAgICAgICBwcmVhbWJsZTogcm91dGVzRGlyZWN0b3J5UGF0aCwKICAgICAgKS50b0JyYWNrZXRQYXJhbWV0ZXJTeW50YXgsCiAgICApLAogICkuZXhpc3RzU3luYygpOwoKICAvLyBJZiB0aGUgcm91dGUgZG9lcyBub3QgZXhpc3QgYXMgZGlyZWN0b3J5LCB3ZSBtdXN0IGNoZWNrIGlmIGFueSBvZiBpdHMKICAvLyBhbmNlc3RvciByb3V0ZXMgZXhpc3RzIGFzIGZpbGUgcm91dGVzIHRvIGF2b2lkIHJvZ3VlIHJvdXRlcy4KICBpZiAoIWV4aXN0c0FzRGlyZWN0b3J5KSB7CiAgICBmaW5hbCBmaWxlUm91dGUgPSByb3V0ZUNvbmZpZ3VyYXRpb24uY29udGFpbmluZ0ZpbGVSb3V0ZShyb3V0ZVBhdGgpOwoKICAgIGlmIChmaWxlUm91dGUgIT0gbnVsbCkgewogICAgICBmaW5hbCBmaWxlcGF0aCA9IHBhdGgubm9ybWFsaXplKAogICAgICAgIHBhdGguam9pbigKICAgICAgICAgIHJvdXRlc0RpcmVjdG9yeVBhdGgsCiAgICAgICAgICBmaWxlUm91dGUucGF0aCwKICAgICAgICApLAogICAgICApOwoKICAgICAgaW8uRGlyZWN0b3J5KHBhdGgud2l0aG91dEV4dGVuc2lvbihmaWxlcGF0aCkpLmNyZWF0ZVN5bmMoKTsKCiAgICAgIGZpbmFsIG5ld0ZpbGVwYXRoID0gZmlsZXBhdGgucmVwbGFjZUZpcnN0KCcuZGFydCcsICcvaW5kZXguZGFydCcpOwogICAgICBpby5GaWxlKGZpbGVwYXRoKS5yZW5hbWVTeW5jKG5ld0ZpbGVwYXRoKTsKICAgICAgY29udGV4dC5sb2dnZXIuZGV0YWlsKAogICAgICAgICdSZW5hbWVkICRmaWxlcGF0aCB0byAkbmV3RmlsZXBhdGggdG8gYXZvaWQgcm9ndWUgcm91dGVzJywKICAgICAgKTsKICAgIH0KICB9CgogIGZpbmFsIHJvdXRlRmlsZU5hbWUgPSByb3V0ZVRvUGF0aCgKICAgIHJvdXRlUGF0aCwKICAgIHByZWZlckluZGV4OiBleGlzdHNBc0RpcmVjdG9yeSwKICAgIHByZWFtYmxlOiByb3V0ZXNEaXJlY3RvcnlQYXRoLAogICkudG9CcmFja2V0UGFyYW1ldGVyU3ludGF4OwoKICBjb250ZXh0LmxvZ2dlci5kZXRhaWwoJ0NyZWF0aW5nIHJvdXRlIGZpbGU6ICRyb3V0ZUZpbGVOYW1lJyk7CgogIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJOYW1lczsKICB0cnkgewogICAgcGFyYW1ldGVyTmFtZXMgPSByb3V0ZUZpbGVOYW1lLmdldFBhcmFtZXRlck5hbWVzKCk7CiAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgY29udGV4dC5sb2dnZXIuZXJyKCdGYWlsZWQgdG8gY3JlYXRlIHJvdXRlOiAke2V4Y2VwdGlvbi5tZXNzYWdlfScpOwogICAgcmV0dXJuIGV4aXQoMSk7CiAgfQoKICBjb250ZXh0LnZhcnNbJ2lzX3JvdXRlJ10gPSB0cnVlOwogIGNvbnRleHQudmFyc1snZGlyX3BhdGgnXSA9IHBhdGguZGlybmFtZShyb3V0ZUZpbGVOYW1lKTsKICBjb250ZXh0LnZhcnNbJ2ZpbGVuYW1lJ10gPSBwYXRoLmJhc2VuYW1lKHJvdXRlRmlsZU5hbWUpOwogIGNvbnRleHQudmFyc1sncGFyYW1zJ10gPSBwYXJhbWV0ZXJOYW1lczsKfQoKdm9pZCBfcHJlR2VuTWlkZGxld2FyZSgKICBIb29rQ29udGV4dCBjb250ZXh0LCB7CiAgcmVxdWlyZWQgU3RyaW5nIHJvdXRlUGF0aCwKICByZXF1aXJlZCBSb3V0ZUNvbmZpZ3VyYXRpb24gcm91dGVDb25maWd1cmF0aW9uLAogIHJlcXVpcmVkIGlvLkRpcmVjdG9yeSBwcm9qZWN0RGlyZWN0b3J5LAogIHJlcXVpcmVkIHZvaWQgRnVuY3Rpb24oaW50IGV4aXRDb2RlKSBleGl0LAp9KSB7CiAgZmluYWwgcm91dGVzRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVsYXRpdmUoCiAgICBpby5EaXJlY3RvcnkocGF0aC5qb2luKHByb2plY3REaXJlY3RvcnkucGF0aCwgJ3JvdXRlcycpKS5wYXRoLAogICk7CgogIGNvbnN0IG1pZGRsZXdhcmVGaWxlbmFtZSA9ICdfbWlkZGxld2FyZS5kYXJ0JzsKCiAgLy8gR2V0IHRoZSBwYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBtaWRkbGV3YXJlIGZpbGUKICBmaW5hbCBTdHJpbmcgbWlkZGxld2FyZUNvbnRhaW5pbmdEaXI7CiAgaWYgKHJvdXRlUGF0aCA9PSAnLycpIHsKICAgIG1pZGRsZXdhcmVDb250YWluaW5nRGlyID0gcm91dGVzRGlyZWN0b3J5UGF0aDsKICB9IGVsc2UgewogICAgbWlkZGxld2FyZUNvbnRhaW5pbmdEaXIgPSBwYXRoLndpdGhvdXRFeHRlbnNpb24oCiAgICAgIHJvdXRlVG9QYXRoKAogICAgICAgIHJvdXRlUGF0aC50b0JyYWNrZXRQYXJhbWV0ZXJTeW50YXgsCiAgICAgICAgcHJlYW1ibGU6IHJvdXRlc0RpcmVjdG9yeVBhdGgsCiAgICAgICksCiAgICApOwogIH0KCiAgLy8gVmVyaWZ5IGlmIHRoZSBtaWRkbGV3YXJlIGZpbGUgYWxyZWFkeSBleGlzdHMKICBmaW5hbCBtaWRkbGV3YXJlRmlsZVBhdGggPQogICAgICBwYXRoLmpvaW4obWlkZGxld2FyZUNvbnRhaW5pbmdEaXIsIG1pZGRsZXdhcmVGaWxlbmFtZSk7CiAgZmluYWwgbWlkZGxld2FyZUV4aXN0cyA9IGlvLkZpbGUobWlkZGxld2FyZUZpbGVQYXRoKS5leGlzdHNTeW5jKCk7CiAgaWYgKG1pZGRsZXdhcmVFeGlzdHMpIHsKICAgIGNvbnRleHQubG9nZ2VyLmVycignVGhlcmUgaXMgYWxyZWFkeSBhIG1pZGRsZXdhcmUgYXQgJG1pZGRsZXdhcmVGaWxlUGF0aCcpOwogICAgcmV0dXJuIGV4aXQoMSk7CiAgfQoKICAvLyBWZXJpZnkgaWYgdGhlIGdpdmVuIHJvdXRlIGFscmVhZHkgZXhpc3RzIGFzIGRpcmVjdG9yeQogIGZpbmFsIHJvdXRlRXhpc3RzQXNEaXJlY3RvcnkgPSBpby5EaXJlY3RvcnkoCiAgICBtaWRkbGV3YXJlQ29udGFpbmluZ0Rpci50b0JyYWNrZXRQYXJhbWV0ZXJTeW50YXgsCiAgKS5leGlzdHNTeW5jKCk7CgogIC8vIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBleGlzdCBhcyBkaXJlY3RvcnksIHdlIG11c3QgY2hlY2sgaWYgYW55IG9mIGl0cwogIC8vIGFuY2VzdG9yIHJvdXRlcyBleGlzdHMgYXMgZmlsZSByb3V0ZXMgdG8gYXZvaWQgcm9ndWUgcm91dGVzLgogIGlmICghcm91dGVFeGlzdHNBc0RpcmVjdG9yeSkgewogICAgZmluYWwgZmlsZVJvdXRlID0gcm91dGVDb25maWd1cmF0aW9uLmNvbnRhaW5pbmdGaWxlUm91dGUoCiAgICAgIHJvdXRlUGF0aCwKICAgICAgaW5jbHVkZVNlbGY6IHRydWUsCiAgICApOwoKICAgIGlmIChmaWxlUm91dGUgIT0gbnVsbCkgewogICAgICBmaW5hbCBmaWxlUGF0aCA9IHBhdGgubm9ybWFsaXplKAogICAgICAgIHBhdGguam9pbihyb3V0ZXNEaXJlY3RvcnlQYXRoLCBmaWxlUm91dGUucGF0aCksCiAgICAgICk7CgogICAgICBpby5EaXJlY3RvcnkocGF0aC53aXRob3V0RXh0ZW5zaW9uKGZpbGVQYXRoKSkuY3JlYXRlU3luYygpOwoKICAgICAgZmluYWwgbmV3RmlsZXBhdGggPSBmaWxlUGF0aC5yZXBsYWNlRmlyc3QoJy5kYXJ0JywgJy9pbmRleC5kYXJ0Jyk7CiAgICAgIGlvLkZpbGUoZmlsZVBhdGgpLnJlbmFtZVN5bmMobmV3RmlsZXBhdGgpOwogICAgICBjb250ZXh0LmxvZ2dlcgogICAgICAgICAgLmRldGFpbCgnUmVuYW1lZCAkZmlsZVBhdGggdG8gJG5ld0ZpbGVwYXRoIHRvIGF2b2lkIHJvZ3VlIHJvdXRlcycpOwogICAgfQogIH0KCiAgdHJ5IHsKICAgIG1pZGRsZXdhcmVDb250YWluaW5nRGlyLnRvQnJhY2tldFBhcmFtZXRlclN5bnRheC5nZXRQYXJhbWV0ZXJOYW1lcygpOwogIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChleGNlcHRpb24pIHsKICAgIGNvbnRleHQubG9nZ2VyLmVycignRmFpbGVkIHRvIGNyZWF0ZSBtaWRkbGV3YXJlOiAke2V4Y2VwdGlvbi5tZXNzYWdlfScpOwogICAgcmV0dXJuIGV4aXQoMSk7CiAgfQoKICBjb250ZXh0LmxvZ2dlci5kZXRhaWwoCiAgICAnQ3JlYXRpbmcgbWlkZGxld2FyZSBmaWxlOiAke21pZGRsZXdhcmVGaWxlUGF0aC50b0JyYWNrZXRQYXJhbWV0ZXJTeW50YXh9JywKICApOwoKICBjb250ZXh0LnZhcnNbJ2lzX21pZGRsZXdhcmUnXSA9IHRydWU7CiAgY29udGV4dC52YXJzWydkaXJfcGF0aCddID0gbWlkZGxld2FyZUNvbnRhaW5pbmdEaXIudG9CcmFja2V0UGFyYW1ldGVyU3ludGF4OwogIGNvbnRleHQudmFyc1snZmlsZW5hbWUnXSA9IG1pZGRsZXdhcmVGaWxlbmFtZTsKfQo=", - "type": "text" + "type": "text", }, { "path": "lib/src/exit_overrides.dart", "data": "aW1wb3J0ICdkYXJ0OmFzeW5jJzsKaW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmNvbnN0IF9hc3luY1J1blpvbmVkID0gcnVuWm9uZWQ7CgphYnN0cmFjdCBjbGFzcyBFeGl0T3ZlcnJpZGVzIHsKICBzdGF0aWMgZmluYWwgX3Rva2VuID0gT2JqZWN0KCk7CgogIHN0YXRpYyBFeGl0T3ZlcnJpZGVzPyBnZXQgY3VycmVudCB7CiAgICByZXR1cm4gWm9uZS5jdXJyZW50W190b2tlbl0gYXMgRXhpdE92ZXJyaWRlcz87CiAgfQoKICBzdGF0aWMgUiBydW5ab25lZDxSPihSIEZ1bmN0aW9uKCkgYm9keSwge3ZvaWQgRnVuY3Rpb24oaW50KT8gZXhpdH0pIHsKICAgIGZpbmFsIG92ZXJyaWRlcyA9IF9FeGl0T3ZlcnJpZGVzU2NvcGUoZXhpdCk7CiAgICByZXR1cm4gX2FzeW5jUnVuWm9uZWQoYm9keSwgem9uZVZhbHVlczoge190b2tlbjogb3ZlcnJpZGVzfSk7CiAgfQoKICB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZ2V0IGV4aXQgPT4gaW8uZXhpdDsKfQoKY2xhc3MgX0V4aXRPdmVycmlkZXNTY29wZSBleHRlbmRzIEV4aXRPdmVycmlkZXMgewogIF9FeGl0T3ZlcnJpZGVzU2NvcGUodGhpcy5fZXhpdCk7CgogIGZpbmFsIEV4aXRPdmVycmlkZXM/IF9wcmV2aW91cyA9IEV4aXRPdmVycmlkZXMuY3VycmVudDsKICBmaW5hbCB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSk/IF9leGl0OwoKICBAb3ZlcnJpZGUKICB2b2lkIEZ1bmN0aW9uKGludCBleGl0Q29kZSkgZ2V0IGV4aXQgewogICAgcmV0dXJuIF9leGl0ID8/IF9wcmV2aW91cz8uZXhpdCA/PyBzdXBlci5leGl0OwogIH0KfQo=", - "type": "text" + "type": "text", }, { "path": "lib/src/normalize_route_path.dart", "data": "aW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19uZXdfaG9va3Mvc3JjL3BhcmFtZXRlcl9zeW50YXguZGFydCc7CgpTdHJpbmcgbm9ybWFsaXplUm91dGVQYXRoKFN0cmluZyByb3V0ZVBhdGgpIHsKICBmaW5hbCByZXBsYWNlZCA9IHJvdXRlUGF0aC50b0RpYW1vbmRQYXJhbWV0ZXJTeW50YXgucmVwbGFjZUFsbChyJ1wnLCAnLycpOwoKICBmaW5hbCBzZWdtZW50cyA9IHJlcGxhY2VkLnNwbGl0KCcvJyk7CgogIGZpbmFsIG5vcm1hbGl6ZWRTZWdtZW50cyA9CiAgICAgIHNlZ21lbnRzLmZvbGQoPFN0cmluZz5bXSwgKHByZXZpb3VzVmFsdWUsIHNlZ21lbnQpIHsKICAgIGlmIChzZWdtZW50ID09ICcuLicpIHsKICAgICAgaWYgKHByZXZpb3VzVmFsdWUubGVuZ3RoID4gMSkgewogICAgICAgIHByZXZpb3VzVmFsdWUucmVtb3ZlTGFzdCgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHNlZ21lbnQuaXNOb3RFbXB0eSAmJiBzZWdtZW50ICE9ICcuJykgewogICAgICBwcmV2aW91c1ZhbHVlLmFkZChzZWdtZW50LmVuY29kZVNlZ21lbnQoKSk7CiAgICB9CiAgICByZXR1cm4gcHJldmlvdXNWYWx1ZTsKICB9KTsKCiAgcmV0dXJuICcvJHtub3JtYWxpemVkU2VnbWVudHMuam9pbignLycpfSc7Cn0KCmV4dGVuc2lvbiBvbiBTdHJpbmcgewogIFN0cmluZyBlbmNvZGVTZWdtZW50KCkgewogICAgZmluYWwgZW5jb2RlZCA9IFVyaS5lbmNvZGVDb21wb25lbnQodGhpcyk7CiAgICBpZiAoaGFzRGlhbW9uZFBhcmFtZXRlcikgewogICAgICByZXR1cm4gZW5jb2RlZC5yZXBsYWNlQWxsKCclM0MnLCAnPCcpLnJlcGxhY2VBbGwoJyUzRScsICc+Jyk7CiAgICB9CiAgICByZXR1cm4gZW5jb2RlZDsKICB9Cn0K", - "type": "text" + "type": "text", }, { "path": "lib/src/parameter_syntax.dart", "data": "ZXh0ZW5zaW9uIFBhcmFtZXRlclN5bnRheCBvbiBTdHJpbmcgewogIC8vLyBSZXBsYWNlcyBbXSBmb3IgPD4KICBTdHJpbmcgZ2V0IHRvRGlhbW9uZFBhcmFtZXRlclN5bnRheCB7CiAgICByZXR1cm4gcmVwbGFjZUFsbCgnWycsICc8JykucmVwbGFjZUFsbCgnXScsICc+Jyk7CiAgfQoKICAvLy8gUmVwbGFjZXMgPD4gZm9yIFtdCiAgU3RyaW5nIGdldCB0b0JyYWNrZXRQYXJhbWV0ZXJTeW50YXggewogICAgcmV0dXJuIHJlcGxhY2VBbGwoJzwnLCAnWycpLnJlcGxhY2VBbGwoJz4nLCAnXScpOwogIH0KCiAgLy8vIERldGVjdCBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGhhcyBhIDwgYW5kIGEgPiBhZnRlciBpdAogIGJvb2wgZ2V0IGhhc0RpYW1vbmRQYXJhbWV0ZXIgewogICAgZmluYWwgcmVnZXhwID0gUmVnRXhwKCc8Lio/PicpOwogICAgcmV0dXJuIHJlZ2V4cC5oYXNNYXRjaCh0aGlzKTsKICB9CgogIC8vLyBHZXQgdGhlIHJvdXRlIHBhcmFtZXRlcnMgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLgogIExpc3Q8U3RyaW5nPiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKICAgIGZpbmFsIHJlZ2V4cCA9IFJlZ0V4cChyJ1xbKC4qPylcXScpOwogICAgZmluYWwgbmFtZXMgPSByZWdleHAKICAgICAgICAuYWxsTWF0Y2hlcyh0b0JyYWNrZXRQYXJhbWV0ZXJTeW50YXgpCiAgICAgICAgLm1hcCgobSkgPT4gbVswXT8ucmVwbGFjZUFsbChSZWdFeHAocidbXFtcXV0nKSwgJycpKQogICAgICAgIC53aGVyZSgoZWwpID0+IGVsICE9IG51bGwpCiAgICAgICAgLmNhc3Q8U3RyaW5nPigpOwoKICAgIGZpbmFsIGR1cGxpY2F0ZXMgPSBuYW1lcwogICAgICAgIC50b1NldCgpCiAgICAgICAgLndoZXJlKChlbGVtZW50KSA9PiBuYW1lcy53aGVyZSgoZWwpID0+IGVsID09IGVsZW1lbnQpLmxlbmd0aCA+IDEpOwogICAgaWYgKGR1cGxpY2F0ZXMuaXNOb3RFbXB0eSkgewogICAgICBmaW5hbCBwbHVyYWwgPSBkdXBsaWNhdGVzLmxlbmd0aCA+IDE7CiAgICAgIGZpbmFsIG1lc3NhZ2UgPSAnRHVwbGljYXRlIHBhcmFtZXRlciBuYW1lJHtwbHVyYWwgPyAncycgOiAnJ30gZm91bmQ6ICcKICAgICAgICAgICcke2R1cGxpY2F0ZXMuam9pbignLCAnKX0nOwogICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24obWVzc2FnZSk7CiAgICB9CgogICAgcmV0dXJuIG5hbWVzLnRvTGlzdCgpOwogIH0KfQo=", - "type": "text" + "type": "text", }, { "path": "lib/src/route_configuration_utils.dart", "data": "aW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19nZW4vZGFydF9mcm9nX2dlbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1hc29uL21hc29uLmRhcnQnOwoKZXh0ZW5zaW9uIFJvdXRlQ29uZmlndXJhdGlvblV0aWxzIG9uIFJvdXRlQ29uZmlndXJhdGlvbiB7CiAgLy8vIFJlcG9ydCByb2d1ZSByb3V0ZXMgYW5kIHJvdXRlIGNvbmZsaWN0cy4KICB2b2lkIHZhbGlkYXRlKCkgewogICAgcmVwb3J0Um9ndWVSb3V0ZXMoCiAgICAgIHRoaXMsCiAgICAgIG9uUm9ndWVSb3V0ZTogKGZpbGVQYXRoLCBpZGVhbFBhdGgpIHsKICAgICAgICB0aHJvdyBGb3JtYXRFeGNlcHRpb24oCiAgICAgICAgICAnJydSb2d1ZSByb3V0ZSBkZXRlY3RlZC4ke2RlZmF1bHRGb3JlZ3JvdW5kLndyYXAoJyAnKX1SZW5hbWUgJHtsaWdodEN5YW4ud3JhcChmaWxlUGF0aCl9IHRvICR7bGlnaHRDeWFuLndyYXAoaWRlYWxQYXRoKX0uJycnLAogICAgICAgICk7CiAgICAgIH0sCiAgICApOwoKICAgIHJlcG9ydFJvdXRlQ29uZmxpY3RzKAogICAgICB0aGlzLAogICAgICBvblJvdXRlQ29uZmxpY3Q6ICgKICAgICAgICBTdHJpbmcgb3JpZ2luYWxGaWxlUGF0aCwKICAgICAgICBTdHJpbmcgY29uZmxpY3RpbmdGaWxlUGF0aCwKICAgICAgICBTdHJpbmcgY29uZmxpY3RpbmdFbmRwb2ludCwKICAgICAgKSB7CiAgICAgICAgdGhyb3cgRm9ybWF0RXhjZXB0aW9uKAogICAgICAgICAgJycnUm91dGUgY29uZmxpY3QgZGV0ZWN0ZWQuICR7bGlnaHRDeWFuLndyYXAob3JpZ2luYWxGaWxlUGF0aCl9IGFuZCAke2xpZ2h0Q3lhbi53cmFwKGNvbmZsaWN0aW5nRmlsZVBhdGgpfSBib3RoIHJlc29sdmUgdG8gJHtsaWdodEN5YW4ud3JhcChjb25mbGljdGluZ0VuZHBvaW50KX0uJycnLAogICAgICAgICk7CiAgICAgIH0sCiAgICApOwogIH0KCiAgLy8vIENoZWNrIGlmIHRoZSBhbmNlc3RvcnMgb2YgYSByb3V0ZSBleGlzdHMgYXMgZmlsZSByb3V0ZXMuCiAgLy8vIFJldHVybiB0aGUgaW5uZXJtb3N0IHJvdXRlIHRoYXQgZXhpc3RzIGFzIGZpbGUgcm91dGUgaWYgYW55LgogIC8vLwogIC8vLyBPbiBEYXJ0IEZyb2csIGZpbGUgcm91dGVzIGFyZSByb3V0ZXMgZGVmaW5lZCBieSBhIGZpbGUgdGhhdCBoYXMgdGhlIGxhc3QKICAvLy8gc2VnbWVudCBvZiB0aGUgcmVzdWx0aW5nIFVSSSBhcyBpdHMgbmFtZSwgYXMgb3Bwb3NlZCB0byBpbmRleAogIC8vLyByb3V0ZXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgYW4gaW5kZXggZmlsZS4KICAvLy8KICAvLy8gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHJvdXRlIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gdmFsaWRhdGVkIGFnYWluc3Qgcm9ndWUKICAvLy8gcm91dGVzIGFuZCByb3V0ZSBjb25mbGljdHMuCiAgLy8vCiAgLy8vIEl0IGFsc28gYXNzdW1lcyB0aGF0IHRoZSBbcm91dGVdIGlzIG5vcm1hbGl6ZWQgdG8gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcgogIC8vLyBzeW50YXggYXMgdXNlZCBpbnRlcm5hbGx5IGJ5IFtSb3V0ZUNvbmZpZ3VyYXRpb25dLgogIC8vLwogIC8vLyBFeGFtcGxlOgogIC8vLyBGb3IgdGhlIHJvdXRlIGAvdXNlcnMvW2lkXS9wb3N0cy9bcG9zdF9pZF1gLCBpdCB2ZXJpZmllcyB0aGUgZXhpc3RlbmNlIG9mCiAgLy8vIGFueSBvZiB0aGUgZm9sbG93aW5nIHJvdXRlcywgaW4gdGhpcyBvcmRlcjoKICAvLy8gLSBgL3VzZXJzL1tpZF0vcG9zdHMuZGFydGAKICAvLy8gLSBgL3VzZXJzL1tpZF0uZGFydGAKICAvLy8gLSBgL3VzZXJzLmRhcnRgCiAgUm91dGVGaWxlPyBjb250YWluaW5nRmlsZVJvdXRlKAogICAgU3RyaW5nIHJvdXRlLCB7CiAgICBib29sIGluY2x1ZGVTZWxmID0gZmFsc2UsCiAgfSkgewogICAgZmluYWwgc2VnbWVudHMgPSByb3V0ZS5zcGxpdCgnLycpOwogICAgZmluYWwgY29udGFpbmluZ1JvdXRlcyA9IHNlZ21lbnRzCiAgICAgICAgLm1hcCgoc2VnbWVudCkgewogICAgICAgICAgcmV0dXJuIHNlZ21lbnRzLnRha2VXaGlsZSgoZWxlbWVudCkgPT4gZWxlbWVudCAhPSBzZWdtZW50KS5qb2luKCcvJyk7CiAgICAgICAgfSkKICAgICAgICAud2hlcmUoKHJvdXRlKSA9PiByb3V0ZS5pc05vdEVtcHR5KQogICAgICAgIC50b0xpc3QoKTsKCiAgICBpZiAoaW5jbHVkZVNlbGYpIHsKICAgICAgY29udGFpbmluZ1JvdXRlcy5hZGQocm91dGUpOwogICAgfQoKICAgIGZvciAoZmluYWwgY29udGFpbmluZ1JvdXRlIGluIGNvbnRhaW5pbmdSb3V0ZXMucmV2ZXJzZWQpIHsKICAgICAgaWYgKCFlbmRwb2ludHMuY29udGFpbnNLZXkoY29udGFpbmluZ1JvdXRlKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBmaW5hbCByb3V0ZUZpbGUgPSBlbmRwb2ludHNbY29udGFpbmluZ1JvdXRlXSEuZmlyc3Q7CgogICAgICAvLyBIRVVSSVNUSUM6IGluZGV4IHJvdXRlcyBoYXZlIHBhdGhzIHRvIHRoZSByb3V0ZSBmaWxlLAogICAgICAvLyB3aGljaCBuYW1lZCAnaW5kZXguZGFydCcKICAgICAgZmluYWwgaXNJbmRleFJvdXRlID0gcm91dGVGaWxlLnBhdGguZW5kc1dpdGgoJ2luZGV4LmRhcnQnKTsKCiAgICAgIC8vIElmIHRoZSByb3V0ZSBpcyBhbiBpbmRleCByb3V0ZSwgdGhlcmUgd29udCBiZSBmaWxlIHJvdXRlcyBvbiB0aGUKICAgICAgLy8gdXBwZXIgbGV2ZWwsIGFzc3VtaW5nIHRoYXQgdGhlcmUgaXMgbm8gcm9ndWUgcm91dGVzIG9uCiAgICAgIC8vIHRoZSBjb25maWd1cmF0aW9uLgogICAgICBpZiAoaXNJbmRleFJvdXRlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHJvdXRlRmlsZTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQo=", - "type": "text" + "type": "text", }, { "path": "lib/src/route_to_path.dart", "data": "aW1wb3J0ICdwYWNrYWdlOnBhdGgvcGF0aC5kYXJ0JyBhcyBwYXRoOwoKLy8vIENvbnZlcnQgYSByb3V0ZSB0byBhIGZpbGUgcGF0aC4KLy8vCi8vLyBJZiBbcHJlZmVySW5kZXhdIGlzIHRydWUsIHRoZSBwYXRoIHdpbGwgYmUgY29udmVydGVkIHRvIGEgZGlyZWN0b3J5IHBhdGgKLy8vIHdpdGggYW4gaW5kZXggZGFydCBmaWxlLgovLy8KLy8vIGBgYG1hcmtkb3duCi8vLyAiLyIgLT4gIi4vcm91dGVzL2luZGV4LmRhcnQiIChpZiBwcmVmZXJJbmRleCBpcyBmYWxzZSkKLy8vICIvIiAtPiAiLi9yb3V0ZXMvaW5kZXguZGFydCIgKGlmIHByZWZlckluZGV4IGlzIHRydWUpCi8vLyAiL2hlbGxvIiAtPiAiLi9yb3V0ZXMvaGVsbG8uZGFydCIgKGlmIHByZWZlckluZGV4IGlzIGZhbHNlKQovLy8gIi9oZWxsbyIgLT4gIi4vcm91dGVzL2hlbGxvL2luZGV4LmRhcnQiIChpZiBwcmVmZXJJbmRleCBpcyB0cnVlKQovLy8gIi9oZWxsby9bbmFtZV0iIC0+ICIuL3JvdXRlcy9oZWxsby9bbmFtZV0uZGFydCIgKGlmIHByZWZlckluZGV4IGlzIGZhbHNlKQovLy8gIi9oZWxsby9bbmFtZV0iIC0+ICIuL3JvdXRlcy9oZWxsby9bbmFtZV0vaW5kZXguZGFydCIgKGlmIHByZWZlckluZGV4IGlzIHRydWUpCi8vLyBgYGAKU3RyaW5nIHJvdXRlVG9QYXRoKAogIFN0cmluZyByb3V0ZSwgewogIGJvb2wgcHJlZmVySW5kZXggPSBmYWxzZSwKICBTdHJpbmcgcHJlYW1ibGUgPSAncm91dGVzJywKICBwYXRoLkNvbnRleHQ/IHBhdGhDb250ZXh0LAp9KSB7CiAgZmluYWwgY29udGV4dCA9IHBhdGhDb250ZXh0ID8/IHBhdGguY29udGV4dDsKICBmaW5hbCBzZXBhcmF0b3IgPSBjb250ZXh0LnNlcGFyYXRvcjsKCiAgaWYgKHJvdXRlID09ICcvJykgewogICAgcmV0dXJuICckcHJlYW1ibGUke3NlcGFyYXRvcn1pbmRleC5kYXJ0JzsKICB9CgogIGZpbmFsIHAgPQogICAgICByb3V0ZS5zcGxpdCgnLycpLndoZXJlKChlbGVtZW50KSA9PiBlbGVtZW50LmlzTm90RW1wdHkpLmpvaW4oc2VwYXJhdG9yKTsKCiAgaWYgKHByZWZlckluZGV4KSB7CiAgICBmaW5hbCBwYXRoV2l0aEluZGV4ID0gY29udGV4dC5qb2luKHAsICdpbmRleC5kYXJ0Jyk7CiAgICByZXR1cm4gY29udGV4dC5qb2luKHByZWFtYmxlLCBwYXRoV2l0aEluZGV4KTsKICB9CgogIGZpbmFsIHBhdGhXaXRoRXh0ZW5zaW9uID0gJyRwLmRhcnQnOwogIHJldHVybiBjb250ZXh0LmpvaW4ocHJlYW1ibGUsIHBhdGhXaXRoRXh0ZW5zaW9uKTsKfQo=", - "type": "text" + "type": "text", }, { "path": "post_gen.dart", "data": "aW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19uZXdfaG9va3MvcG9zdF9nZW4uZGFydCc7CmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JzsKCkZ1dHVyZTx2b2lkPiBydW4oSG9va0NvbnRleHQgY29udGV4dCkgPT4gcG9zdEdlbihjb250ZXh0KTsK", - "type": "text" + "type": "text", }, { "path": "pre_gen.dart", "data": "aW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19uZXdfaG9va3MvcHJlX2dlbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1hc29uL21hc29uLmRhcnQnOwoKRnV0dXJlPHZvaWQ+IHJ1bihIb29rQ29udGV4dCBjb250ZXh0KSBhc3luYyA9PiBwcmVHZW4oY29udGV4dCk7Cg==", - "type": "text" + "type": "text", }, { "path": "pubspec.yaml", "data": "bmFtZTogZGFydF9mcm9nX25ld19ob29rcwpwdWJsaXNoX3RvOiBub25lCgplbnZpcm9ubWVudDoKICBzZGs6ICI+PTMuMC4wIDw0LjAuMCIKCmRlcGVuZGVuY2llczoKICBkYXJ0X2Zyb2dfZ2VuOiBeMi4wLjAKICBtYXNvbjogXjAuMS4wLWRldi40OQogIHBhdGg6IF4xLjguMAoKZGV2X2RlcGVuZGVuY2llczoKICBtb2NrdGFpbDogXjEuMC4wCiAgdGVzdDogXjEuMTkuMgogIHZlcnlfZ29vZF9hbmFseXNpczogXjYuMC4wCg==", - "type": "text" + "type": "text", }, { "path": "test/post_gen_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfbmV3X2hvb2tzL3Bvc3RfZ2VuLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6ZGFydF9mcm9nX25ld19ob29rcy9zcmMvZXhpdF9vdmVycmlkZXMuZGFydCc7CmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1vY2t0YWlsL21vY2t0YWlsLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6cGF0aC9wYXRoLmRhcnQnIGFzIHBhdGg7CmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CgpjbGFzcyBfTW9ja0xvZ2dlciBleHRlbmRzIE1vY2sgaW1wbGVtZW50cyBMb2dnZXIge30KCmNsYXNzIF9GYWtlSG9va0NvbnRleHQgZXh0ZW5kcyBGYWtlIGltcGxlbWVudHMgSG9va0NvbnRleHQgewogIF9GYWtlSG9va0NvbnRleHQoe0xvZ2dlcj8gbG9nZ2VyfSkgOiBfbG9nZ2VyID0gbG9nZ2VyID8/IF9Nb2NrTG9nZ2VyKCk7CgogIGZpbmFsIExvZ2dlciBfbG9nZ2VyOwoKICB2YXIgX3ZhcnMgPSA8U3RyaW5nLCBkeW5hbWljPnt9OwoKICBAb3ZlcnJpZGUKICBNYXA8U3RyaW5nLCBkeW5hbWljPiBnZXQgdmFycyA9PiBfdmFyczsKCiAgQG92ZXJyaWRlCiAgc2V0IHZhcnMoTWFwPFN0cmluZywgZHluYW1pYz4gdmFsdWUpID0+IF92YXJzID0gdmFsdWU7CgogIEBvdmVycmlkZQogIExvZ2dlciBnZXQgbG9nZ2VyID0+IF9sb2dnZXI7Cn0KCnZvaWQgbWFpbigpIHsKICBncm91cCgncG9zdEdlbicsICgpIHsKICAgIGxhdGUgSG9va0NvbnRleHQgY29udGV4dDsKICAgIGxhdGUgTG9nZ2VyIGxvZ2dlcjsKCiAgICBzZXRVcCgoKSB7CiAgICAgIGxvZ2dlciA9IF9Nb2NrTG9nZ2VyKCk7CiAgICAgIGNvbnRleHQgPSBfRmFrZUhvb2tDb250ZXh0KGxvZ2dlcjogbG9nZ2VyKTsKICAgIH0pOwoKICAgIHRlc3QoJ3Bvc3RHZW4gY29tcGxldGVzJywgKCkgewogICAgICBjb250ZXh0LnZhcnNbJ2Rpcl9wYXRoJ10gPSAncm91dGVzL25ld19yb3V0ZSc7CiAgICAgIGNvbnRleHQudmFyc1snZmlsZW5hbWUnXSA9ICdpbmRleC5kYXJ0JzsKICAgICAgZXhwZWN0KAogICAgICAgIEV4aXRPdmVycmlkZXMucnVuWm9uZWQoCiAgICAgICAgICAoKSBhc3luYyA9PiBwb3N0R2VuKGNvbnRleHQpLAogICAgICAgICAgZXhpdDogKF8pIHt9LAogICAgICAgICksCiAgICAgICAgY29tcGxldGVzLAogICAgICApOwogICAgfSk7CgogICAgdGVzdCgnZXhpdCgxKSBpZiBkaXJfcGF0aCBpcyBub3QgZGVmaW5lZCcsICgpIHsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgcG9zdEdlbihjb250ZXh0LCBleGl0OiBleGl0Q2FsbHMuYWRkKTsKICAgICAgZXhwZWN0KGV4aXRDYWxscywgZXF1YWxzKFsxXSkpOwogICAgfSk7CgogICAgdGVzdCgnbW92ZXMgZmlsZSB0byBzdXBwb3NlZCBkaXJlY3RvcnknLCAoKSB7CiAgICAgIGZpbmFsIGRpcmVjdG9yeSA9IGlvLkRpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKAogICAgICAgICdkYXJ0X2Zyb2dfbmV3X2hvb2tzX3Rlc3QnLAogICAgICApOwogICAgICBhZGRUZWFyRG93bigoKSB7CiAgICAgICAgZGlyZWN0b3J5LmRlbGV0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgICAgfSk7CiAgICAgIGZpbmFsIGZpbGVQYXRoID0gcGF0aC5qb2luKGRpcmVjdG9yeS5wYXRoLCAnaW5kZXguZGFydCcpOwogICAgICBpby5GaWxlKGZpbGVQYXRoKQogICAgICAgIC4uY3JlYXRlU3luYyhyZWN1cnNpdmU6IHRydWUpCiAgICAgICAgLi53cml0ZUFzU3RyaW5nU3luYygnY29udGVudCcpOwoKICAgICAgY29udGV4dC52YXJzWydkaXJfcGF0aCddID0gJ3JvdXRlcy9uZXdfcm91dGUnOwogICAgICBjb250ZXh0LnZhcnNbJ2ZpbGVuYW1lJ10gPSAnaW5kZXguZGFydCc7CgogICAgICBwb3N0R2VuKGNvbnRleHQsIGRpcmVjdG9yeTogZGlyZWN0b3J5KTsKCiAgICAgIGV4cGVjdCgKICAgICAgICBpby5GaWxlKHBhdGguam9pbihkaXJlY3RvcnkucGF0aCwgJ3JvdXRlcy9uZXdfcm91dGUvaW5kZXguZGFydCcpKQogICAgICAgICAgICAucmVhZEFzU3RyaW5nU3luYygpLAogICAgICAgICdjb250ZW50JywKICAgICAgKTsKICAgIH0pOwogIH0pOwp9Cg==", - "type": "text" + "type": "text", }, { "path": "test/pre_gen_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJyBhcyBpbzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfZ2VuL2RhcnRfZnJvZ19nZW4uZGFydCc7CmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfbmV3X2hvb2tzL3ByZV9nZW4uZGFydCc7CmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfbmV3X2hvb2tzL3NyYy9leGl0X292ZXJyaWRlcy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1hc29uL21hc29uLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6bW9ja3RhaWwvbW9ja3RhaWwuZGFydCc7CmltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKCmNsYXNzIF9Nb2NrTG9nZ2VyIGV4dGVuZHMgTW9jayBpbXBsZW1lbnRzIExvZ2dlciB7fQoKY2xhc3MgX01vY2tSb3V0ZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgUm91dGVDb25maWd1cmF0aW9uIHt9CgpjbGFzcyBfRmFrZUhvb2tDb250ZXh0IGV4dGVuZHMgRmFrZSBpbXBsZW1lbnRzIEhvb2tDb250ZXh0IHsKICBfRmFrZUhvb2tDb250ZXh0KHtMb2dnZXI/IGxvZ2dlcn0pIDogX2xvZ2dlciA9IGxvZ2dlciA/PyBfTW9ja0xvZ2dlcigpOwoKICBmaW5hbCBMb2dnZXIgX2xvZ2dlcjsKCiAgdmFyIF92YXJzID0gPFN0cmluZywgZHluYW1pYz57fTsKCiAgQG92ZXJyaWRlCiAgTWFwPFN0cmluZywgZHluYW1pYz4gZ2V0IHZhcnMgPT4gX3ZhcnM7CgogIEBvdmVycmlkZQogIHNldCB2YXJzKE1hcDxTdHJpbmcsIGR5bmFtaWM+IHZhbHVlKSA9PiBfdmFycyA9IHZhbHVlOwoKICBAb3ZlcnJpZGUKICBMb2dnZXIgZ2V0IGxvZ2dlciA9PiBfbG9nZ2VyOwp9Cgpjb25zdCB2YWxpZFJvdXRlQ29uZmlndXJhdGlvbiA9IFJvdXRlQ29uZmlndXJhdGlvbigKICBnbG9iYWxNaWRkbGV3YXJlOiBNaWRkbGV3YXJlRmlsZSgKICAgIG5hbWU6ICdtaWRkbGV3YXJlJywKICAgIHBhdGg6ICcuLi9yb3V0ZXMvX21pZGRsZXdhcmUuZGFydCcsCiAgKSwKICBtaWRkbGV3YXJlOiBbCiAgICBNaWRkbGV3YXJlRmlsZSgKICAgICAgbmFtZTogJ21pZGRsZXdhcmUnLAogICAgICBwYXRoOiAnLi4vcm91dGVzL19taWRkbGV3YXJlLmRhcnQnLAogICAgKSwKICAgIE1pZGRsZXdhcmVGaWxlKAogICAgICBuYW1lOiByJyRpZF9fbWlkZGxld2FyZScsCiAgICAgIHBhdGg6ICcuLi9yb3V0ZXMvW2lkXS9fbWlkZGxld2FyZS5kYXJ0JywKICAgICksCiAgXSwKICBkaXJlY3RvcmllczogWwogICAgUm91dGVEaXJlY3RvcnkoCiAgICAgIG5hbWU6ICdfJywKICAgICAgcm91dGU6ICcvJywKICAgICAgbWlkZGxld2FyZTogW10sCiAgICAgIGZpbGVzOiBbXSwKICAgICAgcGFyYW1zOiBbXSwKICAgICksCiAgICBSb3V0ZURpcmVjdG9yeSgKICAgICAgbmFtZTogcidfJGlkJywKICAgICAgcm91dGU6ICcvPGlkPicsCiAgICAgIG1pZGRsZXdhcmU6IFtdLAogICAgICBmaWxlczogW10sCiAgICAgIHBhcmFtczogW10sCiAgICApLAogICAgUm91dGVEaXJlY3RvcnkoCiAgICAgIG5hbWU6IHInXyRpZF9leGlzdGluZ19hc19kaXJlY3RvcnknLAogICAgICByb3V0ZTogJy88aWQ+L2V4aXN0aW5nX2FzX2RpcicsCiAgICAgIGZpbGVzOiBbXSwKICAgICAgbWlkZGxld2FyZTogW10sCiAgICAgIHBhcmFtczogW10sCiAgICApLAogIF0sCiAgcm91dGVzOiBbCiAgICBSb3V0ZUZpbGUoCiAgICAgIG5hbWU6ICdpbmRleCcsCiAgICAgIHBhdGg6ICcuLi9yb3V0ZXMvaW5kZXguZGFydCcsCiAgICAgIHJvdXRlOiAnLycsCiAgICAgIHBhcmFtczogW10sCiAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICksCiAgICBSb3V0ZUZpbGUoCiAgICAgIG5hbWU6IHInJGlkX2V4aXN0aW5nX2FzX2ZpbGUnLAogICAgICBwYXRoOiAnLi4vcm91dGVzL1tpZF0vZXhpc3RpbmdfYXNfZmlsZS5kYXJ0JywKICAgICAgcm91dGU6ICcvZXhpc3RpbmdfYXNfZmlsZScsCiAgICAgIHBhcmFtczogW10sCiAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICksCiAgICBSb3V0ZUZpbGUoCiAgICAgIG5hbWU6IHInJGlkX2V4aXN0aW5nX2FzX2Rpcl9pbmRleCcsCiAgICAgIHBhdGg6ICcuLi9yb3V0ZXMvW2lkXS9leGlzdGluZ19hc19kaXIvaW5kZXguZGFydCcsCiAgICAgIHJvdXRlOiAnLycsCiAgICAgIHBhcmFtczogW10sCiAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICksCiAgXSwKICBlbmRwb2ludHM6IHsKICAgICcvJzogPFJvdXRlRmlsZT5bCiAgICAgIFJvdXRlRmlsZSgKICAgICAgICBuYW1lOiAnaW5kZXgnLAogICAgICAgIHBhdGg6ICcuLi9yb3V0ZXMvaW5kZXguZGFydCcsCiAgICAgICAgcm91dGU6ICcvJywKICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgKSwKICAgIF0sCiAgICAnLzxpZD4vZXhpc3RpbmdfYXNfZmlsZSc6IDxSb3V0ZUZpbGU+WwogICAgICBSb3V0ZUZpbGUoCiAgICAgICAgbmFtZTogcickaWRfZXhpc3RpbmdfYXNfZmlsZScsCiAgICAgICAgcGF0aDogJy4uL3JvdXRlcy9baWRdL2V4aXN0aW5nX2FzX2ZpbGUuZGFydCcsCiAgICAgICAgcm91dGU6ICcvZXhpc3RpbmdfYXNfZmlsZScsCiAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICksCiAgICBdLAogICAgJy88aWQ+L2V4aXN0aW5nX2FzX2Rpcic6IDxSb3V0ZUZpbGU+WwogICAgICBSb3V0ZUZpbGUoCiAgICAgICAgbmFtZTogcickaWRfZXhpc3RpbmdfYXNfZGlyX2luZGV4JywKICAgICAgICBwYXRoOiAnLi4vcm91dGVzL1tpZF0vZXhpc3RpbmdfYXNfZGlyL2luZGV4LmRhcnQnLAogICAgICAgIHJvdXRlOiAnLycsCiAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICksCiAgICBdLAogIH0sCiAgcm9ndWVSb3V0ZXM6IFtdLAogIHNlcnZlU3RhdGljRmlsZXM6IHRydWUsCik7Cgp2b2lkIG1haW4oKSB7CiAgZ3JvdXAoJ3ByZUdlbicsICgpIHsKICAgIGxhdGUgSG9va0NvbnRleHQgY29udGV4dDsKICAgIGxhdGUgTG9nZ2VyIGxvZ2dlcjsKCiAgICBzZXRVcCgoKSB7CiAgICAgIGxvZ2dlciA9IF9Nb2NrTG9nZ2VyKCk7CiAgICAgIGNvbnRleHQgPSBfRmFrZUhvb2tDb250ZXh0KGxvZ2dlcjogbG9nZ2VyKTsKICAgIH0pOwoKICAgIHRlc3QoJ3ByZUdlbiBjb21wbGV0ZXMnLCAoKSB7CiAgICAgIGV4cGVjdCgKICAgICAgICBFeGl0T3ZlcnJpZGVzLnJ1blpvbmVkKAogICAgICAgICAgKCkgYXN5bmMgPT4gcHJlR2VuKAogICAgICAgICAgICBfRmFrZUhvb2tDb250ZXh0KCksCiAgICAgICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pIHsKICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb24oJ29vcHMnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICksCiAgICAgICAgICBleGl0OiAoXykge30sCiAgICAgICAgKSwKICAgICAgICBjb21wbGV0ZXMsCiAgICAgICk7CiAgICB9KTsKCiAgICB0ZXN0KCdleGl0KDEpIGlmIGJ1aWxkUm91dGVDb25maWd1cmF0aW9uIHRocm93cycsICgpIHsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgZmluYWwgZXhjZXB0aW9uID0gRXhjZXB0aW9uKCdvb3BzJyk7CiAgICAgIHByZUdlbigKICAgICAgICBjb250ZXh0LAogICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IHRocm93IGV4Y2VwdGlvbiwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICApOwogICAgICBleHBlY3QoZXhpdENhbGxzLCBlcXVhbHMoWzFdKSk7CiAgICAgIHZlcmlmeSgoKSA9PiBsb2dnZXIuZXJyKGV4Y2VwdGlvbi50b1N0cmluZygpKSkuY2FsbGVkKDEpOwogICAgfSk7CgogICAgdGVzdCgnZXhpdCgxKSBmb3IgaW52YWxpZCByb3V0ZSBjb25maWcnLCAoKSB7CiAgICAgIGZpbmFsIGNvbmZpZ3VyYXRpb24gPSBfTW9ja1JvdXRlQ29uZmlndXJhdGlvbigpOwogICAgICB3aGVuKCgpID0+IGNvbmZpZ3VyYXRpb24ucm9ndWVSb3V0ZXMpLnRoZW5SZXR1cm4oCiAgICAgICAgY29uc3QgWwogICAgICAgICAgUm91dGVGaWxlKAogICAgICAgICAgICBuYW1lOiAnaGVsbG8nLAogICAgICAgICAgICBwYXRoOiAnaGVsbG8uZGFydCcsCiAgICAgICAgICAgIHJvdXRlOiAnL2hlbGxvJywKICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgKSwKICAgICAgICBdLAogICAgICApOwoKICAgICAgY29udGV4dC52YXJzWyd0eXBlJ10gPSAncm91dGUnOwoKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgcHJlR2VuKAogICAgICAgIGNvbnRleHQsCiAgICAgICAgYnVpbGRDb25maWd1cmF0aW9uOiAoXykgPT4gY29uZmlndXJhdGlvbiwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICApOwoKICAgICAgdmVyaWZ5KAogICAgICAgICgpID0+IGxvZ2dlci5lcnIoCiAgICAgICAgICAnJydGYWlsZWQgdG8gY3JlYXRlIHJvdXRlOiBSb2d1ZSByb3V0ZSBkZXRlY3RlZC4ke2RlZmF1bHRGb3JlZ3JvdW5kLndyYXAoJyAnKX1SZW5hbWUgJHtsaWdodEN5YW4ud3JhcCgncm91dGVzL2hlbGxvLmRhcnQnKX0gdG8gJHtsaWdodEN5YW4ud3JhcCgncm91dGVzL2hlbGxvL2luZGV4LmRhcnQnKX0uJycnLAogICAgICAgICksCiAgICAgICk7CiAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGVxdWFscyhbMV0pKTsKICAgIH0pOwoKICAgIHRlc3QoJ2V4aXQoMSkgZm9yIGludmFsaWQgdHlwZScsICgpIHsKICAgICAgZmluYWwgZXhpdENhbGxzID0gPGludD5bXTsKCiAgICAgIGNvbnRleHQudmFyc1sndHlwZSddID0gJ2ludmFsaWQnOwogICAgICBjb250ZXh0LnZhcnNbJ3JvdXRlX3BhdGgnXSA9ICcvW2lkXS9leGlzdGluZ19hc19kaXInOwogICAgICBwcmVHZW4oCiAgICAgICAgY29udGV4dCwKICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiB2YWxpZFJvdXRlQ29uZmlndXJhdGlvbiwKICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICApOwogICAgICB2ZXJpZnkoCiAgICAgICAgKCkgPT4gbG9nZ2VyLmVycigKICAgICAgICAgICcnJ1VucmVjb2duaXplZCB0eXBlOiBpbnZhbGlkJycnLAogICAgICAgICksCiAgICAgICk7CiAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGVxdWFscyhbMV0pKTsKICAgIH0pOwoKICAgIGdyb3VwKCdUeXBlOiByb3V0ZScsICgpIHsKICAgICAgbGF0ZSBpby5EaXJlY3RvcnkgZGlyZWN0b3J5OwogICAgICBsYXRlIExpc3Q8aW50PiBleGl0Q2FsbHM7CiAgICAgIHNldFVwKCgpIHsKICAgICAgICBkaXJlY3RvcnkgPSBpby5EaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wU3luYygKICAgICAgICAgICdkYXJ0X2Zyb2dfbmV3X2hvb2tzX3Rlc3QnLAogICAgICAgICk7CiAgICAgICAgZXhpdENhbGxzID0gPGludD5bXTsKICAgICAgICBjb250ZXh0LnZhcnNbJ3R5cGUnXSA9ICdyb3V0ZSc7CiAgICAgIH0pOwogICAgICB0ZWFyRG93bigoKSB7CiAgICAgICAgZGlyZWN0b3J5LmRlbGV0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgICAgfSk7CgogICAgICB0ZXN0KCdleGl0KDEpIGlmIHJvdXRlIGFscmVhZHkgZXhpc3RzIGFzIGRpciBlbmRwb2ludCcsICgpIHsKICAgICAgICBjb250ZXh0LnZhcnNbJ3JvdXRlX3BhdGgnXSA9ICcvW2lkXS9leGlzdGluZ19hc19kaXInOwogICAgICAgIHByZUdlbigKICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiB2YWxpZFJvdXRlQ29uZmlndXJhdGlvbiwKICAgICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgICBkaXJlY3Rvcnk6IGRpcmVjdG9yeSwKICAgICAgICApOwogICAgICAgIHZlcmlmeSgKICAgICAgICAgICgpID0+IGxvZ2dlci5lcnIoCiAgICAgICAgICAgICcnJ0ZhaWxlZCB0byBjcmVhdGUgcm91dGU6IC88aWQ+L2V4aXN0aW5nX2FzX2RpciBhbHJlYWR5IGV4aXN0cy4nJycsCiAgICAgICAgICApLAogICAgICAgICk7CiAgICAgICAgZXhwZWN0KGV4aXRDYWxscywgZXF1YWxzKFsxXSkpOwogICAgICB9KTsKCiAgICAgIHRlc3QoJ2V4aXQoMSkgaWYgcm91dGUgYWxyZWFkeSBleGlzdHMgYXMgZmlsZSBlbmRwb2ludCcsICgpIHsKICAgICAgICBjb250ZXh0LnZhcnNbJ3JvdXRlX3BhdGgnXSA9ICcvW2lkXS9leGlzdGluZ19hc19maWxlJzsKCiAgICAgICAgcHJlR2VuKAogICAgICAgICAgY29udGV4dCwKICAgICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IHZhbGlkUm91dGVDb25maWd1cmF0aW9uLAogICAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgICAgIGRpcmVjdG9yeTogZGlyZWN0b3J5LAogICAgICAgICk7CgogICAgICAgIHZlcmlmeSgKICAgICAgICAgICgpID0+IGxvZ2dlci5lcnIoCiAgICAgICAgICAgICcnJ0ZhaWxlZCB0byBjcmVhdGUgcm91dGU6IC88aWQ+L2V4aXN0aW5nX2FzX2ZpbGUgYWxyZWFkeSBleGlzdHMuJycnLAogICAgICAgICAgKSwKICAgICAgICApOwogICAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGVxdWFscyhbMV0pKTsKICAgICAgfSk7CgogICAgICB0ZXN0KCdleGl0KDEpIGlmIHJvdXRlIGhhcyBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzJywgKCkgewogICAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgICAgY29udGV4dC52YXJzWydyb3V0ZV9wYXRoJ10gPSAnL1tpZF0vW2lkXSc7CgogICAgICAgIHByZUdlbigKICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiB2YWxpZFJvdXRlQ29uZmlndXJhdGlvbiwKICAgICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgICBkaXJlY3Rvcnk6IGRpcmVjdG9yeSwKICAgICAgICApOwoKICAgICAgICB2ZXJpZnkoCiAgICAgICAgICAoKSA9PiBsb2dnZXIuZXJyKAogICAgICAgICAgICAnJydGYWlsZWQgdG8gY3JlYXRlIHJvdXRlOiBEdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWUgZm91bmQ6IGlkJycnLAogICAgICAgICAgKSwKICAgICAgICApOwogICAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGVxdWFscyhbMV0pKTsKICAgICAgfSk7CgogICAgICB0ZXN0KCdSZW5hbWVzIGEgd3JhcHBpbmcgcm91dGUgdGhhdCBleGlzdHMgYXMgZmlsZSB0byBhbiBpbmRleCcsICgpIHsKICAgICAgICBmaW5hbCBmaWxlUGF0aCA9IHBhdGguam9pbigKICAgICAgICAgIGRpcmVjdG9yeS5wYXRoLAogICAgICAgICAgJ3JvdXRlcycsCiAgICAgICAgICAnW2lkXScsCiAgICAgICAgICAnZXhpc3RpbmdfYXNfZmlsZS5kYXJ0JywKICAgICAgICApOwogICAgICAgIGlvLkZpbGUoZmlsZVBhdGgpCiAgICAgICAgICAuLmNyZWF0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKQogICAgICAgICAgLi53cml0ZUFzU3RyaW5nU3luYygnY29udGVudCcpOwoKICAgICAgICBjb250ZXh0LnZhcnNbJ3JvdXRlX3BhdGgnXSA9ICcvW2lkXS9leGlzdGluZ19hc19maWxlL25ld19yb3V0ZSc7CgogICAgICAgIHByZUdlbigKICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiB2YWxpZFJvdXRlQ29uZmlndXJhdGlvbiwKICAgICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgICBkaXJlY3Rvcnk6IGRpcmVjdG9yeSwKICAgICAgICApOwoKICAgICAgICBleHBlY3QoaW8uRmlsZShmaWxlUGF0aCkuZXhpc3RzU3luYygpLCBpc0ZhbHNlKTsKCiAgICAgICAgZmluYWwgbmV3RmlsZXBhdGggPSBwYXRoLmpvaW4oCiAgICAgICAgICBkaXJlY3RvcnkucGF0aCwKICAgICAgICAgICdyb3V0ZXMnLAogICAgICAgICAgJ1tpZF0nLAogICAgICAgICAgJ2V4aXN0aW5nX2FzX2ZpbGUnLAogICAgICAgICAgJ2luZGV4LmRhcnQnLAogICAgICAgICk7CgogICAgICAgIGV4cGVjdChpby5GaWxlKG5ld0ZpbGVwYXRoKS5yZWFkQXNTdHJpbmdTeW5jKCksIGVxdWFscygnY29udGVudCcpKTsKCiAgICAgICAgZXhwZWN0KAogICAgICAgICAgY29udGV4dC52YXJzWydkaXJfcGF0aCddLAogICAgICAgICAgcGF0aC5yZWxhdGl2ZSgKICAgICAgICAgICAgcGF0aC5qb2luKGRpcmVjdG9yeS5wYXRoLCAncm91dGVzJywgJ1tpZF0nLCAnZXhpc3RpbmdfYXNfZmlsZScpLAogICAgICAgICAgKSwKICAgICAgICApOwogICAgICAgIGV4cGVjdChjb250ZXh0LnZhcnNbJ2ZpbGVuYW1lJ10sICduZXdfcm91dGUuZGFydCcpOwogICAgICAgIGV4cGVjdChjb250ZXh0LnZhcnNbJ3BhcmFtcyddLCBbJ2lkJ10pOwogICAgICAgIGV4cGVjdChjb250ZXh0LnZhcnNbJ2lzX3JvdXRlJ10sIHRydWUpOwoKICAgICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgICAgfSk7CgogICAgICB0ZXN0KAogICAgICAgICdOZXcgcm91dGUgaXMgaW5kZXggaWYgaXRzIHBhdGggaXMgYWxyZWFkeSByZXByZXNlbnRlZCBieSBhIGRpcmVjdG9yeScsCiAgICAgICAgKCkgewogICAgICAgICAgZmluYWwgc3ViRGlyUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnkucGF0aCwgJ3JvdXRlcycsICdbaWRdJyk7CgogICAgICAgICAgaW8uRGlyZWN0b3J5KHN1YkRpclBhdGgpLmNyZWF0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKCiAgICAgICAgICBjb250ZXh0LnZhcnNbJ3JvdXRlX3BhdGgnXSA9ICcvW2lkXSc7CgogICAgICAgICAgcHJlR2VuKAogICAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiB2YWxpZFJvdXRlQ29uZmlndXJhdGlvbiwKICAgICAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgICAgICAgZGlyZWN0b3J5OiBkaXJlY3RvcnksCiAgICAgICAgICApOwoKICAgICAgICAgIGV4cGVjdCgKICAgICAgICAgICAgY29udGV4dC52YXJzWydkaXJfcGF0aCddLAogICAgICAgICAgICBwYXRoLnJlbGF0aXZlKHBhdGguam9pbihkaXJlY3RvcnkucGF0aCwgJ3JvdXRlcycsICdbaWRdJykpLAogICAgICAgICAgKTsKICAgICAgICAgIGV4cGVjdChjb250ZXh0LnZhcnNbJ2ZpbGVuYW1lJ10sICdpbmRleC5kYXJ0Jyk7CiAgICAgICAgICBleHBlY3QoY29udGV4dC52YXJzWydwYXJhbXMnXSwgWydpZCddKTsKICAgICAgICAgIGV4cGVjdChjb250ZXh0LnZhcnNbJ2lzX3JvdXRlJ10sIHRydWUpOwoKICAgICAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGlzRW1wdHkpOwogICAgICAgIH0sCiAgICAgICk7CgogICAgICB0ZXN0KCdOZXcgcm91dGUgaXMgYSBub3QgaW5kZXggaWYgbm90IHJlcHJlc2VudGVkIGJ5IGEgZGlyZWN0b3J5JywgKCkgewogICAgICAgIGNvbnRleHQudmFyc1sncm91dGVfcGF0aCddID0gJy9baWRdL3RoaXMvaXMvW2FdL25ld19yb3V0ZSc7CgogICAgICAgIHByZUdlbigKICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiB2YWxpZFJvdXRlQ29uZmlndXJhdGlvbiwKICAgICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgICBkaXJlY3Rvcnk6IGRpcmVjdG9yeSwKICAgICAgICApOwoKICAgICAgICBleHBlY3QoCiAgICAgICAgICBjb250ZXh0LnZhcnNbJ2Rpcl9wYXRoJ10sCiAgICAgICAgICBwYXRoLnJlbGF0aXZlKAogICAgICAgICAgICBwYXRoLmpvaW4oZGlyZWN0b3J5LnBhdGgsICdyb3V0ZXMnLCAnW2lkXScsICd0aGlzJywgJ2lzJywgJ1thXScpLAogICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICBleHBlY3QoY29udGV4dC52YXJzWydmaWxlbmFtZSddLCAnbmV3X3JvdXRlLmRhcnQnKTsKICAgICAgICBleHBlY3QoY29udGV4dC52YXJzWydwYXJhbXMnXSwgWydpZCcsICdhJ10pOwogICAgICAgIGV4cGVjdChjb250ZXh0LnZhcnNbJ2lzX3JvdXRlJ10sIHRydWUpOwoKICAgICAgICBleHBlY3QoZXhpdENhbGxzLCBpc0VtcHR5KTsKICAgICAgfSk7CiAgICB9KTsKCiAgICBncm91cCgnVHlwZTogbWlkZGxld2FyZScsICgpIHsKICAgICAgc2V0VXAoKCkgewogICAgICAgIGNvbnRleHQudmFyc1sndHlwZSddID0gJ21pZGRsZXdhcmUnOwogICAgICB9KTsKCiAgICAgIHRlc3QoJ2V4aXQoMSkgaWYgbWlkZGxld2FyZSBhbHJlYWR5IGV4aXN0cyAoZ2xvYmFsKScsICgpIHsKICAgICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwoKICAgICAgICBmaW5hbCBkaXJlY3RvcnkgPSBpby5EaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wU3luYygKICAgICAgICAgICdkYXJ0X2Zyb2dfbmV3X2hvb2tzX3Rlc3QnLAogICAgICAgICk7CiAgICAgICAgYWRkVGVhckRvd24oKCkgewogICAgICAgICAgZGlyZWN0b3J5LmRlbGV0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgICAgICB9KTsKICAgICAgICBmaW5hbCBmaWxlUGF0aCA9IHBhdGguam9pbigKICAgICAgICAgIGRpcmVjdG9yeS5wYXRoLAogICAgICAgICAgJ3JvdXRlcycsCiAgICAgICAgICAnX21pZGRsZXdhcmUuZGFydCcsCiAgICAgICAgKTsKICAgICAgICBpby5GaWxlKGZpbGVQYXRoKQogICAgICAgICAgLi5jcmVhdGVTeW5jKHJlY3Vyc2l2ZTogdHJ1ZSkKICAgICAgICAgIC4ud3JpdGVBc1N0cmluZ1N5bmMoJ2NvbnRlbnQnKTsKCiAgICAgICAgY29udGV4dC52YXJzWydyb3V0ZV9wYXRoJ10gPSAnLyc7CiAgICAgICAgcHJlR2VuKAogICAgICAgICAgY29udGV4dCwKICAgICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IHZhbGlkUm91dGVDb25maWd1cmF0aW9uLAogICAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgICAgIGRpcmVjdG9yeTogZGlyZWN0b3J5LAogICAgICAgICk7CgogICAgICAgIHZlcmlmeSgKICAgICAgICAgICgpID0+IGxvZ2dlci5lcnIoCiAgICAgICAgICAgICcnJ1RoZXJlIGlzIGFscmVhZHkgYSBtaWRkbGV3YXJlIGF0ICR7cGF0aC5yZWxhdGl2ZShmaWxlUGF0aCl9JycnLAogICAgICAgICAgKSwKICAgICAgICApOwogICAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGVxdWFscyhbMV0pKTsKICAgICAgfSk7CgogICAgICB0ZXN0KCdleGl0KDEpIGlmIG1pZGRsZXdhcmUgYWxyZWFkeSBleGlzdHMgKGxvY2FsKScsICgpIHsKICAgICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwoKICAgICAgICBmaW5hbCBkaXJlY3RvcnkgPSBpby5EaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wU3luYygKICAgICAgICAgICdkYXJ0X2Zyb2dfbmV3X2hvb2tzX3Rlc3QnLAogICAgICAgICk7CiAgICAgICAgYWRkVGVhckRvd24oKCkgewogICAgICAgICAgZGlyZWN0b3J5LmRlbGV0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgICAgICB9KTsKICAgICAgICBmaW5hbCBmaWxlUGF0aCA9CiAgICAgICAgICAgIHBhdGguam9pbihkaXJlY3RvcnkucGF0aCwgJ3JvdXRlcycsICdbaWRdJywgJ19taWRkbGV3YXJlLmRhcnQnKTsKICAgICAgICBpby5GaWxlKGZpbGVQYXRoKQogICAgICAgICAgLi5jcmVhdGVTeW5jKHJlY3Vyc2l2ZTogdHJ1ZSkKICAgICAgICAgIC4ud3JpdGVBc1N0cmluZ1N5bmMoJ2NvbnRlbnQnKTsKCiAgICAgICAgY29udGV4dC52YXJzWydyb3V0ZV9wYXRoJ10gPSAnL1tpZF0nOwogICAgICAgIHByZUdlbigKICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiB2YWxpZFJvdXRlQ29uZmlndXJhdGlvbiwKICAgICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgICBkaXJlY3Rvcnk6IGRpcmVjdG9yeSwKICAgICAgICApOwoKICAgICAgICB2ZXJpZnkoCiAgICAgICAgICAoKSA9PiBsb2dnZXIuZXJyKAogICAgICAgICAgICAnJydUaGVyZSBpcyBhbHJlYWR5IGEgbWlkZGxld2FyZSBhdCAke3BhdGgucmVsYXRpdmUoZmlsZVBhdGgpfScnJywKICAgICAgICAgICksCiAgICAgICAgKTsKICAgICAgICBleHBlY3QoZXhpdENhbGxzLCBlcXVhbHMoWzFdKSk7CiAgICAgIH0pOwoKICAgICAgdGVzdCgnZXhpdCgxKSBpZiByb3V0ZSBwYXRoIGhhcyBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzJywgKCkgewogICAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CiAgICAgICAgY29udGV4dC52YXJzWydyb3V0ZV9wYXRoJ10gPSAnL1tpZF0vW2lkXSc7CgogICAgICAgIGZpbmFsIGRpcmVjdG9yeSA9IGlvLkRpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKAogICAgICAgICAgJ2RhcnRfZnJvZ19uZXdfaG9va3NfdGVzdCcsCiAgICAgICAgKTsKICAgICAgICBhZGRUZWFyRG93bigoKSB7CiAgICAgICAgICBkaXJlY3RvcnkuZGVsZXRlU3luYyhyZWN1cnNpdmU6IHRydWUpOwogICAgICAgIH0pOwoKICAgICAgICBwcmVHZW4oCiAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgYnVpbGRDb25maWd1cmF0aW9uOiAoXykgPT4gdmFsaWRSb3V0ZUNvbmZpZ3VyYXRpb24sCiAgICAgICAgICBleGl0OiBleGl0Q2FsbHMuYWRkLAogICAgICAgICAgZGlyZWN0b3J5OiBkaXJlY3RvcnksCiAgICAgICAgKTsKCiAgICAgICAgdmVyaWZ5KAogICAgICAgICAgKCkgPT4gbG9nZ2VyLmVycigKICAgICAgICAgICAgJycnRmFpbGVkIHRvIGNyZWF0ZSBtaWRkbGV3YXJlOiBEdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWUgZm91bmQ6IGlkJycnLAogICAgICAgICAgKSwKICAgICAgICApOwogICAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGVxdWFscyhbMV0pKTsKICAgICAgfSk7CgogICAgICB0ZXN0KCdSZW5hbWVzIGEgd3JhcHBpbmcgcm91dGUgdGhhdCBleGlzdHMgYXMgZmlsZSB0byBhbiBpbmRleCcsICgpIHsKICAgICAgICBmaW5hbCBleGl0Q2FsbHMgPSA8aW50PltdOwoKICAgICAgICBmaW5hbCBkaXJlY3RvcnkgPSBpby5EaXJlY3Rvcnkuc3lzdGVtVGVtcC5jcmVhdGVUZW1wU3luYygKICAgICAgICAgICdkYXJ0X2Zyb2dfbmV3X2hvb2tzX3Rlc3QnLAogICAgICAgICk7CiAgICAgICAgYWRkVGVhckRvd24oKCkgewogICAgICAgICAgZGlyZWN0b3J5LmRlbGV0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKTsKICAgICAgICB9KTsKICAgICAgICBmaW5hbCBmaWxlUGF0aCA9IHBhdGguam9pbigKICAgICAgICAgIGRpcmVjdG9yeS5wYXRoLAogICAgICAgICAgJ3JvdXRlcycsCiAgICAgICAgICAnW2lkXScsCiAgICAgICAgICAnZXhpc3RpbmdfYXNfZmlsZS5kYXJ0JywKICAgICAgICApOwogICAgICAgIGlvLkZpbGUoZmlsZVBhdGgpCiAgICAgICAgICAuLmNyZWF0ZVN5bmMocmVjdXJzaXZlOiB0cnVlKQogICAgICAgICAgLi53cml0ZUFzU3RyaW5nU3luYygnY29udGVudCcpOwoKICAgICAgICBjb250ZXh0LnZhcnNbJ3JvdXRlX3BhdGgnXSA9ICcvW2lkXS9leGlzdGluZ19hc19maWxlJzsKCiAgICAgICAgcHJlR2VuKAogICAgICAgICAgY29udGV4dCwKICAgICAgICAgIGJ1aWxkQ29uZmlndXJhdGlvbjogKF8pID0+IHZhbGlkUm91dGVDb25maWd1cmF0aW9uLAogICAgICAgICAgZXhpdDogZXhpdENhbGxzLmFkZCwKICAgICAgICAgIGRpcmVjdG9yeTogZGlyZWN0b3J5LAogICAgICAgICk7CgogICAgICAgIGV4cGVjdChpby5GaWxlKGZpbGVQYXRoKS5leGlzdHNTeW5jKCksIGlzRmFsc2UpOwoKICAgICAgICBmaW5hbCBuZXdGaWxlcGF0aCA9IHBhdGguam9pbigKICAgICAgICAgIGRpcmVjdG9yeS5wYXRoLAogICAgICAgICAgJ3JvdXRlcycsCiAgICAgICAgICAnW2lkXScsCiAgICAgICAgICAnZXhpc3RpbmdfYXNfZmlsZScsCiAgICAgICAgICAnaW5kZXguZGFydCcsCiAgICAgICAgKTsKCiAgICAgICAgZXhwZWN0KGlvLkZpbGUobmV3RmlsZXBhdGgpLnJlYWRBc1N0cmluZ1N5bmMoKSwgZXF1YWxzKCdjb250ZW50JykpOwogICAgICAgIGV4cGVjdCgKICAgICAgICAgIGNvbnRleHQudmFyc1snZGlyX3BhdGgnXSwKICAgICAgICAgIHBhdGgucmVsYXRpdmUoCiAgICAgICAgICAgIHBhdGguam9pbihkaXJlY3RvcnkucGF0aCwgJ3JvdXRlcycsICdbaWRdJywgJ2V4aXN0aW5nX2FzX2ZpbGUnKSwKICAgICAgICAgICksCiAgICAgICAgKTsKICAgICAgICBleHBlY3QoY29udGV4dC52YXJzWydmaWxlbmFtZSddLCAnX21pZGRsZXdhcmUuZGFydCcpOwogICAgICAgIGV4cGVjdChjb250ZXh0LnZhcnNbJ2lzX21pZGRsZXdhcmUnXSwgdHJ1ZSk7CgogICAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGlzRW1wdHkpOwogICAgICB9KTsKCiAgICAgIHRlc3QoJ1NldHMgdXAgYSBtaWRkbGV3YXJlIHBhdGggY29ycmVjdGx5JywgKCkgewogICAgICAgIGZpbmFsIGV4aXRDYWxscyA9IDxpbnQ+W107CgogICAgICAgIGZpbmFsIGRpcmVjdG9yeSA9IGlvLkRpcmVjdG9yeS5zeXN0ZW1UZW1wLmNyZWF0ZVRlbXBTeW5jKAogICAgICAgICAgJ2RhcnRfZnJvZ19uZXdfaG9va3NfdGVzdCcsCiAgICAgICAgKTsKICAgICAgICBhZGRUZWFyRG93bigoKSB7CiAgICAgICAgICBkaXJlY3RvcnkuZGVsZXRlU3luYyhyZWN1cnNpdmU6IHRydWUpOwogICAgICAgIH0pOwoKICAgICAgICBjb250ZXh0LnZhcnNbJ3JvdXRlX3BhdGgnXSA9ICcvW2lkXS9leGlzdGluZ19hc19kaXInOwogICAgICAgIHByZUdlbigKICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICBidWlsZENvbmZpZ3VyYXRpb246IChfKSA9PiB2YWxpZFJvdXRlQ29uZmlndXJhdGlvbiwKICAgICAgICAgIGV4aXQ6IGV4aXRDYWxscy5hZGQsCiAgICAgICAgICBkaXJlY3Rvcnk6IGRpcmVjdG9yeSwKICAgICAgICApOwoKICAgICAgICBleHBlY3QoCiAgICAgICAgICBjb250ZXh0LnZhcnNbJ2Rpcl9wYXRoJ10sCiAgICAgICAgICBwYXRoLnJlbGF0aXZlKAogICAgICAgICAgICBwYXRoLmpvaW4oZGlyZWN0b3J5LnBhdGgsICdyb3V0ZXMnLCAnW2lkXScsICdleGlzdGluZ19hc19kaXInKSwKICAgICAgICAgICksCiAgICAgICAgKTsKICAgICAgICBleHBlY3QoY29udGV4dC52YXJzWydmaWxlbmFtZSddLCAnX21pZGRsZXdhcmUuZGFydCcpOwogICAgICAgIGV4cGVjdChjb250ZXh0LnZhcnNbJ2lzX21pZGRsZXdhcmUnXSwgdHJ1ZSk7CgogICAgICAgIGV4cGVjdChleGl0Q2FsbHMsIGlzRW1wdHkpOwogICAgICB9KTsKICAgIH0pOwogIH0pOwp9Cg==", - "type": "text" + "type": "text", }, { "path": "test/src/exit_overrides_test.dart", "data": "aW1wb3J0ICdkYXJ0OmlvJzsKCmltcG9ydCAncGFja2FnZTpkYXJ0X2Zyb2dfbmV3X2hvb2tzL3NyYy9leGl0X292ZXJyaWRlcy5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKCnZvaWQgbWFpbigpIHsKICBncm91cCgnRXhpdE92ZXJyaWRlcycsICgpIHsKICAgIGdyb3VwKCdydW5ab25lZCcsICgpIHsKICAgICAgdGVzdCgndXNlcyBkZWZhdWx0IGV4aXQgd2hlbiBub3Qgc3BlY2lmaWVkJywgKCkgewogICAgICAgIEV4aXRPdmVycmlkZXMucnVuWm9uZWQoKCkgewogICAgICAgICAgZmluYWwgb3ZlcnJpZGVzID0gRXhpdE92ZXJyaWRlcy5jdXJyZW50OwogICAgICAgICAgZXhwZWN0KG92ZXJyaWRlcyEuZXhpdCwgZXF1YWxzKGV4aXQpKTsKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICB0ZXN0KCd1c2VzIGN1c3RvbSBleGl0IHdoZW4gc3BlY2lmaWVkJywgKCkgewogICAgICAgIEV4aXRPdmVycmlkZXMucnVuWm9uZWQoCiAgICAgICAgICAoKSB7CiAgICAgICAgICAgIGZpbmFsIG92ZXJyaWRlcyA9IEV4aXRPdmVycmlkZXMuY3VycmVudDsKICAgICAgICAgICAgZXhwZWN0KG92ZXJyaWRlcyEuZXhpdCwgaXNOb3QoZXF1YWxzKGV4aXQpKSk7CiAgICAgICAgICB9LAogICAgICAgICAgZXhpdDogKF8pIHt9LAogICAgICAgICk7CiAgICAgIH0pOwogICAgfSk7CiAgfSk7Cn0K", - "type": "text" + "type": "text", }, { "path": "test/src/normalize_route_path_test.dart", "data": "aW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19uZXdfaG9va3Mvc3JjL25vcm1hbGl6ZV9yb3V0ZV9wYXRoLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwoKdm9pZCBtYWluKCkgewogIGdyb3VwKCdub3JtYWxpemVSb3V0ZVBhdGgnLCAoKSB7CiAgICBmaW5hbCBleHBlY3RlZE1hcHBpbmdzID0gPFN0cmluZywgU3RyaW5nPnsKICAgICAgJy8nOiAnLycsCiAgICAgIHInXCc6ICcvJywKICAgICAgJyc6ICcvJywKICAgICAgJy9oZWxsbyc6ICcvaGVsbG8nLAogICAgICByJ1xoZWxsbyc6ICcvaGVsbG8nLAogICAgICAnaGVsbG8nOiAnL2hlbGxvJywKICAgICAgJ1tpZF0nOiAnLzxpZD4nLAogICAgICAnPGlkPic6ICcvPGlkPicsCiAgICAgICcvaGVsbG8vd29ybGQnOiAnL2hlbGxvL3dvcmxkJywKICAgICAgcidcaGVsbG9cd29ybGQnOiAnL2hlbGxvL3dvcmxkJywKICAgICAgJ2hlbGxvL3dvcmxkJzogJy9oZWxsby93b3JsZCcsCiAgICAgICcvaGVsbG8vW25hbWVdJzogJy9oZWxsby88bmFtZT4nLAogICAgICByJ1xoZWxsb1xbbmFtZV0nOiAnL2hlbGxvLzxuYW1lPicsCiAgICAgICdoZWxsby9bbmFtZV0nOiAnL2hlbGxvLzxuYW1lPicsCiAgICAgICcvaGVsbG8vPG5hbWU+JzogJy9oZWxsby88bmFtZT4nLAogICAgICAnL1tpZF0vaXRlbSc6ICcvPGlkPi9pdGVtJywKICAgICAgcidcW2lkXVxpdGVtJzogJy88aWQ+L2l0ZW0nLAogICAgICAnW2lkXS9pdGVtJzogJy88aWQ+L2l0ZW0nLAogICAgICAnLzxpZD4vaXRlbSc6ICcvPGlkPi9pdGVtJywKICAgICAgJy90aGlzIGhhcyBzcGFjZS9yZWFsbHknOiAnL3RoaXMlMjBoYXMlMjBzcGFjZS9yZWFsbHknLAogICAgICAnL3doby9kb2VzL25vdC8uLi90aGlzLy4nOiAnL3doby9kb2VzL3RoaXMnLAogICAgfTsKCiAgICBmb3IgKGZpbmFsIGVudHJ5IGluIGV4cGVjdGVkTWFwcGluZ3MuZW50cmllcykgewogICAgICB0ZXN0KCdtYXBzICR7ZW50cnkua2V5fSAtPiAke2VudHJ5LnZhbHVlfScsICgpIHsKICAgICAgICBleHBlY3Qobm9ybWFsaXplUm91dGVQYXRoKGVudHJ5LmtleSksIGVxdWFscyhlbnRyeS52YWx1ZSkpOwogICAgICB9KTsKICAgIH0KICB9KTsKfQo=", - "type": "text" + "type": "text", }, { "path": "test/src/parameter_syntax_test.dart", "data": "aW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19uZXdfaG9va3Mvc3JjL3BhcmFtZXRlcl9zeW50YXguZGFydCc7CmltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7Cgp2b2lkIG1haW4oKSB7CiAgZ3JvdXAoJ1BhcmFtZXRlclN5bnRheCcsICgpIHsKICAgIGdyb3VwKCd0b0RpYW1vbmRQYXJhbWV0ZXJTeW50YXgnLCAoKSB7CiAgICAgIHRlc3QoJ3Nob3VsZCBjb252ZXJ0IGJyYWNrZXRzIHRvIGRpYW1vbmQgYnJhY2tldHMnLCAoKSB7CiAgICAgICAgZXhwZWN0KCcvW2lkXScudG9EaWFtb25kUGFyYW1ldGVyU3ludGF4LCBlcXVhbHMoJy88aWQ+JykpOwogICAgICAgIGV4cGVjdCgnL1tpZF0vaXRlbScudG9EaWFtb25kUGFyYW1ldGVyU3ludGF4LCBlcXVhbHMoJy88aWQ+L2l0ZW0nKSk7CiAgICAgICAgZXhwZWN0KCcvdG9wL1tpZF0nLnRvRGlhbW9uZFBhcmFtZXRlclN5bnRheCwgZXF1YWxzKCcvdG9wLzxpZD4nKSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBncm91cCgndG9CcmFja2V0UGFyYW1ldGVyU3ludGF4JywgKCkgewogICAgICB0ZXN0KCdzaG91bGQgY29udmVydCBkaWFtb25kIGJyYWNrZXRzIHRvIGJyYWNrZXRzJywgKCkgewogICAgICAgIGV4cGVjdCgnLzxpZD4nLnRvQnJhY2tldFBhcmFtZXRlclN5bnRheCwgZXF1YWxzKCcvW2lkXScpKTsKICAgICAgICBleHBlY3QoJy88aWQ+L2l0ZW0nLnRvQnJhY2tldFBhcmFtZXRlclN5bnRheCwgZXF1YWxzKCcvW2lkXS9pdGVtJykpOwogICAgICAgIGV4cGVjdCgnL3RvcC88aWQ+Jy50b0JyYWNrZXRQYXJhbWV0ZXJTeW50YXgsIGVxdWFscygnL3RvcC9baWRdJykpOwogICAgICB9KTsKICAgIH0pOwoKICAgIGdyb3VwKCdoYXNEaWFtb25kUGFyYW1ldGVyJywgKCkgewogICAgICB0ZXN0KAogICAgICAgICdzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlIHJvdXRlIGNvbnRhaW5zIGRpYW1vbmQgcGFyYW1ldGVycycsCiAgICAgICAgKCkgewogICAgICAgICAgZXhwZWN0KCcvPGlkPicuaGFzRGlhbW9uZFBhcmFtZXRlciwgaXNUcnVlKTsKICAgICAgICAgIGV4cGVjdCgnLzxpZD4vaXRlbScuaGFzRGlhbW9uZFBhcmFtZXRlciwgaXNUcnVlKTsKICAgICAgICAgIGV4cGVjdCgnL3RvcC88aWQ+Jy5oYXNEaWFtb25kUGFyYW1ldGVyLCBpc1RydWUpOwogICAgICAgIH0sCiAgICAgICk7CgogICAgICB0ZXN0KAogICAgICAgICdzaG91bGQgcmV0dXJuIGZhbHNlIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBjb250YWluIGRpYW1vbmQgcGFyYW1ldGVycycsCiAgICAgICAgKCkgewogICAgICAgICAgZXhwZWN0KCcvaWQnLmhhc0RpYW1vbmRQYXJhbWV0ZXIsIGlzRmFsc2UpOwogICAgICAgICAgZXhwZWN0KCcvaWQvaXRlbScuaGFzRGlhbW9uZFBhcmFtZXRlciwgaXNGYWxzZSk7CiAgICAgICAgICBleHBlY3QoJy88dG9wL2lkJy5oYXNEaWFtb25kUGFyYW1ldGVyLCBpc0ZhbHNlKTsKICAgICAgICAgIGV4cGVjdCgnL3RvcD4vaWQnLmhhc0RpYW1vbmRQYXJhbWV0ZXIsIGlzRmFsc2UpOwogICAgICAgIH0sCiAgICAgICk7CiAgICB9KTsKCiAgICBncm91cCgnZ2V0UGFyYW1ldGVyTmFtZXMnLCAoKSB7CiAgICAgIHRlc3QoJ3Nob3VsZCByZXR1cm4gdGhlIHBhcmFtZXRlciBuYW1lcycsICgpIHsKICAgICAgICBleHBlY3QoJy88aWQ+Jy5nZXRQYXJhbWV0ZXJOYW1lcygpLCBlcXVhbHMoWydpZCddKSk7CiAgICAgICAgZXhwZWN0KCcvPGlkPi9pdGVtJy5nZXRQYXJhbWV0ZXJOYW1lcygpLCBlcXVhbHMoWydpZCddKSk7CiAgICAgICAgZXhwZWN0KCcvdG9wLzxpZD4nLmdldFBhcmFtZXRlck5hbWVzKCksIGVxdWFscyhbJ2lkJ10pKTsKICAgICAgICBleHBlY3QoJy88aWQ+L2l0ZW0vPG5hbWU+Jy5nZXRQYXJhbWV0ZXJOYW1lcygpLCBlcXVhbHMoWydpZCcsICduYW1lJ10pKTsKICAgICAgICBleHBlY3QoJy9baWRdJy5nZXRQYXJhbWV0ZXJOYW1lcygpLCBlcXVhbHMoWydpZCddKSk7CiAgICAgICAgZXhwZWN0KCcvW2lkXS9pdGVtJy5nZXRQYXJhbWV0ZXJOYW1lcygpLCBlcXVhbHMoWydpZCddKSk7CiAgICAgICAgZXhwZWN0KCcvdG9wL1tpZF0nLmdldFBhcmFtZXRlck5hbWVzKCksIGVxdWFscyhbJ2lkJ10pKTsKICAgICAgICBleHBlY3QoJy9baWRdL2l0ZW0vW25hbWVdJy5nZXRQYXJhbWV0ZXJOYW1lcygpLCBlcXVhbHMoWydpZCcsICduYW1lJ10pKTsKICAgICAgfSk7CiAgICAgIHRlc3QoJ3Nob3VsZCBmYWlsIG9uIGR1cGxpY2F0ZWQgcGFyYW1ldGVyIG5hbWVzJywgKCkgewogICAgICAgIGV4cGVjdCgKICAgICAgICAgICgpID0+ICcvPGlkPi9zdXBlci88bmljZT4vPGlkPi88bmljZT4nLmdldFBhcmFtZXRlck5hbWVzKCksCiAgICAgICAgICB0aHJvd3NBKAogICAgICAgICAgICBpc0E8Rm9ybWF0RXhjZXB0aW9uPigpLmhhdmluZygKICAgICAgICAgICAgICAocCkgPT4gcC5tZXNzYWdlLAogICAgICAgICAgICAgICdtZXNzYWdlJywKICAgICAgICAgICAgICAnRHVwbGljYXRlIHBhcmFtZXRlciBuYW1lcyBmb3VuZDogaWQsIG5pY2UnLAogICAgICAgICAgICApLAogICAgICAgICAgKSwKICAgICAgICApOwogICAgICAgIGV4cGVjdCgKICAgICAgICAgICgpID0+ICcvW2lkXS9baWRdJy5nZXRQYXJhbWV0ZXJOYW1lcygpLAogICAgICAgICAgdGhyb3dzQSgKICAgICAgICAgICAgaXNBPEZvcm1hdEV4Y2VwdGlvbj4oKS5oYXZpbmcoCiAgICAgICAgICAgICAgKHApID0+IHAubWVzc2FnZSwKICAgICAgICAgICAgICAnbWVzc2FnZScsCiAgICAgICAgICAgICAgJ0R1cGxpY2F0ZSBwYXJhbWV0ZXIgbmFtZSBmb3VuZDogaWQnLAogICAgICAgICAgICApLAogICAgICAgICAgKSwKICAgICAgICApOwogICAgICB9KTsKICAgIH0pOwogIH0pOwp9Cg==", - "type": "text" + "type": "text", }, { "path": "test/src/route_configuration_utils_test.dart", "data": "aW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19nZW4vZGFydF9mcm9nX2dlbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19uZXdfaG9va3Mvc3JjL3JvdXRlX2NvbmZpZ3VyYXRpb25fdXRpbHMuZGFydCc7CmltcG9ydCAncGFja2FnZTptYXNvbi9tYXNvbi5kYXJ0JzsKaW1wb3J0ICdwYWNrYWdlOm1vY2t0YWlsL21vY2t0YWlsLmRhcnQnOwppbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOwoKY2xhc3MgX01vY2tSb3V0ZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgUm91dGVDb25maWd1cmF0aW9uIHt9Cgp2b2lkIG1haW4oKSB7CiAgZ3JvdXAoJ1JvdXRlQ29uZmlndXJhdGlvblV0aWxzJywgKCkgewogICAgZ3JvdXAoJ3ZhbGlkYXRlJywgKCkgewogICAgICBsYXRlIFJvdXRlQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOwoKICAgICAgc2V0VXAoKCkgewogICAgICAgIGNvbmZpZ3VyYXRpb24gPSBfTW9ja1JvdXRlQ29uZmlndXJhdGlvbigpOwogICAgICAgIHdoZW4oKCkgPT4gY29uZmlndXJhdGlvbi5yb2d1ZVJvdXRlcykudGhlblJldHVybihbXSk7CiAgICAgICAgd2hlbigoKSA9PiBjb25maWd1cmF0aW9uLmVuZHBvaW50cykudGhlblJldHVybih7fSk7CiAgICAgIH0pOwoKICAgICAgdGVzdCgncmVwb3J0cyByb2d1ZSByb3V0ZScsICgpIHsKICAgICAgICB3aGVuKCgpID0+IGNvbmZpZ3VyYXRpb24ucm9ndWVSb3V0ZXMpLnRoZW5SZXR1cm4oCiAgICAgICAgICBjb25zdCBbCiAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiAnaGVsbG8nLAogICAgICAgICAgICAgIHBhdGg6ICdoZWxsby5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy9oZWxsbycsCiAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICksCiAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgIGV4cGVjdCgKICAgICAgICAgICgpID0+IGNvbmZpZ3VyYXRpb24udmFsaWRhdGUoKSwKICAgICAgICAgIHRocm93c0EoCiAgICAgICAgICAgIGlzQTxGb3JtYXRFeGNlcHRpb24+KCkuaGF2aW5nKAogICAgICAgICAgICAgIChwKSA9PiBwLm1lc3NhZ2UsCiAgICAgICAgICAgICAgJ2Vycm9yIG1lc3NhZ2UnLAogICAgICAgICAgICAgICcnJ1JvZ3VlIHJvdXRlIGRldGVjdGVkLiR7ZGVmYXVsdEZvcmVncm91bmQud3JhcCgnICcpfVJlbmFtZSAke2xpZ2h0Q3lhbi53cmFwKCdyb3V0ZXMvaGVsbG8uZGFydCcpfSB0byAke2xpZ2h0Q3lhbi53cmFwKCdyb3V0ZXMvaGVsbG8vaW5kZXguZGFydCcpfS4nJycsCiAgICAgICAgICAgICksCiAgICAgICAgICApLAogICAgICAgICk7CiAgICAgIH0pOwoKICAgICAgdGVzdCgncmVwb3J0IHJvdXRlIGNvbmZsaWN0JywgKCkgewogICAgICAgIHdoZW4oKCkgPT4gY29uZmlndXJhdGlvbi5lbmRwb2ludHMpLnRoZW5SZXR1cm4oewogICAgICAgICAgJy8nOiBjb25zdCBbCiAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiAnaW5kZXgnLAogICAgICAgICAgICAgIHBhdGg6ICdpbmRleC5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy8nLAogICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICApLAogICAgICAgICAgXSwKICAgICAgICAgICcvaGVsbG8nOiBjb25zdCBbCiAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiAnaGVsbG8nLAogICAgICAgICAgICAgIHBhdGg6ICdoZWxsby5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy9oZWxsbycsCiAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiAnaGVsbG9faW5kZXgnLAogICAgICAgICAgICAgIHBhdGg6ICdoZWxsby9pbmRleC5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy8nLAogICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICApLAogICAgICAgICAgXSwKICAgICAgICB9KTsKCiAgICAgICAgZXhwZWN0KAogICAgICAgICAgKCkgPT4gY29uZmlndXJhdGlvbi52YWxpZGF0ZSgpLAogICAgICAgICAgdGhyb3dzQSgKICAgICAgICAgICAgaXNBPEZvcm1hdEV4Y2VwdGlvbj4oKS5oYXZpbmcoCiAgICAgICAgICAgICAgKHApID0+IHAubWVzc2FnZSwKICAgICAgICAgICAgICAnZXJyb3IgbWVzc2FnZScsCiAgICAgICAgICAgICAgJycnUm91dGUgY29uZmxpY3QgZGV0ZWN0ZWQuICR7bGlnaHRDeWFuLndyYXAoJ3JvdXRlcy9oZWxsby5kYXJ0Jyl9IGFuZCAke2xpZ2h0Q3lhbi53cmFwKCdyb3V0ZXMvaGVsbG8vaW5kZXguZGFydCcpfSBib3RoIHJlc29sdmUgdG8gJHtsaWdodEN5YW4ud3JhcCgnL2hlbGxvJyl9LicnJywKICAgICAgICAgICAgKSwKICAgICAgICAgICksCiAgICAgICAgKTsKICAgICAgfSk7CiAgICB9KTsKCiAgICBncm91cCgnY29udGFpbmluZ0ZpbGVSb3V0ZScsICgpIHsKICAgICAgbGF0ZSBSb3V0ZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKICAgICAgc2V0VXAoKCkgewogICAgICAgIGNvbmZpZ3VyYXRpb24gPSBfTW9ja1JvdXRlQ29uZmlndXJhdGlvbigpOwogICAgICAgIHdoZW4oKCkgPT4gY29uZmlndXJhdGlvbi5lbmRwb2ludHMpLnRoZW5SZXR1cm4oewogICAgICAgICAgJy8nOiBjb25zdCA8Um91dGVGaWxlPlsKICAgICAgICAgICAgUm91dGVGaWxlKAogICAgICAgICAgICAgIG5hbWU6ICdpbmRleCcsCiAgICAgICAgICAgICAgcGF0aDogJy4uL3JvdXRlcy9pbmRleC5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy8nLAogICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICApLAogICAgICAgICAgXSwKICAgICAgICAgICcvPGlkPic6IGNvbnN0IDxSb3V0ZUZpbGU+WwogICAgICAgICAgICBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgbmFtZTogcickaWRfaW5kZXgnLAogICAgICAgICAgICAgIHBhdGg6ICcuLi9yb3V0ZXMvW2lkXS9pbmRleC5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy8nLAogICAgICAgICAgICAgIHBhcmFtczogW10sCiAgICAgICAgICAgICAgd2lsZGNhcmQ6IGZhbHNlLAogICAgICAgICAgICApLAogICAgICAgICAgXSwKICAgICAgICAgICcvPGlkPi9leGlzdGluZ19hc19maWxlJzogY29uc3QgPFJvdXRlRmlsZT5bCiAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiByJyRpZF9leGlzdGluZ19hc19maWxlJywKICAgICAgICAgICAgICBwYXRoOiAnLi4vcm91dGVzL1tpZF0vZXhpc3RpbmdfYXNfZmlsZS5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy9leGlzdGluZ19hc19maWxlJywKICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgKSwKICAgICAgICAgIF0sCiAgICAgICAgICAnLzxpZD4vZXhpc3RpbmdfYXNfZGlyJzogY29uc3QgPFJvdXRlRmlsZT5bCiAgICAgICAgICAgIFJvdXRlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiByJyRpZF9leGlzdGluZ19hc19kaXJfaW5kZXgnLAogICAgICAgICAgICAgIHBhdGg6ICcuLi9yb3V0ZXMvW2lkXS9leGlzdGluZ19hc19kaXIvaW5kZXguZGFydCcsCiAgICAgICAgICAgICAgcm91dGU6ICcvJywKICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgKSwKICAgICAgICAgIF0sCiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgZ3JvdXAoJ2luY2x1ZGVTZWxmIGZhbHNlJywgKCkgewogICAgICAgIHRlc3QoJ3JldHVybnMgbnVsbCBmb3IgdGhlIHJvb3Qgcm91dGUnLCAoKSB7CiAgICAgICAgICBmaW5hbCByZXN1bHQgPSBjb25maWd1cmF0aW9uLmNvbnRhaW5pbmdGaWxlUm91dGUoJy8nKTsKCiAgICAgICAgICBleHBlY3QocmVzdWx0LCBpc051bGwpOwogICAgICAgIH0pOwoKICAgICAgICB0ZXN0KCdyZXR1cm5zIG51bGwgZm9yIHJvdXRlcyB3aXRoIG5vIGZpbGUgcm91dGUgYXMgYW5jZXN0b3InLCAoKSB7CiAgICAgICAgICBmaW5hbCByZXN1bHQgPSBjb25maWd1cmF0aW9uLmNvbnRhaW5pbmdGaWxlUm91dGUoCiAgICAgICAgICAgICcvPGlkPi9leGlzdGluZ19hc19kaXIvbmV3X3JvdXRlJywKICAgICAgICAgICk7CgogICAgICAgICAgZXhwZWN0KHJlc3VsdCwgaXNOdWxsKTsKICAgICAgICB9KTsKCiAgICAgICAgdGVzdCgncmV0dXJucyB0aGUgaW5uZXJtb3N0IGZpbGUgcm91dGUnLCAoKSB7CiAgICAgICAgICBmaW5hbCByZXN1bHQgPSBjb25maWd1cmF0aW9uLmNvbnRhaW5pbmdGaWxlUm91dGUoCiAgICAgICAgICAgICcvPGlkPi9leGlzdGluZ19hc19maWxlL25ld19yb3V0ZScsCiAgICAgICAgICApOwoKICAgICAgICAgIGV4cGVjdCgKICAgICAgICAgICAgcmVzdWx0LAogICAgICAgICAgICBjb25zdCBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgbmFtZTogcickaWRfZXhpc3RpbmdfYXNfZmlsZScsCiAgICAgICAgICAgICAgcGF0aDogJy4uL3JvdXRlcy9baWRdL2V4aXN0aW5nX2FzX2ZpbGUuZGFydCcsCiAgICAgICAgICAgICAgcm91dGU6ICcvZXhpc3RpbmdfYXNfZmlsZScsCiAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICksCiAgICAgICAgICApOwogICAgICAgIH0pOwoKICAgICAgICB0ZXN0KCdyZXR1cm5zIG51bGwgd2hlbiB0aGUgZ2l2ZW4gcm91dGUgaXMgYSBmaWxlIHJvdXRlJywgKCkgewogICAgICAgICAgZmluYWwgcmVzdWx0ID0gY29uZmlndXJhdGlvbi5jb250YWluaW5nRmlsZVJvdXRlKAogICAgICAgICAgICAnLzxpZD4vZXhpc3RpbmdfYXNfZGlyJywKICAgICAgICAgICk7CgogICAgICAgICAgZXhwZWN0KHJlc3VsdCwgaXNOdWxsKTsKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBncm91cCgnaW5jbHVkZVNlbGYgdHJ1ZScsICgpIHsKICAgICAgICB0ZXN0KCdyZXR1cm5zIG51bGwgZm9yIHRoZSByb290IHJvdXRlJywgKCkgewogICAgICAgICAgZmluYWwgcmVzdWx0ID0gY29uZmlndXJhdGlvbi5jb250YWluaW5nRmlsZVJvdXRlKAogICAgICAgICAgICAnLycsCiAgICAgICAgICAgIGluY2x1ZGVTZWxmOiB0cnVlLAogICAgICAgICAgKTsKCiAgICAgICAgICBleHBlY3QocmVzdWx0LCBpc051bGwpOwogICAgICAgIH0pOwoKICAgICAgICB0ZXN0KCdyZXR1cm5zIG51bGwgZm9yIHJvdXRlcyB3aXRoIG5vIGZpbGUgcm91dGUgYXMgYW5jZXN0b3InLCAoKSB7CiAgICAgICAgICBmaW5hbCByZXN1bHQgPSBjb25maWd1cmF0aW9uLmNvbnRhaW5pbmdGaWxlUm91dGUoCiAgICAgICAgICAgICcvPGlkPi9leGlzdGluZ19hc19kaXIvbmV3X3JvdXRlJywKICAgICAgICAgICAgaW5jbHVkZVNlbGY6IHRydWUsCiAgICAgICAgICApOwoKICAgICAgICAgIGV4cGVjdChyZXN1bHQsIGlzTnVsbCk7CiAgICAgICAgfSk7CgogICAgICAgIHRlc3QoJ3JldHVybnMgdGhlIGlubmVybW9zdCBmaWxlIHJvdXRlJywgKCkgewogICAgICAgICAgZmluYWwgcmVzdWx0ID0gY29uZmlndXJhdGlvbi5jb250YWluaW5nRmlsZVJvdXRlKAogICAgICAgICAgICAnLzxpZD4vZXhpc3RpbmdfYXNfZmlsZS9uZXdfcm91dGUnLAogICAgICAgICAgICBpbmNsdWRlU2VsZjogdHJ1ZSwKICAgICAgICAgICk7CgogICAgICAgICAgZXhwZWN0KAogICAgICAgICAgICByZXN1bHQsCiAgICAgICAgICAgIGNvbnN0IFJvdXRlRmlsZSgKICAgICAgICAgICAgICBuYW1lOiByJyRpZF9leGlzdGluZ19hc19maWxlJywKICAgICAgICAgICAgICBwYXRoOiAnLi4vcm91dGVzL1tpZF0vZXhpc3RpbmdfYXNfZmlsZS5kYXJ0JywKICAgICAgICAgICAgICByb3V0ZTogJy9leGlzdGluZ19hc19maWxlJywKICAgICAgICAgICAgICBwYXJhbXM6IFtdLAogICAgICAgICAgICAgIHdpbGRjYXJkOiBmYWxzZSwKICAgICAgICAgICAgKSwKICAgICAgICAgICk7CiAgICAgICAgfSk7CgogICAgICAgIHRlc3QoJ3JldHVybnMgdGhlIGdpdmVuIHJvdXRlIHdoZW4gdGhhdCBpcyBhIGZpbGUgcm91dGUnLCAoKSB7CiAgICAgICAgICBmaW5hbCByZXN1bHQgPSBjb25maWd1cmF0aW9uLmNvbnRhaW5pbmdGaWxlUm91dGUoCiAgICAgICAgICAgICcvPGlkPi9leGlzdGluZ19hc19maWxlJywKICAgICAgICAgICAgaW5jbHVkZVNlbGY6IHRydWUsCiAgICAgICAgICApOwoKICAgICAgICAgIGV4cGVjdCgKICAgICAgICAgICAgcmVzdWx0LAogICAgICAgICAgICBjb25zdCBSb3V0ZUZpbGUoCiAgICAgICAgICAgICAgbmFtZTogcickaWRfZXhpc3RpbmdfYXNfZmlsZScsCiAgICAgICAgICAgICAgcGF0aDogJy4uL3JvdXRlcy9baWRdL2V4aXN0aW5nX2FzX2ZpbGUuZGFydCcsCiAgICAgICAgICAgICAgcm91dGU6ICcvZXhpc3RpbmdfYXNfZmlsZScsCiAgICAgICAgICAgICAgcGFyYW1zOiBbXSwKICAgICAgICAgICAgICB3aWxkY2FyZDogZmFsc2UsCiAgICAgICAgICAgICksCiAgICAgICAgICApOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pOwogIH0pOwp9Cg==", - "type": "text" + "type": "text", }, { "path": "test/src/route_to_path_test.dart", "data": "aW1wb3J0ICdwYWNrYWdlOmRhcnRfZnJvZ19uZXdfaG9va3Mvc3JjL3JvdXRlX3RvX3BhdGguZGFydCc7CmltcG9ydCAncGFja2FnZTpwYXRoL3BhdGguZGFydCcgYXMgcGF0aDsKaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKCnZvaWQgbWFpbigpIHsKICBncm91cCgncm91dGVUb1BhdGgnLCAoKSB7CiAgICB0ZXN0KCdkZWZhdWx0cyB0byBjdXJyZW50IHBsYXRmb3JtIHBhdGggY29udGV4dCcsICgpIHsKICAgICAgZXhwZWN0KHJvdXRlVG9QYXRoKCcvJyksIGVxdWFscyhwYXRoLmpvaW4oJ3JvdXRlcycsICdpbmRleC5kYXJ0JykpKTsKICAgIH0pOwogIH0pOwoKICBncm91cCgncm91dGVUb1BhdGggcG9zaXgnLCAoKSB7CiAgICBncm91cCgncHJlZmVySW5kZXggZmFsc2UnLCAoKSB7CiAgICAgIGZpbmFsIGV4cGVjdGVkUm91dGVUb1BhdGhNYXBwaW5ncyA9IDxTdHJpbmcsIFN0cmluZz57CiAgICAgICAgJy8nOiAnLi4vcm91dGVzL2luZGV4LmRhcnQnLAogICAgICAgICcvaGVsbG8nOiAnLi4vcm91dGVzL2hlbGxvLmRhcnQnLAogICAgICAgICcvaGVsbG8vd29ybGQnOiAnLi4vcm91dGVzL2hlbGxvL3dvcmxkLmRhcnQnLAogICAgICAgICcvaGVsbG8vW25hbWVdJzogJy4uL3JvdXRlcy9oZWxsby9bbmFtZV0uZGFydCcsCiAgICAgICAgJy9baWRdL2l0ZW0nOiAnLi4vcm91dGVzL1tpZF0vaXRlbS5kYXJ0JywKICAgICAgICAnL1tpZF0vcGFydC9pdGVtJzogJy4uL3JvdXRlcy9baWRdL3BhcnQvaXRlbS5kYXJ0JywKICAgICAgfTsKCiAgICAgIGZvciAoZmluYWwgZW50cnkgaW4gZXhwZWN0ZWRSb3V0ZVRvUGF0aE1hcHBpbmdzLmVudHJpZXMpIHsKICAgICAgICB0ZXN0KCdtYXBzICR7ZW50cnkua2V5fSAtPiAke2VudHJ5LnZhbHVlfScsICgpIHsKICAgICAgICAgIGV4cGVjdCgKICAgICAgICAgICAgcm91dGVUb1BhdGgoZW50cnkua2V5LCBwcmVhbWJsZTogJy4uL3JvdXRlcycpLAogICAgICAgICAgICBlcXVhbHMocGF0aC5wb3NpeC5ub3JtYWxpemUoZW50cnkudmFsdWUpKSwKICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwoKICAgIGdyb3VwKCdwcmVmZXJJbmRleCB0cnVlJywgKCkgewogICAgICBmaW5hbCBleHBlY3RlZFJvdXRlVG9QYXRoTWFwcGluZ3MgPSA8U3RyaW5nLCBTdHJpbmc+ewogICAgICAgICcvJzogJy4uL3JvdXRlcy9pbmRleC5kYXJ0JywKICAgICAgICAnL2hlbGxvJzogJy4uL3JvdXRlcy9oZWxsby9pbmRleC5kYXJ0JywKICAgICAgICAnL2hlbGxvL3dvcmxkJzogJy4uL3JvdXRlcy9oZWxsby93b3JsZC9pbmRleC5kYXJ0JywKICAgICAgICAnL2hlbGxvL1tuYW1lXSc6ICcuLi9yb3V0ZXMvaGVsbG8vW25hbWVdL2luZGV4LmRhcnQnLAogICAgICAgICcvW2lkXS9pdGVtJzogJy4uL3JvdXRlcy9baWRdL2l0ZW0vaW5kZXguZGFydCcsCiAgICAgICAgJy9baWRdL3BhcnQvaXRlbSc6ICcuLi9yb3V0ZXMvW2lkXS9wYXJ0L2l0ZW0vaW5kZXguZGFydCcsCiAgICAgIH07CgogICAgICBmb3IgKGZpbmFsIGVudHJ5IGluIGV4cGVjdGVkUm91dGVUb1BhdGhNYXBwaW5ncy5lbnRyaWVzKSB7CiAgICAgICAgdGVzdCgnbWFwcyAke2VudHJ5LmtleX0gLT4gJHtlbnRyeS52YWx1ZX0nLCAoKSB7CiAgICAgICAgICBleHBlY3QoCiAgICAgICAgICAgIHJvdXRlVG9QYXRoKGVudHJ5LmtleSwgcHJlZmVySW5kZXg6IHRydWUsIHByZWFtYmxlOiAnLi4vcm91dGVzJyksCiAgICAgICAgICAgIGVxdWFscyhwYXRoLnBvc2l4Lm5vcm1hbGl6ZShlbnRyeS52YWx1ZSkpLAogICAgICAgICAgKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSk7CiAgfSk7CgogIGdyb3VwKCdyb3V0ZVRvUGF0aCB3aW5kb3dzJywgKCkgewogICAgZ3JvdXAoJ3ByZWZlckluZGV4IGZhbHNlJywgKCkgewogICAgICBmaW5hbCBleHBlY3RlZFJvdXRlVG9QYXRoTWFwcGluZ3MgPSA8U3RyaW5nLCBTdHJpbmc+ewogICAgICAgICcvJzogcicuLlxyb3V0ZXNcaW5kZXguZGFydCcsCiAgICAgICAgJy9oZWxsbyc6IHInLi5ccm91dGVzXGhlbGxvLmRhcnQnLAogICAgICAgICcvaGVsbG8vd29ybGQnOiByJy4uXHJvdXRlc1xoZWxsb1x3b3JsZC5kYXJ0JywKICAgICAgICAnL2hlbGxvL1tuYW1lXSc6IHInLi5ccm91dGVzXGhlbGxvXFtuYW1lXS5kYXJ0JywKICAgICAgICAnL1tpZF0vaXRlbSc6IHInLi5ccm91dGVzXFtpZF1caXRlbS5kYXJ0JywKICAgICAgICAnL1tpZF0vcGFydC9pdGVtJzogcicuLlxyb3V0ZXNcW2lkXVxwYXJ0XGl0ZW0uZGFydCcsCiAgICAgIH07CgogICAgICBmb3IgKGZpbmFsIGVudHJ5IGluIGV4cGVjdGVkUm91dGVUb1BhdGhNYXBwaW5ncy5lbnRyaWVzKSB7CiAgICAgICAgdGVzdCgnbWFwcyAke2VudHJ5LmtleX0gLT4gJHtlbnRyeS52YWx1ZX0nLCAoKSB7CiAgICAgICAgICBleHBlY3QoCiAgICAgICAgICAgIHJvdXRlVG9QYXRoKAogICAgICAgICAgICAgIGVudHJ5LmtleSwKICAgICAgICAgICAgICBwcmVhbWJsZTogcicuLlxyb3V0ZXMnLAogICAgICAgICAgICAgIHBhdGhDb250ZXh0OiBwYXRoLndpbmRvd3MsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGVxdWFscyhwYXRoLndpbmRvd3Mubm9ybWFsaXplKGVudHJ5LnZhbHVlKSksCiAgICAgICAgICApOwogICAgICAgIH0pOwogICAgICB9CiAgICB9KTsKCiAgICBncm91cCgncHJlZmVySW5kZXggdHJ1ZScsICgpIHsKICAgICAgZmluYWwgZXhwZWN0ZWRSb3V0ZVRvUGF0aE1hcHBpbmdzID0gPFN0cmluZywgU3RyaW5nPnsKICAgICAgICAnLyc6IHInLi5ccm91dGVzXGluZGV4LmRhcnQnLAogICAgICAgICcvaGVsbG8nOiByJy4uXHJvdXRlc1xoZWxsb1xpbmRleC5kYXJ0JywKICAgICAgICAnL2hlbGxvL3dvcmxkJzogcicuLlxyb3V0ZXNcaGVsbG9cd29ybGRcaW5kZXguZGFydCcsCiAgICAgICAgJy9oZWxsby9bbmFtZV0nOiByJy4uXHJvdXRlc1xoZWxsb1xbbmFtZV1caW5kZXguZGFydCcsCiAgICAgICAgJy9baWRdL2l0ZW0nOiByJy4uXHJvdXRlc1xbaWRdXGl0ZW1caW5kZXguZGFydCcsCiAgICAgICAgJy9baWRdL3BhcnQvaXRlbSc6IHInLi5ccm91dGVzXFtpZF1ccGFydFxpdGVtXGluZGV4LmRhcnQnLAogICAgICB9OwoKICAgICAgZm9yIChmaW5hbCBlbnRyeSBpbiBleHBlY3RlZFJvdXRlVG9QYXRoTWFwcGluZ3MuZW50cmllcykgewogICAgICAgIHRlc3QoJ21hcHMgJHtlbnRyeS5rZXl9IC0+ICR7ZW50cnkudmFsdWV9JywgKCkgewogICAgICAgICAgZXhwZWN0KAogICAgICAgICAgICByb3V0ZVRvUGF0aCgKICAgICAgICAgICAgICBlbnRyeS5rZXksCiAgICAgICAgICAgICAgcHJlZmVySW5kZXg6IHRydWUsCiAgICAgICAgICAgICAgcHJlYW1ibGU6IHInLi5ccm91dGVzJywKICAgICAgICAgICAgICBwYXRoQ29udGV4dDogcGF0aC53aW5kb3dzLAogICAgICAgICAgICApLAogICAgICAgICAgICBlcXVhbHMocGF0aC53aW5kb3dzLm5vcm1hbGl6ZShlbnRyeS52YWx1ZSkpLAogICAgICAgICAgKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSk7CiAgfSk7Cn0K", - "type": "text" - } + "type": "text", + }, ], "name": "dart_frog_new", "description": "A dart frog brick to create routes and middleware", @@ -136,26 +136,26 @@ final dartFrogNewBundle = MasonBundle.fromJson({ "path": "README.md", "data": "IyBkYXJ0X2Zyb2dfbmV3CgpbIVtQb3dlcmVkIGJ5IE1hc29uXShodHRwczovL2ltZy5zaGllbGRzLmlvL2VuZHBvaW50P3VybD1odHRwcyUzQSUyRiUyRnRpbnl1cmwuY29tJTJGbWFzb24tYmFkZ2UpXShodHRwczovL2dpdGh1Yi5jb20vZmVsYW5nZWwvbWFzb24pCgpBIGRhcnQgZnJvZyBicmljayB0byBjcmVhdGUgcm91dGVzIGFuZCBtaWRkbGV3YXJlLgoKX0dlbmVyYXRlZCBieSBbbWFzb25dWzFdIPCfp7FfCgpbMV06IGh0dHBzOi8vZ2l0aHViLmNvbS9mZWxhbmdlbC9tYXNvbgo=", - "type": "text" + "type": "text", }, "license": { "path": "LICENSE", "data": "TUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgMjAyMyBWZXJ5IEdvb2QgVmVudHVyZXMKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCg==", - "type": "text" + "type": "text", }, "vars": { "route_path": { "type": "string", "description": "The path for the desired route", - "prompt": "What is the path for the desired route?" + "prompt": "What is the path for the desired route?", }, "type": { "type": "enum", "description": "Whether to create a route or a middleware", "default": "route", "prompt": "Want to create a route or a middleware?", - "values": ["route", "middleware"] - } - } + "values": ["route", "middleware"], + }, + }, }); diff --git a/packages/dart_frog_cli/lib/src/commands/uninstall/uninstall.dart b/packages/dart_frog_cli/lib/src/commands/uninstall/uninstall.dart index 860a968e5..05af5bc91 100644 --- a/packages/dart_frog_cli/lib/src/commands/uninstall/uninstall.dart +++ b/packages/dart_frog_cli/lib/src/commands/uninstall/uninstall.dart @@ -8,9 +8,7 @@ import 'package:mason/mason.dart' hide packageVersion; /// {@endtemplate} class UninstallCommand extends Command { /// {@macro uninstall_command} - UninstallCommand({ - required Logger logger, - }) : _logger = logger; + UninstallCommand({required Logger logger}) : _logger = logger; final Logger _logger; diff --git a/packages/dart_frog_cli/lib/src/commands/update/update.dart b/packages/dart_frog_cli/lib/src/commands/update/update.dart index c1c2c115f..e1d8cbc9b 100644 --- a/packages/dart_frog_cli/lib/src/commands/update/update.dart +++ b/packages/dart_frog_cli/lib/src/commands/update/update.dart @@ -11,11 +11,9 @@ import 'package:pub_updater/pub_updater.dart'; /// {@endtemplate} class UpdateCommand extends DartFrogCommand { /// {@macro update_command} - UpdateCommand({ - required Logger logger, - PubUpdater? pubUpdater, - }) : _logger = logger, - _pubUpdater = pubUpdater ?? PubUpdater() { + UpdateCommand({required Logger logger, PubUpdater? pubUpdater}) + : _logger = logger, + _pubUpdater = pubUpdater ?? PubUpdater() { argParser.addFlag( 'verify-only', help: 'Check if an update is available, without committing to update.', diff --git a/packages/dart_frog_cli/lib/src/daemon/connection.dart b/packages/dart_frog_cli/lib/src/daemon/connection.dart index 1c4bad2ca..242cccebb 100644 --- a/packages/dart_frog_cli/lib/src/daemon/connection.dart +++ b/packages/dart_frog_cli/lib/src/daemon/connection.dart @@ -35,8 +35,8 @@ class DaemonStdioConnection implements DaemonConnection { DaemonStdioConnection({ @visibleForTesting StreamSink>? testStdout, @visibleForTesting Stream>? testStdin, - }) : _stdout = testStdout ?? stdout, - _stdin = testStdin ?? stdin { + }) : _stdout = testStdout ?? stdout, + _stdin = testStdin ?? stdin { _outputStreamController.stream.listen((message) { final json = jsonEncode(message.toJson()); _stdout.add(utf8.encode('[$json]\n')); diff --git a/packages/dart_frog_cli/lib/src/daemon/daemon_server.dart b/packages/dart_frog_cli/lib/src/daemon/daemon_server.dart index f1c3f4622..bf6cf1f12 100644 --- a/packages/dart_frog_cli/lib/src/daemon/daemon_server.dart +++ b/packages/dart_frog_cli/lib/src/daemon/daemon_server.dart @@ -22,9 +22,8 @@ const daemonVersion = '0.0.1'; /// {@endtemplate} class DaemonServer { /// {@macro daemon} - DaemonServer({ - @visibleForTesting DaemonConnection? connection, - }) : _connection = connection ?? DaemonStdioConnection() { + DaemonServer({@visibleForTesting DaemonConnection? connection}) + : _connection = connection ?? DaemonStdioConnection() { _connection.inputStream.listen(_handleMessage); addDomain(DaemonDomain(this)); @@ -77,9 +76,7 @@ class DaemonServer { return _sendMessage( DaemonResponse.error( id: request.id, - error: { - 'message': 'Invalid domain: ${request.domain}', - }, + error: {'message': 'Invalid domain: ${request.domain}'}, ), ); } diff --git a/packages/dart_frog_cli/lib/src/daemon/domain/daemon_domain.dart b/packages/dart_frog_cli/lib/src/daemon/domain/daemon_domain.dart index 84702a892..1fba4a472 100644 --- a/packages/dart_frog_cli/lib/src/daemon/domain/daemon_domain.dart +++ b/packages/dart_frog_cli/lib/src/daemon/domain/daemon_domain.dart @@ -11,10 +11,7 @@ import 'package:meta/meta.dart'; /// {@endtemplate} class DaemonDomain extends DomainBase { /// {@macro daemon_domain} - DaemonDomain( - super.daemon, { - @visibleForTesting int? processId, - }) { + DaemonDomain(super.daemon, {@visibleForTesting int? processId}) { addHandler('requestVersion', _requestVersion); addHandler('kill', _kill); @@ -22,10 +19,7 @@ class DaemonDomain extends DomainBase { DaemonEvent( domain: domainName, event: 'ready', - params: { - 'version': daemon.version, - 'processId': processId ?? pid, - }, + params: {'version': daemon.version, 'processId': processId ?? pid}, ), ); } @@ -40,9 +34,7 @@ class DaemonDomain extends DomainBase { Future _requestVersion(DaemonRequest request) async { return DaemonResponse.success( id: request.id, - result: { - 'version': daemon.version, - }, + result: {'version': daemon.version}, ); } @@ -51,9 +43,7 @@ class DaemonDomain extends DomainBase { daemon.kill(ExitCode.success).ignore(); return DaemonResponse.success( id: request.id, - result: const { - 'message': 'Hogarth. You stay, I go. No following.', - }, + result: const {'message': 'Hogarth. You stay, I go. No following.'}, ); } diff --git a/packages/dart_frog_cli/lib/src/daemon/domain/dev_server_domain.dart b/packages/dart_frog_cli/lib/src/daemon/domain/dev_server_domain.dart index d9b9e2dd6..74658598a 100644 --- a/packages/dart_frog_cli/lib/src/daemon/domain/dev_server_domain.dart +++ b/packages/dart_frog_cli/lib/src/daemon/domain/dev_server_domain.dart @@ -18,9 +18,9 @@ class DevServerDomain extends DomainBase { @visibleForTesting super.getId, @visibleForTesting GeneratorBuilder? generator, @visibleForTesting DevServerRunnerConstructor? devServerRunnerConstructor, - }) : _generator = generator ?? MasonGenerator.fromBundle, - _devServerRunnerConstructor = - devServerRunnerConstructor ?? DevServerRunner.new { + }) : _generator = generator ?? MasonGenerator.fromBundle, + _devServerRunnerConstructor = + devServerRunnerConstructor ?? DevServerRunner.new { addHandler('start', _start); addHandler('reload', _reload); addHandler('stop', _stop); @@ -50,10 +50,7 @@ class DevServerDomain extends DomainBase { DaemonEvent( domain: domainName, event: 'applicationStarting', - params: { - 'applicationId': applicationId, - 'requestId': request.id, - }, + params: {'applicationId': applicationId, 'requestId': request.id}, ), ); @@ -111,17 +108,12 @@ class DevServerDomain extends DomainBase { return DaemonResponse.success( id: request.id, - result: { - 'applicationId': applicationId, - }, + result: {'applicationId': applicationId}, ); } catch (e) { return DaemonResponse.error( id: request.id, - error: { - 'applicationId': applicationId, - 'message': e.toString(), - }, + error: {'applicationId': applicationId, 'message': e.toString()}, ); } } @@ -145,17 +137,12 @@ class DevServerDomain extends DomainBase { return DaemonResponse.success( id: request.id, - result: { - 'applicationId': applicationId, - }, + result: {'applicationId': applicationId}, ); } catch (e) { return DaemonResponse.error( id: request.id, - error: { - 'applicationId': applicationId, - 'message': e.toString(), - }, + error: {'applicationId': applicationId, 'message': e.toString()}, ); } } @@ -181,10 +168,7 @@ class DevServerDomain extends DomainBase { return DaemonResponse.success( id: request.id, - result: { - 'applicationId': applicationId, - 'exitCode': exitCode.code, - }, + result: {'applicationId': applicationId, 'exitCode': exitCode.code}, ); } catch (e) { if (!runner.isCompleted) { diff --git a/packages/dart_frog_cli/lib/src/daemon/domain/domain_base.dart b/packages/dart_frog_cli/lib/src/daemon/domain/domain_base.dart index fe6e66d3b..297077465 100644 --- a/packages/dart_frog_cli/lib/src/daemon/domain/domain_base.dart +++ b/packages/dart_frog_cli/lib/src/daemon/domain/domain_base.dart @@ -5,9 +5,8 @@ import 'package:meta/meta.dart'; import 'package:uuid/uuid.dart'; /// Type definition for a daemon method which handles a [DaemonRequest]. -typedef DomainRequestHandler = Future Function( - DaemonRequest request, -); +typedef DomainRequestHandler = + Future Function(DaemonRequest request); const Uuid _uuidGenerator = Uuid(); @@ -18,10 +17,8 @@ String _defaultIdGenerator() => _uuidGenerator.v4(); /// {@endtemplate} abstract class DomainBase { /// {@macro domain} - DomainBase( - this.daemon, { - @visibleForTesting String Function()? getId, - }) : getId = getId ?? _defaultIdGenerator; + DomainBase(this.daemon, {@visibleForTesting String Function()? getId}) + : getId = getId ?? _defaultIdGenerator; final Map _handlers = {}; @@ -51,9 +48,7 @@ abstract class DomainBase { if (handler == null) { return DaemonResponse.error( id: request.id, - error: { - 'message': 'Method not found: ${request.method}', - }, + error: {'message': 'Method not found: ${request.method}'}, ); } try { @@ -61,9 +56,7 @@ abstract class DomainBase { } on DartFrogDaemonException catch (e) { return DaemonResponse.error( id: request.id, - error: { - 'message': e.message, - }, + error: {'message': e.message}, ); } } diff --git a/packages/dart_frog_cli/lib/src/daemon/domain/route_configuration_domain.dart b/packages/dart_frog_cli/lib/src/daemon/domain/route_configuration_domain.dart index 131eb2d0d..3943e885f 100644 --- a/packages/dart_frog_cli/lib/src/daemon/domain/route_configuration_domain.dart +++ b/packages/dart_frog_cli/lib/src/daemon/domain/route_configuration_domain.dart @@ -17,7 +17,7 @@ class RouteConfigurationDomain extends DomainBase { @visibleForTesting RouteConfigurationWatcherBuilder? routeConfigurationWatcherBuilder, }) : _routeConfigWatcherBuilder = - routeConfigurationWatcherBuilder ?? RouteConfigurationWatcher.new { + routeConfigurationWatcherBuilder ?? RouteConfigurationWatcher.new { addHandler('watcherStart', _watcherStart); addHandler( 'watcherGenerateRouteConfiguration', @@ -86,10 +86,7 @@ class RouteConfigurationDomain extends DomainBase { } catch (e) { return DaemonResponse.error( id: request.id, - error: { - 'watcherId': watcherId, - 'message': e.toString(), - }, + error: {'watcherId': watcherId, 'message': e.toString()}, ); } @@ -114,9 +111,7 @@ class RouteConfigurationDomain extends DomainBase { return DaemonResponse.success( id: request.id, - result: { - 'watcherId': watcherId, - }, + result: {'watcherId': watcherId}, ); } @@ -129,10 +124,7 @@ class RouteConfigurationDomain extends DomainBase { if (watcher == null) { return DaemonResponse.error( id: request.id, - error: { - 'watcherId': watcherId, - 'message': 'Watcher not found', - }, + error: {'watcherId': watcherId, 'message': 'Watcher not found'}, ); } @@ -164,10 +156,7 @@ class RouteConfigurationDomain extends DomainBase { if (watcher == null) { return DaemonResponse.error( id: request.id, - error: { - 'watcherId': watcherId, - 'message': 'Watcher not found', - }, + error: {'watcherId': watcherId, 'message': 'Watcher not found'}, ); } @@ -178,10 +167,7 @@ class RouteConfigurationDomain extends DomainBase { return DaemonResponse.success( id: request.id, - result: { - 'watcherId': watcherId, - 'exitCode': exitCode.code, - }, + result: {'watcherId': watcherId, 'exitCode': exitCode.code}, ); } catch (e) { if (!watcher.isCompleted) { diff --git a/packages/dart_frog_cli/lib/src/daemon/exceptions.dart b/packages/dart_frog_cli/lib/src/daemon/exceptions.dart index 207966766..3e803feed 100644 --- a/packages/dart_frog_cli/lib/src/daemon/exceptions.dart +++ b/packages/dart_frog_cli/lib/src/daemon/exceptions.dart @@ -25,7 +25,7 @@ class DartFrogDaemonMalformedMessageException extends DartFrogDaemonMessageException { /// {@macro dart_frog_daemon_malformed_message_exception} const DartFrogDaemonMalformedMessageException(String message) - : super('Malformed message, $message'); + : super('Malformed message, $message'); } /// {@template dart_frog_daemon_missing_parameter_exception} @@ -36,5 +36,5 @@ class DartFrogDaemonMissingParameterException extends DartFrogDaemonMessageException { /// {@macro dart_frog_daemon_malformed_message_exception} const DartFrogDaemonMissingParameterException(String message) - : super('Missing parameter, $message'); + : super('Missing parameter, $message'); } diff --git a/packages/dart_frog_cli/lib/src/daemon/logger.dart b/packages/dart_frog_cli/lib/src/daemon/logger.dart index 92e01a672..7573512c7 100644 --- a/packages/dart_frog_cli/lib/src/daemon/logger.dart +++ b/packages/dart_frog_cli/lib/src/daemon/logger.dart @@ -48,10 +48,7 @@ class DaemonLogger implements Logger { DaemonEvent( domain: domain, event: 'loggerAlert', - params: { - ...params, - 'message': message ?? '', - }, + params: {...params, 'message': message ?? ''}, ), ); } @@ -65,10 +62,7 @@ class DaemonLogger implements Logger { DaemonEvent( domain: domain, event: 'loggerDetail', - params: { - ...params, - 'message': message ?? '', - }, + params: {...params, 'message': message ?? ''}, ), ); } @@ -79,10 +73,7 @@ class DaemonLogger implements Logger { DaemonEvent( domain: domain, event: 'loggerError', - params: { - ...params, - 'message': message ?? '', - }, + params: {...params, 'message': message ?? ''}, ), ); } @@ -102,10 +93,7 @@ class DaemonLogger implements Logger { DaemonEvent( domain: domain, event: 'loggerInfo', - params: { - ...params, - 'message': message ?? '', - }, + params: {...params, 'message': message ?? ''}, ), ); } @@ -127,10 +115,7 @@ class DaemonLogger implements Logger { DaemonEvent( domain: domain, event: 'loggerSuccess', - params: { - ...params, - 'message': message ?? '', - }, + params: {...params, 'message': message ?? ''}, ), ); } @@ -141,10 +126,7 @@ class DaemonLogger implements Logger { DaemonEvent( domain: domain, event: 'loggerWarning', - params: { - ...params, - 'message': message ?? '', - }, + params: {...params, 'message': message ?? ''}, ), ); } @@ -155,10 +137,7 @@ class DaemonLogger implements Logger { DaemonEvent( domain: domain, event: 'loggerWrite', - params: { - ...params, - 'message': message ?? '', - }, + params: {...params, 'message': message ?? ''}, ), ); } @@ -216,11 +195,7 @@ class DaemonProgress implements Progress { DaemonEvent( domain: domain, event: 'progressStart', - params: { - ...params, - 'progressMessage': message, - 'progressId': id, - }, + params: {...params, 'progressMessage': message, 'progressId': id}, ), ); } @@ -246,11 +221,7 @@ class DaemonProgress implements Progress { DaemonEvent( domain: domain, event: 'progressCancel', - params: { - ...params, - 'progressMessage': message, - 'progressId': id, - }, + params: {...params, 'progressMessage': message, 'progressId': id}, ), ); } @@ -262,11 +233,7 @@ class DaemonProgress implements Progress { DaemonEvent( domain: domain, event: 'progressComplete', - params: { - ...params, - 'progressMessage': message, - 'progressId': id, - }, + params: {...params, 'progressMessage': message, 'progressId': id}, ), ); } @@ -278,11 +245,7 @@ class DaemonProgress implements Progress { DaemonEvent( domain: domain, event: 'progressFail', - params: { - ...params, - 'progressMessage': message, - 'progressId': id, - }, + params: {...params, 'progressMessage': message, 'progressId': id}, ), ); } @@ -294,11 +257,7 @@ class DaemonProgress implements Progress { DaemonEvent( domain: domain, event: 'progressUpdate', - params: { - ...params, - 'progressMessage': message, - 'progressId': id, - }, + params: {...params, 'progressMessage': message, 'progressId': id}, ), ); } diff --git a/packages/dart_frog_cli/lib/src/daemon/protocol.dart b/packages/dart_frog_cli/lib/src/daemon/protocol.dart index ab3f52896..825029f96 100644 --- a/packages/dart_frog_cli/lib/src/daemon/protocol.dart +++ b/packages/dart_frog_cli/lib/src/daemon/protocol.dart @@ -147,13 +147,9 @@ class DaemonRequest extends DaemonMessage { if (param is! T) { // Check if param type is optional or not if (param == null && null is! T) { - throw DartFrogDaemonMissingParameterException( - '$name not found', - ); + throw DartFrogDaemonMissingParameterException('$name not found'); } - throw DartFrogDaemonMalformedMessageException( - 'invalid $name', - ); + throw DartFrogDaemonMalformedMessageException('invalid $name'); } return param; @@ -174,21 +170,13 @@ class DaemonResponse extends DaemonMessage { const DaemonResponse.success({ required String id, required Map result, - }) : this._( - id: id, - result: result, - error: null, - ); + }) : this._(id: id, result: result, error: null); /// Creates an error [DaemonResponse]. const DaemonResponse.error({ required String id, required Map error, - }) : this._( - id: id, - result: null, - error: error, - ); + }) : this._(id: id, result: null, error: error); /// Creates a [DaemonResponse] from a [rawMessage] json. factory DaemonResponse.fromJson(Map rawMessage) { @@ -213,11 +201,7 @@ class DaemonResponse extends DaemonMessage { ); } - return DaemonResponse._( - id: id, - result: result, - error: error, - ); + return DaemonResponse._(id: id, result: result, error: error); } /// Whether this response is a success. @@ -250,11 +234,7 @@ class DaemonResponse extends DaemonMessage { /// {@endtemplate} class DaemonEvent extends DaemonMessage { /// {@macro daemon_event} - const DaemonEvent({ - required this.domain, - required this.event, - this.params, - }); + const DaemonEvent({required this.domain, required this.event, this.params}); /// Creates a [DaemonEvent] from a [rawMessage] json. factory DaemonEvent.fromJson(Map rawMessage) { @@ -281,11 +261,7 @@ class DaemonEvent extends DaemonMessage { ); } - return DaemonEvent( - event: eventName, - domain: domainName, - params: params, - ); + return DaemonEvent(event: eventName, domain: domainName, params: params); } /// The name of the event. @@ -299,10 +275,7 @@ class DaemonEvent extends DaemonMessage { @override Map toJson() { - return { - 'event': '$domain.$event', - if (params != null) 'params': params, - }; + return {'event': '$domain.$event', if (params != null) 'params': params}; } @override diff --git a/packages/dart_frog_cli/lib/src/dev_server_runner/dev_server_runner.dart b/packages/dart_frog_cli/lib/src/dev_server_runner/dev_server_runner.dart index 313c9cad2..9a6c75927 100644 --- a/packages/dart_frog_cli/lib/src/dev_server_runner/dev_server_runner.dart +++ b/packages/dart_frog_cli/lib/src/dev_server_runner/dev_server_runner.dart @@ -11,22 +11,22 @@ import 'package:stream_transform/stream_transform.dart'; import 'package:watcher/watcher.dart'; /// Typedef for [io.Process.start]. -typedef ProcessStart = Future Function( - String executable, - List arguments, { - bool runInShell, -}); +typedef ProcessStart = + Future Function( + String executable, + List arguments, { + bool runInShell, + }); /// Typedef for [io.Process.run]. -typedef ProcessRun = Future Function( - String executable, - List arguments, -); +typedef ProcessRun = + Future Function( + String executable, + List arguments, + ); /// Typedef for [DirectoryWatcher.new]. -typedef DirectoryWatcherBuilder = DirectoryWatcher Function( - String directory, -); +typedef DirectoryWatcherBuilder = DirectoryWatcher Function(String directory); /// Regex for detecting warnings in the output of `dart run`. final _warningRegex = RegExp(r'^.*:\d+:\d+: Warning: .*', multiLine: true); @@ -39,15 +39,16 @@ final _dartVmServiceAlreadyInUseErrorRegex = RegExp( ); /// Typedef for [DevServerRunner.new]. -typedef DevServerRunnerConstructor = DevServerRunner Function({ - required Logger logger, - required String port, - required io.InternetAddress? address, - required MasonGenerator devServerBundleGenerator, - required String dartVmServicePort, - required io.Directory workingDirectory, - void Function()? onHotReloadEnabled, -}); +typedef DevServerRunnerConstructor = + DevServerRunner Function({ + required Logger logger, + required String port, + required io.InternetAddress? address, + required MasonGenerator devServerBundleGenerator, + required String dartVmServicePort, + required io.Directory workingDirectory, + void Function()? onHotReloadEnabled, + }); /// {@template dev_server_runner} /// A class that manages a local development server process lifecycle. @@ -81,20 +82,20 @@ class DevServerRunner { @visibleForTesting ProcessRun? runProcess, @visibleForTesting RuntimeCompatibilityCallback? runtimeCompatibilityCallback, - }) : _directoryWatcher = directoryWatcher ?? DirectoryWatcher.new, - _isWindows = isWindows ?? io.Platform.isWindows, - _sigint = sigint ?? io.ProcessSignal.sigint, - _startProcess = startProcess ?? io.Process.start, - _runProcess = runProcess ?? io.Process.run, - _generatorTarget = - generatorTarget ?? RestorableDirectoryGeneratorTarget.new, - _ensureRuntimeCompatibility = - runtimeCompatibilityCallback ?? ensureRuntimeCompatibility, - assert(port.isNotEmpty, 'port cannot be empty'), - assert( - dartVmServicePort.isNotEmpty, - 'dartVmServicePort cannot be empty', - ); + }) : _directoryWatcher = directoryWatcher ?? DirectoryWatcher.new, + _isWindows = isWindows ?? io.Platform.isWindows, + _sigint = sigint ?? io.ProcessSignal.sigint, + _startProcess = startProcess ?? io.Process.start, + _runProcess = runProcess ?? io.Process.run, + _generatorTarget = + generatorTarget ?? RestorableDirectoryGeneratorTarget.new, + _ensureRuntimeCompatibility = + runtimeCompatibilityCallback ?? ensureRuntimeCompatibility, + assert(port.isNotEmpty, 'port cannot be empty'), + assert( + dartVmServicePort.isNotEmpty, + 'dartVmServicePort cannot be empty', + ); /// [Logger] instance used to wrap stdout. final Logger logger; @@ -270,16 +271,13 @@ class DevServerRunner { '''[process] dart $enableVmServiceFlag $serverDartFilePath ${arguments.join(' ')}''', ); - final process = _serverProcess = await _startProcess( - 'dart', - [ - enableVmServiceFlag, - '--enable-asserts', - ...arguments, - serverDartFilePath, - ], - runInShell: true, - ); + final process = + _serverProcess = await _startProcess('dart', [ + enableVmServiceFlag, + '--enable-asserts', + ...arguments, + serverDartFilePath, + ], runInShell: true); // On Windows listen for CTRL-C and use taskkill to kill // the spawned process along with any child processes. @@ -381,13 +379,17 @@ class DevServerRunner { .debounce(Duration.zero) .listen((_) => _reload()); - _watcherSubscription!.asFuture().then((_) async { - await _cancelWatcherSubscription(); - await stop(); - }).catchError((_) async { - await _cancelWatcherSubscription(); - await stop(ExitCode.software); - }).ignore(); + _watcherSubscription! + .asFuture() + .then((_) async { + await _cancelWatcherSubscription(); + await stop(); + }) + .catchError((_) async { + await _cancelWatcherSubscription(); + await stop(ExitCode.software); + }) + .ignore(); } /// Stops the development server and the watcher then diff --git a/packages/dart_frog_cli/lib/src/dev_server_runner/restorable_directory_generator_target.dart b/packages/dart_frog_cli/lib/src/dev_server_runner/restorable_directory_generator_target.dart index 9a3fa9ce6..24044391d 100644 --- a/packages/dart_frog_cli/lib/src/dev_server_runner/restorable_directory_generator_target.dart +++ b/packages/dart_frog_cli/lib/src/dev_server_runner/restorable_directory_generator_target.dart @@ -4,20 +4,21 @@ import 'dart:io' as io; import 'package:mason/mason.dart'; /// Signature for the [DirectoryGeneratorTarget.createFile] method. -typedef CreateFile = Future Function( - String path, - List contents, { - Logger? logger, - OverwriteRule? overwriteRule, -}); +typedef CreateFile = + Future Function( + String path, + List contents, { + Logger? logger, + OverwriteRule? overwriteRule, + }); /// Typedef for [RestorableDirectoryGeneratorTarget.new] -typedef RestorableDirectoryGeneratorTargetBuilder - = RestorableDirectoryGeneratorTarget Function( - io.Directory dir, { - CreateFile? createFile, - Logger? logger, -}); +typedef RestorableDirectoryGeneratorTargetBuilder = + RestorableDirectoryGeneratorTarget Function( + io.Directory dir, { + CreateFile? createFile, + Logger? logger, + }); /// {@template cached_file} /// A cached file which consists of the file path and contents. @@ -43,9 +44,9 @@ class RestorableDirectoryGeneratorTarget extends DirectoryGeneratorTarget { super.dir, { CreateFile? createFile, Logger? logger, - }) : _cachedSnapshots = Queue(), - _createFile = createFile, - _logger = logger; + }) : _cachedSnapshots = Queue(), + _createFile = createFile, + _logger = logger; final CreateFile? _createFile; final Logger? _logger; diff --git a/packages/dart_frog_cli/lib/src/prod_server_builder/prod_server_builder.dart b/packages/dart_frog_cli/lib/src/prod_server_builder/prod_server_builder.dart index 34c5d387f..90c58e59b 100644 --- a/packages/dart_frog_cli/lib/src/prod_server_builder/prod_server_builder.dart +++ b/packages/dart_frog_cli/lib/src/prod_server_builder/prod_server_builder.dart @@ -5,12 +5,13 @@ import 'package:mason/mason.dart'; import 'package:meta/meta.dart'; /// Typedef for [ProdServerBuilder.new]. -typedef ProdServerBuilderConstructor = ProdServerBuilder Function({ - required Logger logger, - required String dartVersion, - required io.Directory workingDirectory, - required MasonGenerator prodServerBundleGenerator, -}); +typedef ProdServerBuilderConstructor = + ProdServerBuilder Function({ + required Logger logger, + required String dartVersion, + required io.Directory workingDirectory, + required MasonGenerator prodServerBundleGenerator, + }); /// {@template prod_server_builder} /// A class that builds the production server runtime code. @@ -31,7 +32,7 @@ class ProdServerBuilder { @visibleForTesting RuntimeCompatibilityCallback? runtimeCompatibilityCallback, }) : _ensureRuntimeCompatibility = - runtimeCompatibilityCallback ?? ensureRuntimeCompatibility; + runtimeCompatibilityCallback ?? ensureRuntimeCompatibility; /// The Dart SDK version used to build the Dockerfile. final String dartVersion; @@ -51,9 +52,7 @@ class ProdServerBuilder { Future build() async { _ensureRuntimeCompatibility(workingDirectory); - var vars = { - 'dartVersion': dartVersion, - }; + var vars = {'dartVersion': dartVersion}; logger.detail('[codegen] running pre-gen...'); await prodServerBundleGenerator.hooks.preGen( diff --git a/packages/dart_frog_cli/lib/src/route_configuration_watcher/route_configuration_watcher.dart b/packages/dart_frog_cli/lib/src/route_configuration_watcher/route_configuration_watcher.dart index 32b4bb55a..484be8f3d 100644 --- a/packages/dart_frog_cli/lib/src/route_configuration_watcher/route_configuration_watcher.dart +++ b/packages/dart_frog_cli/lib/src/route_configuration_watcher/route_configuration_watcher.dart @@ -9,26 +9,23 @@ import 'package:stream_transform/stream_transform.dart'; import 'package:watcher/watcher.dart'; /// Typedef for [DirectoryWatcher.new]. -typedef DirectoryWatcherBuilder = DirectoryWatcher Function( - String directory, -); +typedef DirectoryWatcherBuilder = DirectoryWatcher Function(String directory); /// Typedef for [RouteConfiguration] change callbacks. -typedef RouteConfigurationChanged = void Function( - RouteConfiguration routeConfiguration, -); +typedef RouteConfigurationChanged = + void Function(RouteConfiguration routeConfiguration); /// Typedef for [RouteConfigurationWatcher.new]. -typedef RouteConfigurationWatcherBuilder = RouteConfigurationWatcher Function({ - required Logger logger, - required io.Directory workingDirectory, - required RouteConfigurationChanged onRouteConfigurationChanged, -}); +typedef RouteConfigurationWatcherBuilder = + RouteConfigurationWatcher Function({ + required Logger logger, + required io.Directory workingDirectory, + required RouteConfigurationChanged onRouteConfigurationChanged, + }); /// Typedef for [buildRouteConfiguration] -typedef RouteConfigurationBuilder = RouteConfiguration Function( - io.Directory directory, -); +typedef RouteConfigurationBuilder = + RouteConfiguration Function(io.Directory directory); /// {@template route_configuration_watcher} /// Monitors a dart frog project for changes on its route configuration. @@ -41,9 +38,9 @@ class RouteConfigurationWatcher { required this.onRouteConfigurationChanged, @visibleForTesting DirectoryWatcherBuilder? directoryWatcher, @visibleForTesting RouteConfigurationBuilder? routeConfigurationBuilder, - }) : _directoryWatcher = directoryWatcher ?? DirectoryWatcher.new, - _routeConfigurationBuilder = - routeConfigurationBuilder ?? buildRouteConfiguration; + }) : _directoryWatcher = directoryWatcher ?? DirectoryWatcher.new, + _routeConfigurationBuilder = + routeConfigurationBuilder ?? buildRouteConfiguration; /// [Logger] instance used to wrap stdout. final Logger logger; diff --git a/packages/dart_frog_cli/test/src/command_runner_test.dart b/packages/dart_frog_cli/test/src/command_runner_test.dart index dd440435a..6662b60cf 100644 --- a/packages/dart_frog_cli/test/src/command_runner_test.dart +++ b/packages/dart_frog_cli/test/src/command_runner_test.dart @@ -39,7 +39,7 @@ const expectedUsage = [ ' uninstall Explains how to uninstall the Dart Frog CLI.\n' ' update Update the Dart Frog CLI.\n' '\n' - 'Run "dart_frog help " for more information about a command.' + 'Run "dart_frog help " for more information about a command.', ]; const latestVersion = '0.0.0'; @@ -102,12 +102,9 @@ void main() { ); // The message should contain the invalid option name but is // differet based on the platform it's running on. - final containsInvalidOption = message.contains( - '"invalid-option"', - ) || - message.contains( - '"--invalid-option"', - ); + final containsInvalidOption = + message.contains('"invalid-option"') || + message.contains('"--invalid-option"'); final containsUsage = message.contains( 'Usage: dart_frog [arguments]', ); @@ -175,19 +172,16 @@ void main() { }), ); - test( - 'does not show update message when the shell calls the ' - 'completion command', - () async { - when( - () => pubUpdater.getLatestVersion(any()), - ).thenAnswer((_) async => latestVersion); - - final result = await commandRunner.run(['completion']); - expect(result, equals(ExitCode.success.code)); - verifyNever(() => logger.info(updateMessage)); - }, - ); + test('does not show update message when the shell calls the ' + 'completion command', () async { + when( + () => pubUpdater.getLatestVersion(any()), + ).thenAnswer((_) async => latestVersion); + + final result = await commandRunner.run(['completion']); + expect(result, equals(ExitCode.success.code)); + verifyNever(() => logger.info(updateMessage)); + }); group('--help', () { test( diff --git a/packages/dart_frog_cli/test/src/commands/build/build_test.dart b/packages/dart_frog_cli/test/src/commands/build/build_test.dart index 3a5aa3f79..aa86c0433 100644 --- a/packages/dart_frog_cli/test/src/commands/build/build_test.dart +++ b/packages/dart_frog_cli/test/src/commands/build/build_test.dart @@ -40,10 +40,7 @@ void main() { }); test('can be instantiated', () { - expect( - BuildCommand(logger: logger), - isNotNull, - ); + expect(BuildCommand(logger: logger), isNotNull); }); test('passes the correct params to the builder', () async { @@ -51,25 +48,27 @@ void main() { late Directory givenWorkingDirectory; late MasonGenerator givenProdServerBundleGenerator; - final command = BuildCommand( - logger: logger, - generator: (_) async => generator, - prodServerBuilderConstructor: ({ - required Logger logger, - required String dartVersion, - required Directory workingDirectory, - required MasonGenerator prodServerBundleGenerator, - }) { - givenDartVersion = dartVersion; - givenWorkingDirectory = workingDirectory; - givenProdServerBundleGenerator = prodServerBundleGenerator; - return builder; - }, - ) - ..testArgResults = argResults - ..testCwd = cwd; - when(() => builder.build()) - .thenAnswer((_) => Future.value(ExitCode.tempFail)); + final command = + BuildCommand( + logger: logger, + generator: (_) async => generator, + prodServerBuilderConstructor: ({ + required Logger logger, + required String dartVersion, + required Directory workingDirectory, + required MasonGenerator prodServerBundleGenerator, + }) { + givenDartVersion = dartVersion; + givenWorkingDirectory = workingDirectory; + givenProdServerBundleGenerator = prodServerBundleGenerator; + return builder; + }, + ) + ..testArgResults = argResults + ..testCwd = cwd; + when( + () => builder.build(), + ).thenAnswer((_) => Future.value(ExitCode.tempFail)); await expectLater(command.run(), completion(ExitCode.tempFail.code)); @@ -81,19 +80,20 @@ void main() { }); test('returns software error if the builder throws', () { - final command = BuildCommand( - logger: logger, - generator: (_) async => generator, - prodServerBuilderConstructor: ({ - required Logger logger, - required String dartVersion, - required Directory workingDirectory, - required MasonGenerator prodServerBundleGenerator, - }) => - builder, - ) - ..testArgResults = argResults - ..testCwd = cwd; + final command = + BuildCommand( + logger: logger, + generator: (_) async => generator, + prodServerBuilderConstructor: + ({ + required Logger logger, + required String dartVersion, + required Directory workingDirectory, + required MasonGenerator prodServerBundleGenerator, + }) => builder, + ) + ..testArgResults = argResults + ..testCwd = cwd; when(() => builder.build()).thenThrow(Exception()); expect(command.run(), completion(ExitCode.software.code)); diff --git a/packages/dart_frog_cli/test/src/commands/create/create_test.dart b/packages/dart_frog_cli/test/src/commands/create/create_test.dart index 597ecccd0..ba72a03bb 100644 --- a/packages/dart_frog_cli/test/src/commands/create/create_test.dart +++ b/packages/dart_frog_cli/test/src/commands/create/create_test.dart @@ -38,12 +38,10 @@ void main() { progress = _MockProgress(); when(() => logger.progress(any())).thenReturn(progress); generator = _MockMasonGenerator(); - command = CreateCommand( - logger: logger, - generator: (_) async => generator, - ) - ..testArgResults = argResults - ..testUsage = 'test usage'; + command = + CreateCommand(logger: logger, generator: (_) async => generator) + ..testArgResults = argResults + ..testUsage = 'test usage'; }); test('throws UsageException when args is empty.', () async { diff --git a/packages/dart_frog_cli/test/src/commands/daemon/daemon_test.dart b/packages/dart_frog_cli/test/src/commands/daemon/daemon_test.dart index 8591cbf59..646757f50 100644 --- a/packages/dart_frog_cli/test/src/commands/daemon/daemon_test.dart +++ b/packages/dart_frog_cli/test/src/commands/daemon/daemon_test.dart @@ -28,7 +28,7 @@ const expectedUsage = [ 'Usage: dart_frog daemon [arguments]\n' '-h, --help Print this usage information.\n' '\n' - 'Run "dart_frog help" to see global options.' + 'Run "dart_frog help" to see global options.', ]; void main() { @@ -75,12 +75,8 @@ void main() { () async { final daemonServer = _MockDaemonServer(); final completer = Completer(); - when(() => daemonServer.exitCode).thenAnswer( - (_) => completer.future, - ); - final command = DaemonCommand( - daemonBuilder: () => daemonServer, - ); + when(() => daemonServer.exitCode).thenAnswer((_) => completer.future); + final command = DaemonCommand(daemonBuilder: () => daemonServer); final future = command.run(); verify(() => daemonServer.exitCode).called(1); completer.complete(ExitCode.success); diff --git a/packages/dart_frog_cli/test/src/commands/dev/dev_test.dart b/packages/dart_frog_cli/test/src/commands/dev/dev_test.dart index 0edfe8b56..69f697064 100644 --- a/packages/dart_frog_cli/test/src/commands/dev/dev_test.dart +++ b/packages/dart_frog_cli/test/src/commands/dev/dev_test.dart @@ -34,8 +34,9 @@ void main() { stdin = _MockStdin(); when(() => argResults['port']).thenReturn('8080'); - when(() => argResults['dart-vm-service-port']) - .thenReturn('8181'); + when( + () => argResults['dart-vm-service-port'], + ).thenReturn('8181'); when(() => argResults.rest).thenReturn(['--enable-experiment=macros']); when(() => stdin.hasTerminal).thenReturn(false); }); @@ -47,9 +48,9 @@ void main() { test('run the dev server with the given parameters', () async { when(() => runner.start(any())).thenAnswer((_) => Future.value()); - when(() => runner.exitCode).thenAnswer( - (_) => Future.value(ExitCode.success), - ); + when( + () => runner.exitCode, + ).thenAnswer((_) => Future.value(ExitCode.success)); when(() => argResults['hostname']).thenReturn('192.168.1.2'); when(() => argResults['port']).thenReturn('1234'); @@ -65,30 +66,31 @@ void main() { late Directory givenWorkingDirectory; late void Function()? givenOnHotReloadEnabled; - final command = DevCommand( - generator: (_) async => generator, - devServerRunnerConstructor: ({ - required logger, - required port, - required address, - required devServerBundleGenerator, - required dartVmServicePort, - required workingDirectory, - void Function()? onHotReloadEnabled, - }) { - givenPort = port; - givenAddress = address; - givenDartVmServicePort = dartVmServicePort; - givenDevServerBundleGenerator = devServerBundleGenerator; - givenWorkingDirectory = workingDirectory; - givenOnHotReloadEnabled = onHotReloadEnabled; - return runner; - }, - logger: logger, - ) - ..testStdin = stdin - ..testArgResults = argResults - ..testCwd = cwd; + final command = + DevCommand( + generator: (_) async => generator, + devServerRunnerConstructor: ({ + required logger, + required port, + required address, + required devServerBundleGenerator, + required dartVmServicePort, + required workingDirectory, + void Function()? onHotReloadEnabled, + }) { + givenPort = port; + givenAddress = address; + givenDartVmServicePort = dartVmServicePort; + givenDevServerBundleGenerator = devServerBundleGenerator; + givenWorkingDirectory = workingDirectory; + givenOnHotReloadEnabled = onHotReloadEnabled; + return runner; + }, + logger: logger, + ) + ..testStdin = stdin + ..testArgResults = argResults + ..testCwd = cwd; await expectLater(command.run(), completion(ExitCode.success.code)); @@ -105,23 +107,24 @@ void main() { }); test('results with dev server exit code', () async { - final command = DevCommand( - generator: (_) async => generator, - devServerRunnerConstructor: ({ - required logger, - required port, - required address, - required devServerBundleGenerator, - required dartVmServicePort, - required workingDirectory, - void Function()? onHotReloadEnabled, - }) { - return runner; - }, - logger: logger, - ) - ..testArgResults = argResults - ..testStdin = stdin; + final command = + DevCommand( + generator: (_) async => generator, + devServerRunnerConstructor: ({ + required logger, + required port, + required address, + required devServerBundleGenerator, + required dartVmServicePort, + required workingDirectory, + void Function()? onHotReloadEnabled, + }) { + return runner; + }, + logger: logger, + ) + ..testArgResults = argResults + ..testStdin = stdin; when(() => runner.start(any())).thenAnswer((_) => Future.value()); when(() => runner.exitCode).thenAnswer((_) async => ExitCode.unavailable); @@ -130,23 +133,24 @@ void main() { }); test('fails if dev server runner fails on start', () async { - final command = DevCommand( - generator: (_) async => generator, - devServerRunnerConstructor: ({ - required logger, - required port, - required address, - required devServerBundleGenerator, - required dartVmServicePort, - required workingDirectory, - void Function()? onHotReloadEnabled, - }) { - return runner; - }, - logger: logger, - ) - ..testArgResults = argResults - ..testStdin = stdin; + final command = + DevCommand( + generator: (_) async => generator, + devServerRunnerConstructor: ({ + required logger, + required port, + required address, + required devServerBundleGenerator, + required dartVmServicePort, + required workingDirectory, + void Function()? onHotReloadEnabled, + }) { + return runner; + }, + logger: logger, + ) + ..testArgResults = argResults + ..testStdin = stdin; when(() => runner.start(any())).thenAnswer((_) async { throw DartFrogDevServerException('oops'); @@ -158,9 +162,9 @@ void main() { test('fails if hostname is invalid', () async { when(() => runner.start(any())).thenAnswer((_) => Future.value()); - when(() => runner.exitCode).thenAnswer( - (_) => Future.value(ExitCode.success), - ); + when( + () => runner.exitCode, + ).thenAnswer((_) => Future.value(ExitCode.success)); when(() => argResults['hostname']).thenReturn('ticarica'); when(() => argResults['port']).thenReturn('1234'); @@ -168,24 +172,25 @@ void main() { final cwd = Directory.systemTemp; - final command = DevCommand( - generator: (_) async => generator, - devServerRunnerConstructor: ({ - required logger, - required port, - required address, - required devServerBundleGenerator, - required dartVmServicePort, - required workingDirectory, - void Function()? onHotReloadEnabled, - }) { - return runner; - }, - logger: logger, - ) - ..testStdin = stdin - ..testArgResults = argResults - ..testCwd = cwd; + final command = + DevCommand( + generator: (_) async => generator, + devServerRunnerConstructor: ({ + required logger, + required port, + required address, + required devServerBundleGenerator, + required dartVmServicePort, + required workingDirectory, + void Function()? onHotReloadEnabled, + }) { + return runner; + }, + logger: logger, + ) + ..testStdin = stdin + ..testArgResults = argResults + ..testCwd = cwd; await expectLater(command.run(), completion(ExitCode.software.code)); @@ -235,28 +240,27 @@ void main() { when(() => runner.start(any())).thenAnswer((_) => Future.value()); when(() => runner.reload()).thenAnswer((_) => Future.value()); - when(() => runner.exitCode).thenAnswer( - (_) => exitCodeCompleter.future, - ); - - command = DevCommand( - generator: (_) async => generator, - devServerRunnerConstructor: ({ - required logger, - required port, - required address, - required devServerBundleGenerator, - required dartVmServicePort, - required workingDirectory, - void Function()? onHotReloadEnabled, - }) { - givenOnHotReloadEnabled = onHotReloadEnabled!; - return runner; - }, - logger: logger, - ) - ..testArgResults = argResults - ..testStdin = stdin; + when(() => runner.exitCode).thenAnswer((_) => exitCodeCompleter.future); + + command = + DevCommand( + generator: (_) async => generator, + devServerRunnerConstructor: ({ + required logger, + required port, + required address, + required devServerBundleGenerator, + required dartVmServicePort, + required workingDirectory, + void Function()? onHotReloadEnabled, + }) { + givenOnHotReloadEnabled = onHotReloadEnabled!; + return runner; + }, + logger: logger, + ) + ..testArgResults = argResults + ..testStdin = stdin; }); Future hotReloadTest(int asciiValue, String character) async { diff --git a/packages/dart_frog_cli/test/src/commands/list/list_test.dart b/packages/dart_frog_cli/test/src/commands/list/list_test.dart index 15cbdb4a1..5228d4ded 100644 --- a/packages/dart_frog_cli/test/src/commands/list/list_test.dart +++ b/packages/dart_frog_cli/test/src/commands/list/list_test.dart @@ -38,7 +38,7 @@ const expectedUsage = [ '-p, --plain Return the output in a plain format, printing each route ' 'on a new line.\n' '\n' - 'Run "dart_frog help" to see global options.' + 'Run "dart_frog help" to see global options.', ]; void main() { @@ -60,12 +60,13 @@ void main() { progress = _MockProgress(); routeConfiguration = _MockRouteConfiguration(); when(() => logger.progress(any())).thenReturn(progress); - command = ListCommand( - logger: logger, - buildConfiguration: (_) => routeConfiguration, - ) - ..testArgResults = argResults - ..testUsage = 'test usage'; + command = + ListCommand( + logger: logger, + buildConfiguration: (_) => routeConfiguration, + ) + ..testArgResults = argResults + ..testUsage = 'test usage'; when(() => argResults['plain']).thenReturn(false); @@ -93,20 +94,16 @@ void main() { ); test('logs all the endpoints', () async { - when(() => routeConfiguration.endpoints).thenReturn({ - '/turles/': [], - '/turles/random': [], - }); + when( + () => routeConfiguration.endpoints, + ).thenReturn({'/turles/': [], '/turles/random': []}); final directory = Directory.systemTemp.createTempSync(); command.testCwd = directory; when(() => argResults.rest).thenReturn(['my_project']); - await expectLater( - await command.run(), - equals(ExitCode.success.code), - ); + await expectLater(await command.run(), equals(ExitCode.success.code)); verify(() => logger.info('Route list 🐸:')).called(1); verify(() => logger.info('==============\n')).called(1); @@ -117,20 +114,16 @@ void main() { test('logs all the endpoints in plain mode', () async { when(() => argResults['plain']).thenReturn(true); - when(() => routeConfiguration.endpoints).thenReturn({ - '/turles/': [], - '/turles/random': [], - }); + when( + () => routeConfiguration.endpoints, + ).thenReturn({'/turles/': [], '/turles/random': []}); final directory = Directory.systemTemp.createTempSync(); command.testCwd = directory; when(() => argResults.rest).thenReturn(['my_project']); - await expectLater( - await command.run(), - equals(ExitCode.success.code), - ); + await expectLater(await command.run(), equals(ExitCode.success.code)); verifyNever(() => logger.info('Route list 🐸:')); verifyNever(() => logger.info('==============\n')); @@ -141,20 +134,16 @@ void main() { test( 'logs all the endpoints of the current dir when a project is ommited', () async { - when(() => routeConfiguration.endpoints).thenReturn({ - '/turles/': [], - '/turles/random': [], - }); + when( + () => routeConfiguration.endpoints, + ).thenReturn({'/turles/': [], '/turles/random': []}); final directory = Directory.systemTemp.createTempSync(); command.testCwd = directory; when(() => argResults.rest).thenReturn([]); - await expectLater( - await command.run(), - equals(ExitCode.success.code), - ); + await expectLater(await command.run(), equals(ExitCode.success.code)); verify(() => logger.info('Route list 🐸:')).called(1); verify(() => logger.info('==============\n')).called(1); diff --git a/packages/dart_frog_cli/test/src/commands/new/new_test.dart b/packages/dart_frog_cli/test/src/commands/new/new_test.dart index 23475c3fd..e9b69ab40 100644 --- a/packages/dart_frog_cli/test/src/commands/new/new_test.dart +++ b/packages/dart_frog_cli/test/src/commands/new/new_test.dart @@ -41,7 +41,7 @@ const expectedUsage = [ ' middleware Create a new middleware for dart_frog\n' ' route Create a new route for dart_frog\n' '\n' - 'Run "dart_frog help" to see global options.' + 'Run "dart_frog help" to see global options.', ]; void main() { @@ -63,14 +63,15 @@ void main() { progress = _MockProgress(); when(() => logger.progress(any())).thenReturn(progress); generator = _MockMasonGenerator(); - command = NewCommand( - logger: logger, - generator: (_) async { - return generator; - }, - ) - ..testArgResults = argResults - ..testUsage = 'test usage'; + command = + NewCommand( + logger: logger, + generator: (_) async { + return generator; + }, + ) + ..testArgResults = argResults + ..testUsage = 'test usage'; final sigint = _MockProcessSignal(); @@ -170,9 +171,7 @@ void main() { Directory('${directory.path}/routes').createSync(recursive: true); - when(() => argResults.rest).thenReturn( - ['user/[id]/🦅'], - ); + when(() => argResults.rest).thenReturn(['user/[id]/🦅']); command.newRouteCommand.testCwd = directory; @@ -217,9 +216,7 @@ void main() { Directory('${directory.path}/routes').createSync(recursive: true); - when(() => argResults.rest).thenReturn( - ['/user/[id]//route'], - ); + when(() => argResults.rest).thenReturn(['/user/[id]//route']); command.newRouteCommand.testCwd = directory; @@ -265,9 +262,7 @@ void main() { Directory('${directory.path}/routes').createSync(recursive: true); - when(() => argResults.rest).thenReturn( - [''], - ); + when(() => argResults.rest).thenReturn(['']); command.newRouteCommand.testCwd = directory; @@ -310,9 +305,9 @@ void main() { () => generator.generate(any(), vars: any(named: 'vars')), ).thenAnswer((_) async => []); - when(() => argResults.rest).thenReturn( - ['user/[id]/posts/[post_id]/comments'], - ); + when( + () => argResults.rest, + ).thenReturn(['user/[id]/posts/[post_id]/comments']); command.newRouteCommand.testCwd = directory; @@ -358,9 +353,9 @@ void main() { Directory('${directory.path}/routes').createSync(recursive: true); - when(() => argResults.rest).thenReturn( - ['user/[id]/posts/[post_id]/comments'], - ); + when( + () => argResults.rest, + ).thenReturn(['user/[id]/posts/[post_id]/comments']); command.newRouteCommand.testCwd = directory; @@ -382,8 +377,9 @@ void main() { logger: any(named: 'logger'), ), ).thenAnswer((invocation) async { - final onVarsChanged = invocation.namedArguments[#onVarsChanged] - as void Function(Map); + final onVarsChanged = + invocation.namedArguments[#onVarsChanged] + as void Function(Map); onVarsChanged({'dir_path': '${directory.path}/routes/something'}); }); @@ -404,9 +400,9 @@ void main() { Directory('${directory.path}/routes').createSync(recursive: true); - when(() => argResults.rest).thenReturn( - ['/user/[id]/posts/[post_id]/comments'], - ); + when( + () => argResults.rest, + ).thenReturn(['/user/[id]/posts/[post_id]/comments']); command.newRouteCommand.testCwd = directory; @@ -454,8 +450,9 @@ void main() { logger: any(named: 'logger'), ), ).thenAnswer((invocation) async { - final onVarsChanged = invocation.namedArguments[#onVarsChanged] - as void Function(Map); + final onVarsChanged = + invocation.namedArguments[#onVarsChanged] + as void Function(Map); onVarsChanged({'dir_path': '${directory.path}/routes/something'}); }); @@ -476,9 +473,9 @@ void main() { Directory('${directory.path}/routes').createSync(recursive: true); - when(() => argResults.rest).thenReturn( - ['user/[id]/posts/[post_id]/comments'], - ); + when( + () => argResults.rest, + ).thenReturn(['user/[id]/posts/[post_id]/comments']); command.newMiddlewareCommand.testCwd = directory; diff --git a/packages/dart_frog_cli/test/src/commands/update/update_test.dart b/packages/dart_frog_cli/test/src/commands/update/update_test.dart index 25533c2be..a26b76d57 100644 --- a/packages/dart_frog_cli/test/src/commands/update/update_test.dart +++ b/packages/dart_frog_cli/test/src/commands/update/update_test.dart @@ -33,7 +33,7 @@ const expectedUsage = [ ' --verify-only Check if an update is available, without ' 'committing to update.\n' '\n' - 'Run "dart_frog help" to see global options.' + 'Run "dart_frog help" to see global options.', ]; void main() { @@ -109,53 +109,46 @@ void main() { }); group('--verify-only', () { - test( - 'logs latest available version', - () async { - when( - () => pubUpdater.getLatestVersion(any()), - ).thenAnswer((_) async => latestVersion); - when(() => argResults['verify-only']).thenReturn(true); - - final result = await command.run(); - - expect(result, equals(ExitCode.success.code)); - verify( - () => logger.info('A new version of $packageName is available.\n'), - ).called(1); - verify( - () => logger.info( - styleBold.wrap('The latest version: $latestVersion'), - ), - ).called(1); - verify( - () => logger.info('Your current version: $packageVersion\n'), - ).called(1); - verify( - () => logger.info('To update now, run "$executableName update".'), - ).called(1); - }, - ); + test('logs latest available version', () async { + when( + () => pubUpdater.getLatestVersion(any()), + ).thenAnswer((_) async => latestVersion); + when(() => argResults['verify-only']).thenReturn(true); - test( - 'does not update', - () async { - when( - () => pubUpdater.getLatestVersion(any()), - ).thenAnswer((_) async => latestVersion); - when(() => argResults['verify-only']).thenReturn(true); - - final result = await command.run(); - - expect(result, equals(ExitCode.success.code)); - verifyNever( - () => pubUpdater.update( - packageName: any(named: 'packageName'), - versionConstraint: any(named: 'versionConstraint'), - ), - ); - }, - ); + final result = await command.run(); + + expect(result, equals(ExitCode.success.code)); + verify( + () => logger.info('A new version of $packageName is available.\n'), + ).called(1); + verify( + () => + logger.info(styleBold.wrap('The latest version: $latestVersion')), + ).called(1); + verify( + () => logger.info('Your current version: $packageVersion\n'), + ).called(1); + verify( + () => logger.info('To update now, run "$executableName update".'), + ).called(1); + }); + + test('does not update', () async { + when( + () => pubUpdater.getLatestVersion(any()), + ).thenAnswer((_) async => latestVersion); + when(() => argResults['verify-only']).thenReturn(true); + + final result = await command.run(); + + expect(result, equals(ExitCode.success.code)); + verifyNever( + () => pubUpdater.update( + packageName: any(named: 'packageName'), + versionConstraint: any(named: 'versionConstraint'), + ), + ); + }); }); test('handles pub update errors', () async { diff --git a/packages/dart_frog_cli/test/src/daemon/connection_test.dart b/packages/dart_frog_cli/test/src/daemon/connection_test.dart index 4cc981b17..936683986 100644 --- a/packages/dart_frog_cli/test/src/daemon/connection_test.dart +++ b/packages/dart_frog_cli/test/src/daemon/connection_test.dart @@ -90,7 +90,7 @@ void main() { ''' [{"event":"daemon.protocolError","params":{"message":"Message should be placed within a JSON list"}}]\n''', ''' -[{"event":"daemon.protocolError","params":{"message":"Malformed message, Invalid id: 1"}}]\n''' +[{"event":"daemon.protocolError","params":{"message":"Malformed message, Invalid id: 1"}}]\n''', ]); }); @@ -101,7 +101,7 @@ void main() { expect(receivedMessages, isEmpty); expect(stdoutLines, [ ''' -[{"event":"daemon.protocolError","params":{"message":"Unknown error: Exception: catapimbas"}}]\n''' +[{"event":"daemon.protocolError","params":{"message":"Unknown error: Exception: catapimbas"}}]\n''', ]); }); @@ -117,14 +117,11 @@ void main() { await Future.delayed(Duration.zero); } - expect( - stdoutLines, - [ - '[{"id":"1","method":"foo.bar"}]\n', - '[{"id":"2","result":{}}]\n', - '[{"event":"foo.bar","params":{}}]\n', - ], - ); + expect(stdoutLines, [ + '[{"id":"1","method":"foo.bar"}]\n', + '[{"id":"2","result":{}}]\n', + '[{"event":"foo.bar","params":{}}]\n', + ]); }); test('dispose frees resources', () async { diff --git a/packages/dart_frog_cli/test/src/daemon/daemon_server_test.dart b/packages/dart_frog_cli/test/src/daemon/daemon_server_test.dart index c03d0ada5..8bb02e97a 100644 --- a/packages/dart_frog_cli/test/src/daemon/daemon_server_test.dart +++ b/packages/dart_frog_cli/test/src/daemon/daemon_server_test.dart @@ -19,10 +19,7 @@ class _TestDomain extends DomainBase { Future _something(DaemonRequest request) async { return DaemonResponse.success( id: request.id, - result: { - 'foo': 'bar', - if (request.params != null) ...request.params!, - }, + result: {'foo': 'bar', if (request.params != null) ...request.params!}, ); } @@ -44,14 +41,14 @@ void main() { inputStreamController = StreamController.broadcast(); outputStreamController = StreamController.broadcast(); - when(() => connection.inputStream) - .thenAnswer((_) => inputStreamController.stream); - when(() => connection.outputSink) - .thenAnswer((_) => outputStreamController.sink); + when( + () => connection.inputStream, + ).thenAnswer((_) => inputStreamController.stream); + when( + () => connection.outputSink, + ).thenAnswer((_) => outputStreamController.sink); - daemonServer = DaemonServer( - connection: connection, - ); + daemonServer = DaemonServer(connection: connection); outputMessages = []; outputStreamController.stream.listen((event) { @@ -89,9 +86,7 @@ void main() { const event = DaemonEvent( domain: 'test', event: 'test', - params: { - 'param': 2, - }, + params: {'param': 2}, ); daemonServer.sendEvent(event); @@ -109,9 +104,7 @@ void main() { const DaemonRequest( id: '0', method: 'something', - params: { - 'boo': 'far', - }, + params: {'boo': 'far'}, domain: 'test', ), ); @@ -121,10 +114,7 @@ void main() { expect(outputMessages, [ const DaemonResponse.success( id: '0', - result: { - 'foo': 'bar', - 'boo': 'far', - }, + result: {'foo': 'bar', 'boo': 'far'}, ), ]); }); @@ -134,9 +124,7 @@ void main() { const DaemonRequest( id: '0', method: 'something', - params: { - 'boo': 'far', - }, + params: {'boo': 'far'}, domain: 'test', ), ); @@ -146,9 +134,7 @@ void main() { expect(outputMessages, [ const DaemonResponse.error( id: '0', - error: { - 'message': 'Invalid domain: test', - }, + error: {'message': 'Invalid domain: test'}, ), ]); }); diff --git a/packages/dart_frog_cli/test/src/daemon/domain/daemon_domain_test.dart b/packages/dart_frog_cli/test/src/daemon/domain/daemon_domain_test.dart index 17e8ebf5c..a180c90f1 100644 --- a/packages/dart_frog_cli/test/src/daemon/domain/daemon_domain_test.dart +++ b/packages/dart_frog_cli/test/src/daemon/domain/daemon_domain_test.dart @@ -20,23 +20,14 @@ void main() { }); test('emits initial event', () async { - expect( - DaemonDomain( - daemonServer, - processId: 42, - ), - isNotNull, - ); + expect(DaemonDomain(daemonServer, processId: 42), isNotNull); verify( () => daemonServer.sendEvent( const DaemonEvent( domain: 'daemon', event: 'ready', - params: { - 'version': '1.0.0', - 'processId': 42, - }, + params: {'version': '1.0.0', 'processId': 42}, ), ), ).called(1); @@ -70,15 +61,12 @@ void main() { test('kills the daemon and sends goodbye', () async { final domain = DaemonDomain(daemonServer, processId: 42); - when(() => daemonServer.kill(ExitCode.success)) - .thenAnswer((_) async {}); + when( + () => daemonServer.kill(ExitCode.success), + ).thenAnswer((_) async {}); final response = await domain.handleRequest( - const DaemonRequest( - id: '12', - domain: 'daemon', - method: 'kill', - ), + const DaemonRequest(id: '12', domain: 'daemon', method: 'kill'), ); verify(() => daemonServer.kill(ExitCode.success)).called(1); @@ -88,9 +76,7 @@ void main() { equals( const DaemonResponse.success( id: '12', - result: { - 'message': 'Hogarth. You stay, I go. No following.', - }, + result: {'message': 'Hogarth. You stay, I go. No following.'}, ), ), ); diff --git a/packages/dart_frog_cli/test/src/daemon/domain/dev_server_domain_test.dart b/packages/dart_frog_cli/test/src/daemon/domain/dev_server_domain_test.dart index 7d11d9f9f..b2d8769bf 100644 --- a/packages/dart_frog_cli/test/src/daemon/domain/dev_server_domain_test.dart +++ b/packages/dart_frog_cli/test/src/daemon/domain/dev_server_domain_test.dart @@ -157,18 +157,13 @@ void main() { id: '12', domain: 'dev_server', method: 'start', - params: { - 'workingDirectory': '/', - 'dartVmServicePort': 3001, - }, + params: {'workingDirectory': '/', 'dartVmServicePort': 3001}, ), ), equals( const DaemonResponse.error( id: '12', - error: { - 'message': 'Missing parameter, port not found', - }, + error: {'message': 'Missing parameter, port not found'}, ), ), ); @@ -181,10 +176,7 @@ void main() { id: '12', domain: 'dev_server', method: 'start', - params: { - 'workingDirectory': '/', - 'port': 3000, - }, + params: {'workingDirectory': '/', 'port': 3000}, ), ), equals( @@ -228,10 +220,7 @@ void main() { id: '12', domain: 'dev_server', method: 'start', - params: { - 'workingDirectory': '/', - 'port': 'lol', - }, + params: {'workingDirectory': '/', 'port': 'lol'}, ), ), equals( @@ -287,7 +276,8 @@ void main() { const DaemonResponse.error( id: '12', error: { - 'message': 'Malformed message, invalid hostname "lol": ' + 'message': + 'Malformed message, invalid hostname "lol": ' 'must be a valid IPv4 or IPv6 address.', }, ), @@ -373,9 +363,7 @@ void main() { equals( const DaemonResponse.error( id: '12', - error: { - 'message': 'Malformed message, invalid applicationId', - }, + error: {'message': 'Malformed message, invalid applicationId'}, ), ), ); @@ -481,10 +469,7 @@ void main() { equals( const DaemonResponse.success( id: '12', - result: { - 'applicationId': 'id', - 'exitCode': 0, - }, + result: {'applicationId': 'id', 'exitCode': 0}, ), ), ); @@ -506,9 +491,7 @@ void main() { equals( const DaemonResponse.error( id: '12', - error: { - 'message': 'Malformed message, invalid applicationId', - }, + error: {'message': 'Malformed message, invalid applicationId'}, ), ), ); diff --git a/packages/dart_frog_cli/test/src/daemon/domain/domain_base_test.dart b/packages/dart_frog_cli/test/src/daemon/domain/domain_base_test.dart index 8188e3591..7ecfd37a6 100644 --- a/packages/dart_frog_cli/test/src/daemon/domain/domain_base_test.dart +++ b/packages/dart_frog_cli/test/src/daemon/domain/domain_base_test.dart @@ -20,10 +20,7 @@ void main() { Future myHandler(DaemonRequest request) async { return DaemonResponse.success( id: request.id, - result: { - 'foo': 'bar', - if (request.params != null) ...request.params!, - }, + result: {'foo': 'bar', if (request.params != null) ...request.params!}, ); } @@ -54,11 +51,7 @@ void main() { final domain = _TestDomain(_MockDaemonServer()) ..addHandler('myHandler', myHandler); final response = await domain.handleRequest( - const DaemonRequest( - id: '1', - method: 'invalidHandler', - domain: 'test', - ), + const DaemonRequest(id: '1', method: 'invalidHandler', domain: 'test'), ); expect( @@ -81,11 +74,7 @@ void main() { ..addHandler('myHandler', myHandler); final response = await domain.handleRequest( - const DaemonRequest( - id: '1', - method: 'myHandler', - domain: 'test', - ), + const DaemonRequest(id: '1', method: 'myHandler', domain: 'test'), ); expect( @@ -100,10 +89,7 @@ void main() { }); test('getId returns as passed', () async { - final domain = _TestDomain( - _MockDaemonServer(), - getId: () => 'id', - ); + final domain = _TestDomain(_MockDaemonServer(), getId: () => 'id'); expect(domain.getId(), equals('id')); }); diff --git a/packages/dart_frog_cli/test/src/daemon/domain/route_configuration_domain_test.dart b/packages/dart_frog_cli/test/src/daemon/domain/route_configuration_domain_test.dart index e476e9d1a..8546c975f 100644 --- a/packages/dart_frog_cli/test/src/daemon/domain/route_configuration_domain_test.dart +++ b/packages/dart_frog_cli/test/src/daemon/domain/route_configuration_domain_test.dart @@ -233,18 +233,13 @@ void main() { id: '12', domain: 'route_configuration', method: 'watcherStop', - params: { - 'watcherId': 'id', - }, + params: {'watcherId': 'id'}, ), ), equals( const DaemonResponse.success( id: '12', - result: { - 'watcherId': 'id', - 'exitCode': 0, - }, + result: {'watcherId': 'id', 'exitCode': 0}, ), ), ); @@ -260,17 +255,13 @@ void main() { id: '12', domain: 'route_configuration', method: 'watcherStop', - params: { - 'watcherId': 123, - }, + params: {'watcherId': 123}, ), ), equals( const DaemonResponse.error( id: '12', - error: { - 'message': 'Malformed message, invalid watcherId', - }, + error: {'message': 'Malformed message, invalid watcherId'}, ), ), ); @@ -313,9 +304,7 @@ void main() { equals( const DaemonResponse.error( id: '12', - error: { - 'message': 'Missing parameter, watcherId not found', - }, + error: {'message': 'Missing parameter, watcherId not found'}, ), ), ); @@ -331,19 +320,13 @@ void main() { id: '12', domain: 'route_configuration', method: 'watcherStop', - params: { - 'watcherId': 'id', - }, + params: {'watcherId': 'id'}, ), ), equals( const DaemonResponse.error( id: '12', - error: { - 'watcherId': 'id', - 'message': 'error', - 'finished': true, - }, + error: {'watcherId': 'id', 'message': 'error', 'finished': true}, ), ), ); @@ -359,19 +342,13 @@ void main() { id: '12', domain: 'route_configuration', method: 'watcherStop', - params: { - 'watcherId': 'id', - }, + params: {'watcherId': 'id'}, ), ), equals( const DaemonResponse.error( id: '12', - error: { - 'watcherId': 'id', - 'message': 'error', - 'finished': false, - }, + error: {'watcherId': 'id', 'message': 'error', 'finished': false}, ), ), ); @@ -380,8 +357,9 @@ void main() { group('watcherGenerateRouteConfiguration', () { setUp(() async { - when(() => watcher.forceRouteConfigurationRegeneration()) - .thenReturn(_configuration); + when( + () => watcher.forceRouteConfigurationRegeneration(), + ).thenReturn(_configuration); await domain.handleRequest( const DaemonRequest( @@ -401,9 +379,7 @@ void main() { id: '12', domain: 'route_configuration', method: 'watcherGenerateRouteConfiguration', - params: { - 'watcherId': 'id', - }, + params: {'watcherId': 'id'}, ), ), equals( @@ -428,17 +404,13 @@ void main() { id: '12', domain: 'route_configuration', method: 'watcherGenerateRouteConfiguration', - params: { - 'watcherId': 123, - }, + params: {'watcherId': 123}, ), ), equals( const DaemonResponse.error( id: '12', - error: { - 'message': 'Malformed message, invalid watcherId', - }, + error: {'message': 'Malformed message, invalid watcherId'}, ), ), ); @@ -481,9 +453,7 @@ void main() { equals( const DaemonResponse.error( id: '12', - error: { - 'message': 'Missing parameter, watcherId not found', - }, + error: {'message': 'Missing parameter, watcherId not found'}, ), ), ); @@ -491,8 +461,9 @@ void main() { }); test('when cannot generate route config', () async { - when(() => watcher.forceRouteConfigurationRegeneration()) - .thenReturn(null); + when( + () => watcher.forceRouteConfigurationRegeneration(), + ).thenReturn(null); expect( await domain.handleRequest( @@ -500,9 +471,7 @@ void main() { id: '12', domain: 'route_configuration', method: 'watcherGenerateRouteConfiguration', - params: { - 'watcherId': 'id', - }, + params: {'watcherId': 'id'}, ), ), equals( diff --git a/packages/dart_frog_cli/test/src/daemon/logger_test.dart b/packages/dart_frog_cli/test/src/daemon/logger_test.dart index f45bd87d5..27b2b3b1f 100644 --- a/packages/dart_frog_cli/test/src/daemon/logger_test.dart +++ b/packages/dart_frog_cli/test/src/daemon/logger_test.dart @@ -45,10 +45,7 @@ void main() { const DaemonEvent( domain: 'test', event: 'loggerAlert', - params: { - 'meta-information1': true, - 'message': 'alert', - }, + params: {'meta-information1': true, 'message': 'alert'}, ), ); }); @@ -86,10 +83,7 @@ void main() { const DaemonEvent( domain: 'test', event: 'loggerInfo', - params: { - 'meta-information1': true, - 'message': 'delayed1', - }, + params: {'meta-information1': true, 'message': 'delayed1'}, ), ); @@ -98,10 +92,7 @@ void main() { const DaemonEvent( domain: 'test', event: 'loggerInfo', - params: { - 'meta-information1': true, - 'message': 'delayed2', - }, + params: {'meta-information1': true, 'message': 'delayed2'}, ), ); }); @@ -115,10 +106,7 @@ void main() { const DaemonEvent( domain: 'test', event: 'loggerDetail', - params: { - 'meta-information1': true, - 'message': 'detail', - }, + params: {'meta-information1': true, 'message': 'detail'}, ), ); }); @@ -132,10 +120,7 @@ void main() { const DaemonEvent( domain: 'test', event: 'loggerError', - params: { - 'meta-information1': true, - 'message': 'err', - }, + params: {'meta-information1': true, 'message': 'err'}, ), ); }); @@ -149,10 +134,7 @@ void main() { const DaemonEvent( domain: 'test', event: 'loggerInfo', - params: { - 'meta-information1': true, - 'message': 'info', - }, + params: {'meta-information1': true, 'message': 'info'}, ), ); }); @@ -180,10 +162,7 @@ void main() { const DaemonEvent( domain: 'test', event: 'loggerSuccess', - params: { - 'meta-information1': true, - 'message': 'success', - }, + params: {'meta-information1': true, 'message': 'success'}, ), ); }); @@ -197,10 +176,7 @@ void main() { const DaemonEvent( domain: 'test', event: 'loggerWarning', - params: { - 'meta-information1': true, - 'message': 'warn', - }, + params: {'meta-information1': true, 'message': 'warn'}, ), ); }); @@ -214,10 +190,7 @@ void main() { const DaemonEvent( domain: 'test', event: 'loggerWrite', - params: { - 'meta-information1': true, - 'message': 'write', - }, + params: {'meta-information1': true, 'message': 'write'}, ), ); }); @@ -236,9 +209,7 @@ void main() { .having( (e) => e.params, 'progress params', - equals( - {'meta-information1': true}, - ), + equals({'meta-information1': true}), ) .having((e) => e.domain, 'progress domain', equals('test')) .having((e) => e.id, 'progress id', equals('id')), diff --git a/packages/dart_frog_cli/test/src/daemon/protocol_test.dart b/packages/dart_frog_cli/test/src/daemon/protocol_test.dart index 5013d8440..546d07857 100644 --- a/packages/dart_frog_cli/test/src/daemon/protocol_test.dart +++ b/packages/dart_frog_cli/test/src/daemon/protocol_test.dart @@ -39,10 +39,7 @@ void main() { }); expect( parsed, - const DaemonResponse.success( - id: '1', - result: {'foo': 'bar'}, - ), + const DaemonResponse.success(id: '1', result: {'foo': 'bar'}), ); expect( parsed, @@ -56,10 +53,7 @@ void main() { }); expect( parsedError, - const DaemonResponse.error( - id: '1', - error: {'foo': 'bar'}, - ), + const DaemonResponse.error(id: '1', error: {'foo': 'bar'}), ); expect( parsedError, @@ -68,13 +62,8 @@ void main() { }); test('parses event', () { - final parsed = DaemonMessage.fromJson(const { - 'event': 'foo.bar', - }); - expect( - parsed, - const DaemonEvent(event: 'bar', domain: 'foo'), - ); + final parsed = DaemonMessage.fromJson(const {'event': 'foo.bar'}); + expect(parsed, const DaemonEvent(event: 'bar', domain: 'foo')); }); test('parses event w/ params', () { @@ -84,41 +73,28 @@ void main() { }); expect( parsed, - const DaemonEvent( - event: 'bar', - domain: 'foo', - params: {'foo': 'bar'}, - ), + const DaemonEvent(event: 'bar', domain: 'foo', params: {'foo': 'bar'}), ); }); group('malformed request', () { test('malformed id', () { expect( - () => DaemonMessage.fromJson(const { - 'id': 1, - 'method': 'foo.bar', - }), + () => DaemonMessage.fromJson(const {'id': 1, 'method': 'foo.bar'}), throwsA(isA()), ); }); test('malformed method', () { expect( - () => DaemonMessage.fromJson(const { - 'id': '1', - 'method': 12, - }), + () => DaemonMessage.fromJson(const {'id': '1', 'method': 12}), throwsA(isA()), ); }); test('malformed domain.method', () { expect( - () => DaemonMessage.fromJson(const { - 'id': '1', - 'method': 'foobar', - }), + () => DaemonMessage.fromJson(const {'id': '1', 'method': 'foobar'}), throwsA(isA()), ); }); @@ -148,10 +124,7 @@ void main() { test('malformed result', () { expect( - () => DaemonMessage.fromJson(const { - 'id': '1', - 'result': 12, - }), + () => DaemonMessage.fromJson(const {'id': '1', 'result': 12}), throwsA(isA()), ); }); @@ -171,28 +144,22 @@ void main() { group('malformed event', () { test('malformed event', () { expect( - () => DaemonMessage.fromJson(const { - 'event': 12, - }), + () => DaemonMessage.fromJson(const {'event': 12}), throwsA(isA()), ); }); test('malformed domain.event', () { expect( - () => DaemonMessage.fromJson(const { - 'event': 'foobar', - }), + () => DaemonMessage.fromJson(const {'event': 'foobar'}), throwsA(isA()), ); }); test('malformed params', () { expect( - () => DaemonMessage.fromJson(const { - 'event': 'foo.bar', - 'params': 12, - }), + () => + DaemonMessage.fromJson(const {'event': 'foo.bar', 'params': 12}), throwsA(isA()), ); }); @@ -200,9 +167,7 @@ void main() { test('throws on unknown message type', () { expect( - () => DaemonMessage.fromJson(const { - 'foo': 'bar', - }), + () => DaemonMessage.fromJson(const {'foo': 'bar'}), throwsA(isA()), ); }); diff --git a/packages/dart_frog_cli/test/src/dev_server_runner/dev_server_runner_test.dart b/packages/dart_frog_cli/test/src/dev_server_runner/dev_server_runner_test.dart index 043b85361..35dc0e138 100644 --- a/packages/dart_frog_cli/test/src/dev_server_runner/dev_server_runner_test.dart +++ b/packages/dart_frog_cli/test/src/dev_server_runner/dev_server_runner_test.dart @@ -99,8 +99,8 @@ void main() { onVarsChanged: any(named: 'onVarsChanged'), ), ).thenAnswer((invocation) async { - (invocation.namedArguments[const Symbol('onVarsChanged')] as void - Function(Map vars)) + (invocation.namedArguments[const Symbol('onVarsChanged')] + as void Function(Map vars)) .call({}); }); @@ -132,9 +132,7 @@ void main() { group('start', () { test('starts a dev server successfully.', () async { - when( - () => directoryWatcher.events, - ).thenAnswer( + when(() => directoryWatcher.events).thenAnswer( (_) => Stream.value(WatchEvent(ChangeType.MODIFY, 'README.md')), ); @@ -152,9 +150,9 @@ void main() { ).called(1); verify(() { - progress.complete('Running on ${link( - uri: Uri.parse('http://localhost:8080'), - )}'); + progress.complete( + 'Running on ${link(uri: Uri.parse('http://localhost:8080'))}', + ); }).called(1); }); @@ -253,10 +251,7 @@ void main() { expect(devServerRunner.isServerRunning, isTrue); expect(devServerRunner.isCompleted, isFalse); - expect( - receivedArgs, - contains('--enable-vm-service=4343'), - ); + expect(receivedArgs, contains('--enable-vm-service=4343')); verify( () => generatorHooks.preGen( vars: {'port': '4242'}, @@ -266,9 +261,9 @@ void main() { ).called(1); verify(() { - progress.complete('Running on ${link( - uri: Uri.parse('http://localhost:4242'), - )}'); + progress.complete( + 'Running on ${link(uri: Uri.parse('http://localhost:4242'))}', + ); }).called(1); }); @@ -304,25 +299,19 @@ void main() { expect(devServerRunner.isServerRunning, isTrue); expect(devServerRunner.isCompleted, isFalse); - expect( - receivedArgs, - contains('--enable-vm-service=4343'), - ); + expect(receivedArgs, contains('--enable-vm-service=4343')); verify( () => generatorHooks.preGen( - vars: { - 'port': '4242', - 'host': '192.162.1.2', - }, + vars: {'port': '4242', 'host': '192.162.1.2'}, workingDirectory: any(named: 'workingDirectory'), onVarsChanged: any(named: 'onVarsChanged'), ), ).called(1); verify(() { - progress.complete('Running on ${link( - uri: Uri.parse('http://192.162.1.2:4242'), - )}'); + progress.complete( + 'Running on ${link(uri: Uri.parse('http://192.162.1.2:4242'))}', + ); }).called(1); }); @@ -330,9 +319,9 @@ void main() { 'kills process if error occurs before hot reload is enabled on windows', () async { final processRunCalls = >[]; - when(() => process.stderr).thenAnswer( - (_) => Stream.value(utf8.encode('oops')), - ); + when( + () => process.stderr, + ).thenAnswer((_) => Stream.value(utf8.encode('oops'))); when( () => directoryWatcher.events, @@ -470,8 +459,8 @@ void main() { onVarsChanged: any(named: 'onVarsChanged'), ), ).thenAnswer((invocation) async { - (invocation.namedArguments[const Symbol('onVarsChanged')] as void - Function(Map vars)) + (invocation.namedArguments[const Symbol('onVarsChanged')] + as void Function(Map vars)) .call({}); }); when( @@ -484,9 +473,7 @@ void main() { when(() => generator.hooks).thenReturn(generatorHooks); when(() => process.stdout).thenAnswer((_) => const Stream.empty()); when(() => process.stderr).thenAnswer((_) => const Stream.empty()); - when( - () => directoryWatcher.events, - ).thenAnswer( + when(() => directoryWatcher.events).thenAnswer( (_) => Stream.value(WatchEvent(ChangeType.MODIFY, 'README.md')), ); @@ -499,12 +486,8 @@ void main() { dartVmServicePort: '4343', workingDirectory: Directory.current, directoryWatcher: (_) => directoryWatcher, - generatorTarget: ( - _, { - CreateFile? createFile, - Logger? logger, - }) => - generatorTarget, + generatorTarget: + (_, {CreateFile? createFile, Logger? logger}) => generatorTarget, isWindows: isWindows, startProcess: ( String executable, @@ -520,10 +503,7 @@ void main() { ); await expectLater(devServerRunner.start(), completes); - expect( - receivedArgs, - contains('--enable-asserts'), - ); + expect(receivedArgs, contains('--enable-asserts')); }); test('does not reload when reloading ', () async { @@ -565,8 +545,9 @@ void main() { when(() => process.stdout).thenAnswer( (_) => Stream.value(utf8.encode('[hotreload] hot reload enabled.')), ); - when(() => directoryWatcher.events) - .thenAnswer((_) => controller.stream); + when( + () => directoryWatcher.events, + ).thenAnswer((_) => controller.stream); await expectLater(devServerRunner.start(), completes); expect(devServerRunner.isWatching, isTrue); @@ -588,12 +569,11 @@ void main() { test('completes dev server when watcher ends with error', () async { final controller = StreamController(); when(() => process.stdout).thenAnswer( - (_) => Stream.value( - utf8.encode('[hotreload] hot reload enabled.'), - ), + (_) => Stream.value(utf8.encode('[hotreload] hot reload enabled.')), ); - when(() => directoryWatcher.events) - .thenAnswer((_) => controller.stream); + when( + () => directoryWatcher.events, + ).thenAnswer((_) => controller.stream); await expectLater(devServerRunner.start(), completes); expect(devServerRunner.isWatching, isTrue); @@ -620,8 +600,9 @@ runs codegen with debounce when changes are made to the public or routes directo when(() => process.stdout).thenAnswer( (_) => Stream.value(utf8.encode('[hotreload] hot reload enabled.')), ); - when(() => directoryWatcher.events) - .thenAnswer((_) => controller.stream); + when( + () => directoryWatcher.events, + ).thenAnswer((_) => controller.stream); await expectLater(devServerRunner.start(), completes); @@ -699,8 +680,9 @@ runs codegen with debounce when changes are made to the public or routes directo when(() => process.stdout).thenAnswer( (_) => Stream.value(utf8.encode('[hotreload] hot reload enabled.')), ); - when(() => directoryWatcher.events) - .thenAnswer((_) => controller.stream); + when( + () => directoryWatcher.events, + ).thenAnswer((_) => controller.stream); await expectLater(devServerRunner.start(), completes); @@ -737,8 +719,9 @@ runs codegen with debounce when changes are made to the public or routes directo (_) => Stream.value(utf8.encode('[hotreload] hot reload enabled.')), ); - when(() => directoryWatcher.events) - .thenAnswer((_) => controller.stream); + when( + () => directoryWatcher.events, + ).thenAnswer((_) => controller.stream); await expectLater(devServerRunner.start(), completes); @@ -768,49 +751,43 @@ runs codegen with debounce when changes are made to the public or routes directo ).called(1); }); - test( - 'caches snapshot when hot reload runs successfully', - () async { - when(() => process.stdout).thenAnswer( - (_) => Stream.value(utf8.encode('[hotreload] hot reload enabled.')), - ); + test('caches snapshot when hot reload runs successfully', () async { + when(() => process.stdout).thenAnswer( + (_) => Stream.value(utf8.encode('[hotreload] hot reload enabled.')), + ); - await expectLater(devServerRunner.start(), completes); + await expectLater(devServerRunner.start(), completes); - await Future.delayed(const Duration(milliseconds: 100)); + await Future.delayed(const Duration(milliseconds: 100)); - verify(() => generatorTarget.cacheLatestSnapshot()).called(1); - }, - ); + verify(() => generatorTarget.cacheLatestSnapshot()).called(1); + }); - test( - 'restores previous snapshot when hot reload fails.', - () async { - final stdoutController = StreamController>(); - final stderrController = StreamController>(); + test('restores previous snapshot when hot reload fails.', () async { + final stdoutController = StreamController>(); + final stderrController = StreamController>(); - when(() => generatorTarget.rollback()).thenAnswer((_) async {}); - when(() => process.stdout).thenAnswer((_) => stdoutController.stream); - when(() => process.stderr).thenAnswer((_) => stderrController.stream); + when(() => generatorTarget.rollback()).thenAnswer((_) async {}); + when(() => process.stdout).thenAnswer((_) => stdoutController.stream); + when(() => process.stderr).thenAnswer((_) => stderrController.stream); - await expectLater(devServerRunner.start(), completes); + await expectLater(devServerRunner.start(), completes); - stdoutController.add(utf8.encode('[hotreload] hot reload enabled')); - await untilCalled(() => generatorTarget.cacheLatestSnapshot()); + stdoutController.add(utf8.encode('[hotreload] hot reload enabled')); + await untilCalled(() => generatorTarget.cacheLatestSnapshot()); - const error = 'something went wrong'; + const error = 'something went wrong'; - stderrController.add(utf8.encode(error)); - await untilCalled(() => generatorTarget.rollback()); + stderrController.add(utf8.encode(error)); + await untilCalled(() => generatorTarget.rollback()); - await stderrController.close(); - await stdoutController.close(); + await stderrController.close(); + await stdoutController.close(); - verify(() => generatorTarget.cacheLatestSnapshot()).called(1); - verify(() => generatorTarget.rollback()).called(1); - verify(() => logger.err(error)).called(1); - }, - ); + verify(() => generatorTarget.cacheLatestSnapshot()).called(1); + verify(() => generatorTarget.rollback()).called(1); + verify(() => logger.err(error)).called(1); + }); }); group('process runtime', () { @@ -865,8 +842,9 @@ runs codegen with debounce when changes are made to the public or routes directo when(() => process.exitCode).thenAnswer((_) => completer.future); final controller = StreamController(); - when(() => directoryWatcher.events) - .thenAnswer((_) => controller.stream); + when( + () => directoryWatcher.events, + ).thenAnswer((_) => controller.stream); await expectLater(devServerRunner.start(), completes); @@ -884,43 +862,41 @@ runs codegen with debounce when changes are made to the public or routes directo }, ); - test( - 'completes dev server when watcher is finished', - () async { - final completer = Completer(); - when(() => process.exitCode).thenAnswer((_) => completer.future); + test('completes dev server when watcher is finished', () async { + final completer = Completer(); + when(() => process.exitCode).thenAnswer((_) => completer.future); - final controller = StreamController(); - when(() => directoryWatcher.events) - .thenAnswer((_) => controller.stream); + final controller = StreamController(); + when( + () => directoryWatcher.events, + ).thenAnswer((_) => controller.stream); - await expectLater(devServerRunner.start(), completes); - await controller.close(); - await Future.delayed(Duration.zero); + await expectLater(devServerRunner.start(), completes); + await controller.close(); + await Future.delayed(Duration.zero); - expect(devServerRunner.isCompleted, isTrue); + expect(devServerRunner.isCompleted, isTrue); - completer.complete(0); - await Future.delayed(Duration.zero); + completer.complete(0); + await Future.delayed(Duration.zero); - verifyNever( - () => logger.info('[process] server process has been terminated'), - ); - await expectLater( - devServerRunner.exitCode, - completion(ExitCode.success), - ); - }, - ); + verifyNever( + () => logger.info('[process] server process has been terminated'), + ); + await expectLater( + devServerRunner.exitCode, + completion(ExitCode.success), + ); + }); test( '''kills process if error occurs before hot reload is enabled on non-windows''', () async { final processRunCalls = >[]; - when(() => process.stderr).thenAnswer( - (_) => Stream.value(utf8.encode('oops')), - ); + when( + () => process.stderr, + ).thenAnswer((_) => Stream.value(utf8.encode('oops'))); when(() => process.kill()).thenReturn(true); when( () => directoryWatcher.events, @@ -963,9 +939,9 @@ lib/my_model.g.dart:53:20: Warning: Operand of null-aware operation '!' has type ^ """; - when(() => process.stderr).thenAnswer( - (_) => Stream.value(utf8.encode(warningMessage)), - ); + when( + () => process.stderr, + ).thenAnswer((_) => Stream.value(utf8.encode(warningMessage))); when(() => directoryWatcher.events).thenAnswer( (_) => Stream.value(WatchEvent(ChangeType.MODIFY, 'README.md')), ); @@ -997,60 +973,57 @@ lib/my_model.g.dart:53:20: Warning: Operand of null-aware operation '!' has type }, ); - test( - 'kills process with message when Dart VM is already in use', - () async { - final processRunCalls = >[]; + test('kills process with message when Dart VM is already in use', () async { + final processRunCalls = >[]; - const errorMessage = ''' + const errorMessage = ''' Could not start the VM service: localhost:8181 is already in use.'''; - when(() => process.stderr).thenAnswer( - (_) => Stream.value(utf8.encode(errorMessage)), - ); - when(() => process.kill()).thenReturn(true); - when( - () => directoryWatcher.events, - ).thenAnswer((_) => StreamController().stream); - when(() => sigint.watch()).thenAnswer((_) => const Stream.empty()); - devServerRunner = DevServerRunner( - logger: logger, - port: port, - address: null, - devServerBundleGenerator: generator, - dartVmServicePort: dartVmServicePort, - workingDirectory: Directory.current, - directoryWatcher: (_) => directoryWatcher, - startProcess: (_, __, {runInShell = false}) async => process, - sigint: sigint, - runProcess: (String executable, List arguments) async { - processRunCalls.add([executable, ...arguments]); - return processResult; - }, - runtimeCompatibilityCallback: (_) => true, - ); + when( + () => process.stderr, + ).thenAnswer((_) => Stream.value(utf8.encode(errorMessage))); + when(() => process.kill()).thenReturn(true); + when( + () => directoryWatcher.events, + ).thenAnswer((_) => StreamController().stream); + when(() => sigint.watch()).thenAnswer((_) => const Stream.empty()); + devServerRunner = DevServerRunner( + logger: logger, + port: port, + address: null, + devServerBundleGenerator: generator, + dartVmServicePort: dartVmServicePort, + workingDirectory: Directory.current, + directoryWatcher: (_) => directoryWatcher, + startProcess: (_, __, {runInShell = false}) async => process, + sigint: sigint, + runProcess: (String executable, List arguments) async { + processRunCalls.add([executable, ...arguments]); + return processResult; + }, + runtimeCompatibilityCallback: (_) => true, + ); - await expectLater(devServerRunner.start(), completes); - final exitCode = await devServerRunner.exitCode; + await expectLater(devServerRunner.start(), completes); + final exitCode = await devServerRunner.exitCode; - expect( - exitCode.code, - equals(70), - reason: 'Should exit when VM service is already in use.', - ); - expect( - processRunCalls, - isEmpty, - reason: 'Should not run the serve process.', - ); - verify(() => process.kill()).called(1); - verify( - () => logger.err( - '$errorMessage ' - '''Try specifying a different port using the `--dart-vm-service-port` argument when running `dart_frog dev`.''', - ), - ).called(1); - }, - ); + expect( + exitCode.code, + equals(70), + reason: 'Should exit when VM service is already in use.', + ); + expect( + processRunCalls, + isEmpty, + reason: 'Should not run the serve process.', + ); + verify(() => process.kill()).called(1); + verify( + () => logger.err( + '$errorMessage ' + '''Try specifying a different port using the `--dart-vm-service-port` argument when running `dart_frog dev`.''', + ), + ).called(1); + }); }); }); } diff --git a/packages/dart_frog_cli/test/src/dev_server_runner/restorable_directory_generator_target_test.dart b/packages/dart_frog_cli/test/src/dev_server_runner/restorable_directory_generator_target_test.dart index f0fa3947c..b16505c7c 100644 --- a/packages/dart_frog_cli/test/src/dev_server_runner/restorable_directory_generator_target_test.dart +++ b/packages/dart_frog_cli/test/src/dev_server_runner/restorable_directory_generator_target_test.dart @@ -152,93 +152,87 @@ void main() { expect(createdFiles, isEmpty); }); - test( - 'rollback does not remove snapshot ' - 'when there is only one snapshot', - () async { - const path = './path'; - final contents = utf8.encode('contents'); - final createdFiles = []; + test('rollback does not remove snapshot ' + 'when there is only one snapshot', () async { + const path = './path'; + final contents = utf8.encode('contents'); + final createdFiles = []; - generatorTarget = RestorableDirectoryGeneratorTarget( - directory, - createFile: (path, contents, {logger, overwriteRule}) async { - createdFiles.add(CachedFile(path: path, contents: contents)); - return _FakeGeneratedFile(); - }, - ); + generatorTarget = RestorableDirectoryGeneratorTarget( + directory, + createFile: (path, contents, {logger, overwriteRule}) async { + createdFiles.add(CachedFile(path: path, contents: contents)); + return _FakeGeneratedFile(); + }, + ); - await generatorTarget.createFile(path, contents); + await generatorTarget.createFile(path, contents); - expect(createdFiles.length, equals(1)); + expect(createdFiles.length, equals(1)); - createdFiles.clear(); + createdFiles.clear(); - generatorTarget.cacheLatestSnapshot(); - await generatorTarget.rollback(); + generatorTarget.cacheLatestSnapshot(); + await generatorTarget.rollback(); - createdFiles.clear(); + createdFiles.clear(); - const otherPath = './other/path'; - await generatorTarget.createFile(otherPath, contents); + const otherPath = './other/path'; + await generatorTarget.createFile(otherPath, contents); - expect(createdFiles.length, equals(1)); - expect(createdFiles.first.path, equals(otherPath)); - expect(createdFiles.first.contents, equals(contents)); + expect(createdFiles.length, equals(1)); + expect(createdFiles.first.path, equals(otherPath)); + expect(createdFiles.first.contents, equals(contents)); - createdFiles.clear(); + createdFiles.clear(); - await generatorTarget.rollback(); + await generatorTarget.rollback(); - expect(createdFiles.length, equals(1)); - expect(createdFiles.first.path, equals(path)); - expect(createdFiles.first.contents, equals(contents)); - }, - ); + expect(createdFiles.length, equals(1)); + expect(createdFiles.first.path, equals(path)); + expect(createdFiles.first.contents, equals(contents)); + }); - test( - 'rollback removes latest snapshot ' - 'when there is more than one snapshot', - () async { - const path = './path'; - final contents = utf8.encode('contents'); - final createdFiles = []; + test('rollback removes latest snapshot ' + 'when there is more than one snapshot', () async { + const path = './path'; + final contents = utf8.encode('contents'); + final createdFiles = []; - generatorTarget = RestorableDirectoryGeneratorTarget( - directory, - createFile: (path, contents, {logger, overwriteRule}) async { - createdFiles.add(CachedFile(path: path, contents: contents)); - return _FakeGeneratedFile(); - }, - ); + generatorTarget = RestorableDirectoryGeneratorTarget( + directory, + createFile: (path, contents, {logger, overwriteRule}) async { + createdFiles.add(CachedFile(path: path, contents: contents)); + return _FakeGeneratedFile(); + }, + ); - await generatorTarget.createFile(path, contents); + await generatorTarget.createFile(path, contents); - expect(createdFiles.length, equals(1)); + expect(createdFiles.length, equals(1)); - generatorTarget.cacheLatestSnapshot(); + generatorTarget.cacheLatestSnapshot(); - const otherPath = './other/path'; - await generatorTarget.createFile(otherPath, contents); + const otherPath = './other/path'; + await generatorTarget.createFile(otherPath, contents); - generatorTarget.cacheLatestSnapshot(); + generatorTarget.cacheLatestSnapshot(); - expect(createdFiles.length, equals(2)); - expect(createdFiles.first.path, equals(path)); - expect(createdFiles.first.contents, equals(contents)); - expect(createdFiles.last.path, equals(otherPath)); - expect(createdFiles.last.contents, equals(contents)); + expect(createdFiles.length, equals(2)); + expect(createdFiles.first.path, equals(path)); + expect(createdFiles.first.contents, equals(contents)); + expect(createdFiles.last.path, equals(otherPath)); + expect(createdFiles.last.contents, equals(contents)); - await generatorTarget.rollback(); + await generatorTarget.rollback(); - createdFiles.clear(); + createdFiles.clear(); - await generatorTarget.rollback(); + await generatorTarget.rollback(); - expect(createdFiles.length, equals(1)); - expect(createdFiles.first.path, equals(path)); - expect(createdFiles.first.contents, equals(contents)); - }, - ); + expect(createdFiles.length, equals(1)); + expect(createdFiles.first.path, equals(path)); + expect(createdFiles.first.contents, equals(contents)); + }); }); } diff --git a/packages/dart_frog_cli/test/src/prod_server_builder/prod_server_builder_test.dart b/packages/dart_frog_cli/test/src/prod_server_builder/prod_server_builder_test.dart index f90a9c215..c445c4a8b 100644 --- a/packages/dart_frog_cli/test/src/prod_server_builder/prod_server_builder_test.dart +++ b/packages/dart_frog_cli/test/src/prod_server_builder/prod_server_builder_test.dart @@ -69,8 +69,8 @@ void main() { onVarsChanged: any(named: 'onVarsChanged'), ), ).thenAnswer((invocation) async { - (invocation.namedArguments[const Symbol('onVarsChanged')] as void - Function(Map)) + (invocation.namedArguments[const Symbol('onVarsChanged')] + as void Function(Map)) .call({'dartVersion': 'stable'}); }); when( diff --git a/packages/dart_frog_cli/test/src/route_configuration_watcher/route_configuration_watcher_test.dart b/packages/dart_frog_cli/test/src/route_configuration_watcher/route_configuration_watcher_test.dart index 39c985269..1aca8efed 100644 --- a/packages/dart_frog_cli/test/src/route_configuration_watcher/route_configuration_watcher_test.dart +++ b/packages/dart_frog_cli/test/src/route_configuration_watcher/route_configuration_watcher_test.dart @@ -29,8 +29,9 @@ void main() { watcherController.close(); }); - when(() => directoryWatcher.events) - .thenAnswer((_) => watcherController.stream); + when( + () => directoryWatcher.events, + ).thenAnswer((_) => watcherController.stream); routeConfigurationWatcher = RouteConfigurationWatcher( logger: logger, @@ -114,11 +115,7 @@ void main() { watcherController.add( WatchEvent( ChangeType.MODIFY, - path.join( - Directory.current.path, - 'routes', - 'index.dart', - ), + path.join(Directory.current.path, 'routes', 'index.dart'), ), ); @@ -129,11 +126,7 @@ void main() { watcherController.add( WatchEvent( ChangeType.MODIFY, - path.join( - Directory.current.path, - 'public', - 'index.html', - ), + path.join(Directory.current.path, 'public', 'index.html'), ), ); diff --git a/packages/dart_frog_cli/test/src/runtime_compatibility_test.dart b/packages/dart_frog_cli/test/src/runtime_compatibility_test.dart index 387ae1367..14981f1ff 100644 --- a/packages/dart_frog_cli/test/src/runtime_compatibility_test.dart +++ b/packages/dart_frog_cli/test/src/runtime_compatibility_test.dart @@ -72,20 +72,17 @@ void main() { ); }); - test( - 'throws when the pubspec.yaml does ' + test('throws when the pubspec.yaml does ' 'not contain a dart_frog dependency', () { const expected = 'Expected to find a dependency on "dart_frog" in the pubspec.yaml'; - File(path.join(tempDir.path, 'pubspec.yaml')).writeAsStringSync( - ''' + File(path.join(tempDir.path, 'pubspec.yaml')).writeAsStringSync(''' name: example version: 0.1.0+1 environment: sdk: ">=2.17.0 <3.0.0" -''', - ); +'''); expect( () => ensureRuntimeCompatibility(tempDir), throwsA( @@ -102,8 +99,7 @@ environment: const incompatibleVersion = '^99.99.99'; const expected = '''The current version of "dart_frog_cli" requires "dart_frog" $compatibleDartFrogVersion.\nBecause the current version of "dart_frog" is $incompatibleVersion, version solving failed.'''; - File(path.join(tempDir.path, 'pubspec.yaml')).writeAsStringSync( - ''' + File(path.join(tempDir.path, 'pubspec.yaml')).writeAsStringSync(''' name: example version: 0.1.0+1 @@ -112,8 +108,7 @@ environment: dependencies: dart_frog: $incompatibleVersion -''', - ); +'''); expect( () => ensureRuntimeCompatibility(tempDir), throwsA( @@ -127,8 +122,7 @@ dependencies: }); test('completes when the version is compatible.', () { - File(path.join(tempDir.path, 'pubspec.yaml')).writeAsStringSync( - ''' + File(path.join(tempDir.path, 'pubspec.yaml')).writeAsStringSync(''' name: example version: 0.1.0+1 @@ -137,8 +131,7 @@ environment: dependencies: dart_frog: "$compatibleDartFrogVersion" -''', - ); +'''); expect(() => ensureRuntimeCompatibility(tempDir), returnsNormally); }); });