diff --git a/analyze/pubspec.yaml b/analyze/pubspec.yaml index 8ab3de673..02a920185 100644 --- a/analyze/pubspec.yaml +++ b/analyze/pubspec.yaml @@ -12,4 +12,4 @@ dependencies: dev_dependencies: mockito: 5.4.4 - test_api: 0.7.0 + test_api: 0.7.1 diff --git a/app_dart/Dockerfile b/app_dart/Dockerfile index 6dc15d22f..7e951c5da 100644 --- a/app_dart/Dockerfile +++ b/app_dart/Dockerfile @@ -4,7 +4,7 @@ # Dart Docker official images can be found here: https://hub.docker.com/_/dart -FROM dart:beta@sha256:4d3f64da52b5b7fcb96b0ea94e17c745c4ff7d6eb3d078ac3088fb16d2110f5f +FROM dart:beta@sha256:7fef8712c268d41081d36a58745872e527c387bf68cf0bbb86e912201e30f3bf WORKDIR /app diff --git a/app_dart/lib/cocoon_service.dart b/app_dart/lib/cocoon_service.dart index b8b3dac2f..f050db2e2 100644 --- a/app_dart/lib/cocoon_service.dart +++ b/app_dart/lib/cocoon_service.dart @@ -14,6 +14,7 @@ export 'src/request_handlers/get_build_status_badge.dart'; export 'src/request_handlers/get_release_branches.dart'; export 'src/request_handlers/get_repos.dart'; export 'src/request_handlers/get_status.dart'; +export 'src/request_handlers/get_status_firestore.dart'; export 'src/request_handlers/get_green_commits.dart'; export 'src/request_handlers/github_rate_limit_status.dart'; export 'src/request_handlers/github_webhook.dart'; diff --git a/app_dart/lib/server.dart b/app_dart/lib/server.dart index 5aa02cfb7..540a3e44b 100644 --- a/app_dart/lib/server.dart +++ b/app_dart/lib/server.dart @@ -231,6 +231,12 @@ Server createServer({ delegate: GetStatus(config: config), ), + '/api/public/get-status-firestore': CacheRequestHandler( + cache: cache, + config: config, + delegate: GetStatusFirestore(config: config), + ), + '/api/public/get-green-commits': GetGreenCommits(config: config), /// Record GitHub API quota usage in BigQuery. diff --git a/app_dart/lib/src/model/firestore/commit.dart b/app_dart/lib/src/model/firestore/commit.dart index a8411d0e5..ccf119a61 100644 --- a/app_dart/lib/src/model/firestore/commit.dart +++ b/app_dart/lib/src/model/firestore/commit.dart @@ -18,6 +18,16 @@ const String kCommitMessageField = 'message'; const String kCommitRepositoryPathField = 'repositoryPath'; const String kCommitShaField = 'sha'; +/// Commit Json keys. +const String kCommitAvatar = 'Avatar'; +const String kCommitAuthor = 'Author'; +const String kCommitBranch = 'Branch'; +const String kCommitCreateTimestamp = 'CreateTimestamp'; +const String kCommitDocumentName = 'DocumentName'; +const String kCommitMessage = 'Message'; +const String kCommitRepositoryPath = 'RepositoryPath'; +const String kCommitSha = 'Sha'; + class Commit extends Document { /// Lookup [Commit] from Firestore. /// @@ -71,6 +81,20 @@ class Commit extends Document { /// [RepositorySlug] of where this commit exists. RepositorySlug get slug => RepositorySlug.full(repositoryPath!); + @override + Map toJson() { + return { + kCommitDocumentName: name, + kCommitRepositoryPath: repositoryPath, + kCommitCreateTimestamp: createTimestamp, + kCommitSha: sha, + kCommitMessage: message, + kCommitAuthor: author, + kCommitAvatar: avatar, + kCommitBranch: branch, + }; + } + @override String toString() { final StringBuffer buf = StringBuffer() diff --git a/app_dart/lib/src/model/firestore/commit_tasks_status.dart b/app_dart/lib/src/model/firestore/commit_tasks_status.dart new file mode 100644 index 000000000..c5bc651d9 --- /dev/null +++ b/app_dart/lib/src/model/firestore/commit_tasks_status.dart @@ -0,0 +1,35 @@ +// Copyright 2019 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'commit.dart'; +import 'task.dart'; + +/// Class that holds the status for all tasks corresponding to a particular +/// commit. +/// +/// Tasks may still be running, and thus their status is subject to change. +/// Put another way, this class holds information that is a snapshot in time. +class CommitTasksStatus { + /// Creates a new [CommitTasksStatus]. + const CommitTasksStatus(this.commit, this.tasks); + + /// The commit against which all the tasks are run. + final Commit commit; + + /// Tasks running against the commit. + final List tasks; +} + +class SerializableCommitTasksStatus { + const SerializableCommitTasksStatus(this.status); + + final CommitTasksStatus status; + + Map toJson() { + return { + 'Commit': status.commit.toJson(), + 'Tasks': status.tasks, + }; + } +} diff --git a/app_dart/lib/src/model/firestore/task.dart b/app_dart/lib/src/model/firestore/task.dart index b0abc6d0e..8af818b60 100644 --- a/app_dart/lib/src/model/firestore/task.dart +++ b/app_dart/lib/src/model/firestore/task.dart @@ -26,6 +26,18 @@ const String kTaskStartTimestampField = 'startTimestamp'; const String kTaskStatusField = 'status'; const String kTaskTestFlakyField = 'testFlaky'; +/// Task Json keys. +const String kTaskAttempts = 'Attempts'; +const String kTaskBringup = 'Bringup'; +const String kTaskBuildNumber = 'BuildNumber'; +const String kTaskCreateTimestamp = 'CreateTimestamp'; +const String kTaskDocumentName = 'DocumentName'; +const String kTaskEndTimestamp = 'EndTimestamp'; +const String kTaskStartTimestamp = 'StartTimestamp'; +const String kTaskStatus = 'Status'; +const String kTaskTaskName = 'TaskName'; +const String kTaskTestFlaky = 'TestFlaky'; + class Task extends Document { /// Lookup [Task] from Firestore. /// @@ -252,6 +264,22 @@ class Task extends Document { return completedStatuses.contains(status); } + @override + Map toJson() { + return { + kTaskDocumentName: name, + kTaskCreateTimestamp: createTimestamp, + kTaskStartTimestamp: startTimestamp, + kTaskEndTimestamp: endTimestamp, + kTaskTaskName: taskName, + kTaskAttempts: attempts, + kTaskBringup: bringup, + kTaskTestFlaky: testFlaky, + kTaskBuildNumber: buildNumber, + kTaskStatus: status, + }; + } + @override String toString() { final StringBuffer buf = StringBuffer() diff --git a/app_dart/lib/src/request_handlers/get_status_firestore.dart b/app_dart/lib/src/request_handlers/get_status_firestore.dart new file mode 100644 index 000000000..1565f0369 --- /dev/null +++ b/app_dart/lib/src/request_handlers/get_status_firestore.dart @@ -0,0 +1,85 @@ +// Copyright 2019 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'package:gcloud/db.dart'; +import 'package:github/github.dart'; +import 'package:meta/meta.dart'; + +import '../model/appengine/commit.dart'; +import '../model/firestore/commit_tasks_status.dart'; +import '../model/appengine/key_helper.dart'; +import '../request_handling/body.dart'; +import '../request_handling/exceptions.dart'; +import '../request_handling/request_handler.dart'; +import '../service/build_status_provider.dart'; +import '../service/config.dart'; +import '../service/datastore.dart'; +import '../service/firestore.dart'; + +@immutable +class GetStatusFirestore extends RequestHandler { + const GetStatusFirestore({ + required super.config, + @visibleForTesting this.datastoreProvider = DatastoreService.defaultProvider, + @visibleForTesting this.buildStatusProvider = BuildStatusService.defaultProvider, + }); + + final DatastoreServiceProvider datastoreProvider; + final BuildStatusServiceProvider buildStatusProvider; + + static const String kLastCommitKeyParam = 'lastCommitKey'; + static const String kBranchParam = 'branch'; + static const String kRepoParam = 'repo'; + + @override + Future get() async { + final String? encodedLastCommitKey = request!.uri.queryParameters[kLastCommitKeyParam]; + final String repoName = request!.uri.queryParameters[kRepoParam] ?? Config.flutterSlug.name; + final RepositorySlug slug = RepositorySlug('flutter', repoName); + final String branch = request!.uri.queryParameters[kBranchParam] ?? Config.defaultBranch(slug); + final DatastoreService datastore = datastoreProvider(config.db); + final FirestoreService firestoreService = await config.createFirestoreService(); + final BuildStatusService buildStatusService = buildStatusProvider(datastore, firestoreService); + final KeyHelper keyHelper = config.keyHelper; + final int commitNumber = config.commitNumber; + final int lastCommitTimestamp = await _obtainTimestamp(encodedLastCommitKey, keyHelper, datastore); + + final List statuses = await buildStatusService + .retrieveCommitStatusFirestore( + limit: commitNumber, + timestamp: lastCommitTimestamp, + branch: branch, + slug: slug, + ) + .map( + (CommitTasksStatus status) => SerializableCommitTasksStatus(status), + ) + .toList(); + + return Body.forJson({ + 'Statuses': statuses, + }); + } + + Future _obtainTimestamp(String? encodedLastCommitKey, KeyHelper keyHelper, DatastoreService datastore) async { + /// [lastCommitTimestamp] is initially set as the current time, which allows query return + /// latest commit list. If [owerKeyParam] is not empty, [lastCommitTimestamp] will be set + /// as the timestamp of that [commit], and the query will return lastest commit + /// list whose timestamp is smaller than [lastCommitTimestamp]. + int lastCommitTimestamp = DateTime.now().millisecondsSinceEpoch; + + if (encodedLastCommitKey != null) { + final Key ownerKey = keyHelper.decode(encodedLastCommitKey) as Key; + final Commit commit = await datastore.db.lookupValue( + ownerKey, + orElse: () => throw NotFoundException('Failed to find commit with key $ownerKey'), + ); + + lastCommitTimestamp = commit.timestamp!; + } + return lastCommitTimestamp; + } +} diff --git a/app_dart/lib/src/request_handlers/reset_prod_task.dart b/app_dart/lib/src/request_handlers/reset_prod_task.dart index b2a0cce6d..402a37236 100644 --- a/app_dart/lib/src/request_handlers/reset_prod_task.dart +++ b/app_dart/lib/src/request_handlers/reset_prod_task.dart @@ -23,6 +23,7 @@ import '../service/datastore.dart'; import '../service/firestore.dart'; import '../service/luci_build_service.dart'; import '../service/scheduler.dart'; +import '../service/logging.dart'; /// Reruns a postsubmit LUCI build. /// @@ -80,6 +81,7 @@ class ResetProdTask extends ApiRequestHandler { } if (taskName == 'all') { + log.info('Attempting to reset all failed prod tasks for $sha in $repo...'); final Key commitKey = Commit.createKey( db: datastore.db, slug: slug!, @@ -90,6 +92,7 @@ class ResetProdTask extends ApiRequestHandler { final List> futures = >[]; for (final Task task in tasks) { if (!Task.taskFailStatusSet.contains(task.status)) continue; + log.info('Resetting failed task ${task.name}'); futures.add( rerun( datastore: datastore, @@ -104,6 +107,7 @@ class ResetProdTask extends ApiRequestHandler { } await Future.wait(futures); } else { + log.info('Attempting to reset prod task "$taskName" for $sha in $repo...'); await rerun( datastore: datastore, firestoreService: firestoreService, @@ -118,6 +122,8 @@ class ResetProdTask extends ApiRequestHandler { ); } + log.info('$taskName reset initiated successfully.'); + return Body.empty; } diff --git a/app_dart/lib/src/service/build_status_provider.dart b/app_dart/lib/src/service/build_status_provider.dart index cc5439d33..b4c4a4575 100644 --- a/app_dart/lib/src/service/build_status_provider.dart +++ b/app_dart/lib/src/service/build_status_provider.dart @@ -12,6 +12,7 @@ import '../model/appengine/commit.dart' as datastore; import '../model/appengine/github_build_status_update.dart'; import '../model/appengine/stage.dart'; import '../model/firestore/commit.dart'; +import '../model/firestore/commit_tasks_status.dart'; import '../model/firestore/task.dart'; import 'datastore.dart'; @@ -174,23 +175,6 @@ class BuildStatusService { } } -/// Class that holds the status for all tasks corresponding to a particular -/// commit. -/// -/// Tasks may still be running, and thus their status is subject to change. -/// Put another way, this class holds information that is a snapshot in time. -@immutable -class CommitTasksStatus { - /// Creates a new [CommitTasksStatus]. - const CommitTasksStatus(this.commit, this.tasks); - - /// The commit against which all the tasks are run. - final Commit commit; - - /// Tasks running against the commit. - final List tasks; -} - @immutable class CommitStatus { /// Creates a new [CommitStatus]. diff --git a/app_dart/pubspec.yaml b/app_dart/pubspec.yaml index e2605a14f..715954d02 100644 --- a/app_dart/pubspec.yaml +++ b/app_dart/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: appengine: 0.13.7 - args: 2.4.2 + args: 2.5.0 collection: 1.18.0 corsac_jwt: 1.0.0-nullsafety.1 crypto: 3.0.3 @@ -22,7 +22,7 @@ dependencies: gcloud: 0.8.12 github: 9.24.0 googleapis: 12.0.0 - googleapis_auth: 1.5.1 + googleapis_auth: 1.6.0 gql: 1.0.1-alpha+1696717343881 graphql: 5.2.0-beta.7 grpc: 3.2.4 @@ -32,7 +32,7 @@ dependencies: meta: 1.14.0 mime: 1.0.5 mutex: 3.1.0 - neat_cache: 2.0.3 + neat_cache: 2.0.4 path: 1.9.0 process: 5.0.2 process_runner: 4.2.0 @@ -49,7 +49,7 @@ dev_dependencies: json_serializable: 6.7.1 mockito: 5.4.4 platform: 3.1.4 - test: 1.25.2 + test: 1.25.3 builders: json_serializable: 3.3.0 diff --git a/app_dart/test/model/firestore/commit_tasks_status_test.dart b/app_dart/test/model/firestore/commit_tasks_status_test.dart new file mode 100644 index 000000000..e72d8065a --- /dev/null +++ b/app_dart/test/model/firestore/commit_tasks_status_test.dart @@ -0,0 +1,32 @@ +// Copyright 2019 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:cocoon_service/src/model/firestore/commit.dart'; +import 'package:cocoon_service/src/model/firestore/commit_tasks_status.dart'; +import 'package:cocoon_service/src/model/firestore/task.dart'; +import 'package:test/test.dart'; + +import '../../src/utilities/entity_generators.dart'; + +void main() { + group('CommitTasksStatus', () { + test('generates json correctly', () async { + final Commit commit = generateFirestoreCommit(1, sha: 'sha1'); + final CommitTasksStatus commitTasksStatus = CommitTasksStatus(commit, []); + expect(SerializableCommitTasksStatus(commitTasksStatus).toJson(), { + 'Commit': { + 'DocumentName': 'sha1', + 'RepositoryPath': 'flutter/flutter', + 'CreateTimestamp': 1, + 'Sha': 'sha1', + 'Message': 'test message', + 'Author': 'author', + 'Avatar': 'avatar', + 'Branch': 'master', + }, + 'Tasks': [], + }); + }); + }); +} diff --git a/app_dart/test/model/firestore/commit_test.dart b/app_dart/test/model/firestore/commit_test.dart index 2734b54f2..5cf5730c2 100644 --- a/app_dart/test/model/firestore/commit_test.dart +++ b/app_dart/test/model/firestore/commit_test.dart @@ -51,4 +51,19 @@ void main() { expect(commitDocument.fields![kCommitRepositoryPathField]!.stringValue, commit.repository); expect(commitDocument.fields![kCommitShaField]!.stringValue, commit.sha); }); + + test('commit toJson', () { + final Commit commitDocument = generateFirestoreCommit(1); + final Map expectedResult = { + kCommitDocumentName: commitDocument.name, + kCommitRepositoryPath: commitDocument.repositoryPath, + kCommitCreateTimestamp: commitDocument.createTimestamp, + kCommitSha: commitDocument.sha, + kCommitMessage: commitDocument.message, + kCommitAuthor: commitDocument.author, + kCommitAvatar: commitDocument.avatar, + kCommitBranch: commitDocument.branch, + }; + expect(commitDocument.toJson(), expectedResult); + }); } diff --git a/app_dart/test/model/firestore/task_test.dart b/app_dart/test/model/firestore/task_test.dart index ab748e3bf..b4c778dde 100644 --- a/app_dart/test/model/firestore/task_test.dart +++ b/app_dart/test/model/firestore/task_test.dart @@ -202,4 +202,21 @@ void main() { expect(task.testFlaky, false); }); }); + + test('task toJson', () { + final Task taskDocument = generateFirestoreTask(1); + final Map expectedResult = { + kTaskDocumentName: taskDocument.name, + kTaskCreateTimestamp: taskDocument.createTimestamp, + kTaskStartTimestamp: taskDocument.startTimestamp, + kTaskEndTimestamp: taskDocument.endTimestamp, + kTaskTaskName: taskDocument.taskName, + kTaskAttempts: taskDocument.attempts, + kTaskBringup: taskDocument.bringup, + kTaskTestFlaky: taskDocument.testFlaky, + kTaskBuildNumber: taskDocument.buildNumber, + kTaskStatus: taskDocument.status, + }; + expect(taskDocument.toJson(), expectedResult); + }); } diff --git a/app_dart/test/request_handlers/get_status_firestore_test.dart b/app_dart/test/request_handlers/get_status_firestore_test.dart new file mode 100644 index 000000000..b8bcef0d1 --- /dev/null +++ b/app_dart/test/request_handlers/get_status_firestore_test.dart @@ -0,0 +1,209 @@ +// Copyright 2019 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; + +import 'package:cocoon_service/cocoon_service.dart'; +import 'package:cocoon_service/src/model/appengine/commit.dart'; +import 'package:cocoon_service/src/model/firestore/commit_tasks_status.dart'; +import 'package:cocoon_service/src/model/firestore/task.dart'; +import 'package:cocoon_service/src/service/datastore.dart'; +import 'package:gcloud/db.dart'; +import 'package:test/test.dart'; + +import '../src/datastore/fake_config.dart'; +import '../src/request_handling/fake_authentication.dart'; +import '../src/request_handling/fake_http.dart'; +import '../src/request_handling/request_handler_tester.dart'; +import '../src/service/fake_build_status_provider.dart'; +import '../src/utilities/entity_generators.dart'; +import '../src/utilities/mocks.dart'; + +void main() { + group('GetStatusFirestore', () { + late FakeConfig config; + FakeClientContext clientContext; + FakeKeyHelper keyHelper; + FakeBuildStatusService buildStatusService; + late RequestHandlerTester tester; + late GetStatusFirestore handler; + late MockFirestoreService mockFirestoreService; + + late Commit commit1; + late Commit commit2; + + Future decodeHandlerBody() async { + final Body body = await tester.get(handler); + return await utf8.decoder.bind(body.serialize() as Stream>).transform(json.decoder).single as T?; + } + + setUp(() { + clientContext = FakeClientContext(); + mockFirestoreService = MockFirestoreService(); + keyHelper = FakeKeyHelper(applicationContext: clientContext.applicationContext); + tester = RequestHandlerTester(); + config = FakeConfig(keyHelperValue: keyHelper, firestoreService: mockFirestoreService); + buildStatusService = FakeBuildStatusService(commitTasksStatuses: []); + handler = GetStatusFirestore( + config: config, + datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5), + buildStatusProvider: (_, __) => buildStatusService, + ); + commit1 = Commit( + key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/ea28a9c34dc701de891eaf74503ca4717019f829'), + repository: 'flutter/flutter', + sha: 'ea28a9c34dc701de891eaf74503ca4717019f829', + timestamp: 3, + message: 'test message 1', + branch: 'master', + ); + commit2 = Commit( + key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/d5b0b3c8d1c5fd89302089077ccabbcfaae045e4'), + repository: 'flutter/flutter', + sha: 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4', + timestamp: 1, + message: 'test message 2', + branch: 'master', + ); + }); + + test('no statuses', () async { + final Map result = (await decodeHandlerBody())!; + expect(result['Statuses'], isEmpty); + }); + + test('reports statuses without input commit key', () async { + buildStatusService = FakeBuildStatusService( + commitTasksStatuses: [ + CommitTasksStatus(generateFirestoreCommit(1), const []), + CommitTasksStatus(generateFirestoreCommit(2), const []), + ], + ); + handler = GetStatusFirestore( + config: config, + datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5), + buildStatusProvider: (_, __) => buildStatusService, + ); + + final Map result = (await decodeHandlerBody())!; + + expect(result['Statuses'].length, 2); + }); + + test('reports statuses with input commit key', () async { + final Commit commit1 = Commit( + key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/ea28a9c34dc701de891eaf74503ca4717019f829'), + repository: 'flutter/flutter', + sha: 'ea28a9c34dc701de891eaf74503ca4717019f829', + timestamp: 3, + message: 'test message 1', + branch: 'master', + ); + final Commit commit2 = Commit( + key: config.db.emptyKey.append(Commit, id: 'flutter/flutter/d5b0b3c8d1c5fd89302089077ccabbcfaae045e4'), + repository: 'flutter/flutter', + sha: 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4', + timestamp: 1, + message: 'test message 2', + branch: 'master', + ); + config.db.values[commit1.key] = commit1; + config.db.values[commit2.key] = commit2; + buildStatusService = FakeBuildStatusService( + commitTasksStatuses: [ + CommitTasksStatus( + generateFirestoreCommit( + 1, + sha: 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4', + ), + const [], + ), + CommitTasksStatus(generateFirestoreCommit(2), const []), + ], + ); + handler = GetStatusFirestore( + config: config, + datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5), + buildStatusProvider: (_, __) => buildStatusService, + ); + + const String expectedLastCommitKeyEncoded = + 'ahNzfmZsdXR0ZXItZGFzaGJvYXJkckcLEglDaGVja2xpc3QiOGZsdXR0ZXIvZmx1dHRlci9lYTI4YTljMzRkYzcwMWRlODkxZWFmNzQ1MDNjYTQ3MTcwMTlmODI5DA'; + + tester.request = FakeHttpRequest( + queryParametersValue: { + GetStatusFirestore.kLastCommitKeyParam: expectedLastCommitKeyEncoded, + }, + ); + final Map result = (await decodeHandlerBody())!; + + expect(result['Statuses'].first, { + 'Commit': { + 'DocumentName': 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4', + 'RepositoryPath': 'flutter/flutter', + 'CreateTimestamp': 1, + 'Sha': 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4', + 'Message': 'test message', + 'Author': 'author', + 'Avatar': 'avatar', + 'Branch': 'master', + }, + 'Tasks': [], + }); + }); + + test('reports statuses with input branch', () async { + commit2.branch = 'flutter-1.1-candidate.1'; + config.db.values[commit1.key] = commit1; + config.db.values[commit2.key] = commit2; + buildStatusService = FakeBuildStatusService( + commitTasksStatuses: [ + CommitTasksStatus( + generateFirestoreCommit(1), + const [], + ), + CommitTasksStatus( + generateFirestoreCommit( + 2, + branch: 'flutter-1.1-candidate.1', + sha: 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4', + ), + const [], + ), + ], + ); + handler = GetStatusFirestore( + config: config, + datastoreProvider: (DatastoreDB db) => DatastoreService(config.db, 5), + buildStatusProvider: (_, __) => buildStatusService, + ); + + const String branch = 'flutter-1.1-candidate.1'; + + expect(config.db.values.length, 2); + + tester.request = FakeHttpRequest( + queryParametersValue: { + GetStatusFirestore.kBranchParam: branch, + }, + ); + final Map result = (await decodeHandlerBody())!; + + expect(result['Statuses'].length, 1); + expect(result['Statuses'].first, { + 'Commit': { + 'DocumentName': 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4', + 'RepositoryPath': 'flutter/flutter', + 'CreateTimestamp': 2, + 'Sha': 'd5b0b3c8d1c5fd89302089077ccabbcfaae045e4', + 'Message': 'test message', + 'Author': 'author', + 'Avatar': 'avatar', + 'Branch': 'flutter-1.1-candidate.1', + }, + 'Tasks': [], + }); + }); + }); +} diff --git a/app_dart/test/src/service/fake_build_status_provider.dart b/app_dart/test/src/service/fake_build_status_provider.dart index dfe8a201f..37ef6a190 100644 --- a/app_dart/test/src/service/fake_build_status_provider.dart +++ b/app_dart/test/src/service/fake_build_status_provider.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:cocoon_service/src/model/firestore/commit_tasks_status.dart'; import 'package:cocoon_service/src/service/build_status_provider.dart'; import 'package:cocoon_service/src/service/datastore.dart'; import 'package:cocoon_service/src/service/firestore.dart'; @@ -11,6 +12,7 @@ class FakeBuildStatusService implements BuildStatusService { FakeBuildStatusService({ this.cumulativeStatus, this.commitStatuses, + this.commitTasksStatuses, }); BuildStatus? cumulativeStatus; @@ -55,10 +57,12 @@ class FakeBuildStatusService implements BuildStatusService { String? branch, required RepositorySlug slug, }) { - if (commitStatuses == null) { + if (commitTasksStatuses == null) { throw AssertionError(); } - commitStatuses!.sort((CommitStatus a, CommitStatus b) => a.commit.timestamp!.compareTo(b.commit.timestamp!)); + commitTasksStatuses!.sort( + (CommitTasksStatus a, CommitTasksStatus b) => a.commit.createTimestamp!.compareTo(b.commit.createTimestamp!), + ); return Stream.fromIterable( commitTasksStatuses!.where( diff --git a/app_dart/test/src/utilities/entity_generators.dart b/app_dart/test/src/utilities/entity_generators.dart index 1be5d9bd8..7b9eab83a 100644 --- a/app_dart/test/src/utilities/entity_generators.dart +++ b/app_dart/test/src/utilities/entity_generators.dart @@ -139,6 +139,9 @@ firestore_commit.Commit generateFirestoreCommit( String? owner = 'flutter', String repo = 'flutter', int? createTimestamp, + String? message = 'test message', + String? author = 'author', + String? avatar = 'avatar', }) { final firestore_commit.Commit commit = firestore_commit.Commit() ..name = sha ?? '$i' @@ -146,6 +149,9 @@ firestore_commit.Commit generateFirestoreCommit( firestore_commit.kCommitCreateTimestampField: Value(integerValue: (createTimestamp ?? i).toString()), firestore_commit.kCommitRepositoryPathField: Value(stringValue: '$owner/$repo'), firestore_commit.kCommitBranchField: Value(stringValue: branch), + firestore_commit.kCommitMessageField: Value(stringValue: message), + firestore_commit.kCommitAuthorField: Value(stringValue: author), + firestore_commit.kCommitAvatarField: Value(stringValue: avatar), firestore_commit.kCommitShaField: Value(stringValue: sha ?? '$i'), }; return commit; diff --git a/auto_submit/Dockerfile b/auto_submit/Dockerfile index b01810bae..ab6d482bc 100644 --- a/auto_submit/Dockerfile +++ b/auto_submit/Dockerfile @@ -4,7 +4,7 @@ # Dart Docker official images can be found here: https://hub.docker.com/_/dart -FROM dart:beta@sha256:4d3f64da52b5b7fcb96b0ea94e17c745c4ff7d6eb3d078ac3088fb16d2110f5f +FROM dart:beta@sha256:7fef8712c268d41081d36a58745872e527c387bf68cf0bbb86e912201e30f3bf WORKDIR /app diff --git a/auto_submit/pubspec.yaml b/auto_submit/pubspec.yaml index 2d790bc6d..712a330da 100644 --- a/auto_submit/pubspec.yaml +++ b/auto_submit/pubspec.yaml @@ -15,13 +15,13 @@ dependencies: corsac_jwt: 1.0.0-nullsafety.1 github: 9.24.0 googleapis: 12.0.0 - googleapis_auth: 1.5.1 + googleapis_auth: 1.6.0 graphql: 5.2.0-beta.7 gql: 1.0.1-alpha+1691943394579 http: 1.2.1 json_annotation: 4.8.1 meta: 1.14.0 - neat_cache: 2.0.3 + neat_cache: 2.0.4 shelf: 1.4.1 shelf_router: 1.1.4 crypto: 3.0.3 @@ -35,7 +35,7 @@ dev_dependencies: json_serializable: 6.7.1 flutter_lints: 3.0.2 mockito: 5.4.4 - test: 1.25.2 + test: 1.25.3 builders: json_serializable: 3.3.0 diff --git a/cipd_packages/codesign/pubspec.yaml b/cipd_packages/codesign/pubspec.yaml index 8ddb802fe..d180ad671 100644 --- a/cipd_packages/codesign/pubspec.yaml +++ b/cipd_packages/codesign/pubspec.yaml @@ -8,10 +8,10 @@ environment: dev_dependencies: lints: 3.0.0 - test: 1.25.2 + test: 1.25.3 dependencies: archive: 3.4.10 - args: 2.4.2 + args: 2.5.0 crypto: 3.0.3 fake_async: 1.3.1 file: 7.0.0 diff --git a/cipd_packages/device_doctor/pubspec.yaml b/cipd_packages/device_doctor/pubspec.yaml index 662f8de57..95ec796ee 100644 --- a/cipd_packages/device_doctor/pubspec.yaml +++ b/cipd_packages/device_doctor/pubspec.yaml @@ -7,7 +7,7 @@ environment: dependencies: analyzer: 6.4.1 - args: 2.4.2 + args: 2.5.0 logging: 1.2.0 meta: 1.14.0 path: 1.9.0 @@ -19,4 +19,4 @@ dev_dependencies: build_runner: 2.4.9 fake_async: 1.3.1 mockito: 5.4.4 - test: 1.25.2 + test: 1.25.3 diff --git a/dashboard/lib/service/appengine_cocoon.dart b/dashboard/lib/service/appengine_cocoon.dart index 2119846df..1189b980f 100644 --- a/dashboard/lib/service/appengine_cocoon.dart +++ b/dashboard/lib/service/appengine_cocoon.dart @@ -56,7 +56,7 @@ class AppEngineCocoonService implements CocoonService { static const String kTaskEndTimestamp = 'EndTimestamp'; static const String kTaskStartTimestamp = 'StartTimestamp'; static const String kTaskStatus = 'Status'; - static const String kTaskTaskNmae = 'TaskName'; + static const String kTaskTaskName = 'TaskName'; static const String kTaskTestFlaky = 'TestFlaky'; final http.Client _client; @@ -407,7 +407,7 @@ class AppEngineCocoonService implements CocoonService { ..startTimestamp = Int64(taskData[kTaskStartTimestamp] as int) ..endTimestamp = Int64(taskData[kTaskEndTimestamp] as int) ..documentName = taskData[kTaskDocumentName] as String - ..taskName = taskData[kTaskTaskNmae] as String + ..taskName = taskData[kTaskTaskName] as String ..attempts = taskData[kTaskAttempts] as int ..bringup = taskData[kTaskBringup] as bool ..status = taskData[kTaskStatus] as String diff --git a/dashboard/pubspec.yaml b/dashboard/pubspec.yaml index b673ac9cb..d2a060daf 100644 --- a/dashboard/pubspec.yaml +++ b/dashboard/pubspec.yaml @@ -24,7 +24,7 @@ dependencies: protobuf: 3.1.0 # Rolled by dependabot provider: 6.1.2 # Rolled by dependabot truncate: 3.0.1 # Rolled by dependabot - url_launcher: 6.2.5 # Rolled by dependabot + url_launcher: 6.2.6 # Rolled by dependabot url_launcher_platform_interface: 2.3.2 # Rolled by dependabot url_launcher_web: 2.2.3 # Rolled by dependabot diff --git a/gh_actions/third_party/no-response/package-lock.json b/gh_actions/third_party/no-response/package-lock.json index d0c245872..f079671ac 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@actions/core": "^1.10.1", "@actions/github": "^6.0.0", - "@typescript-eslint/eslint-plugin": "^7.5.0", + "@typescript-eslint/eslint-plugin": "^7.6.0", "eslint-plugin-prettier": "^5.1.3", "scramjet": "^4.37.0" }, @@ -19,7 +19,7 @@ "@octokit/webhooks-types": "^7.5.0", "@types/jest": "^29.5.12", "@types/node": "^20.12.5", - "@typescript-eslint/parser": "^7.5.0", + "@typescript-eslint/parser": "^7.6.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.57.0", "eslint-plugin-github": "^4.10.2", @@ -29,7 +29,7 @@ "js-yaml": "^4.1.0", "prettier": "3.2.5", "ts-jest": "^29.1.2", - "typescript": "^5.4.4" + "typescript": "^5.4.5" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -1635,21 +1635,21 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.5.0.tgz", - "integrity": "sha512-HpqNTH8Du34nLxbKgVMGljZMG0rJd2O9ecvr2QLYp+7512ty1j42KnsFwspPXg1Vh8an9YImf6CokUBltisZFQ==", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.5.0", - "@typescript-eslint/type-utils": "7.5.0", - "@typescript-eslint/utils": "7.5.0", - "@typescript-eslint/visitor-keys": "7.5.0", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz", + "integrity": "sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/type-utils": "7.6.0", + "@typescript-eslint/utils": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1669,12 +1669,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz", - "integrity": "sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz", + "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==", "dependencies": { - "@typescript-eslint/types": "7.5.0", - "@typescript-eslint/visitor-keys": "7.5.0" + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1685,9 +1685,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.5.0.tgz", - "integrity": "sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz", + "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==", "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -1697,18 +1697,18 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz", - "integrity": "sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz", + "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==", "dependencies": { - "@typescript-eslint/types": "7.5.0", - "@typescript-eslint/visitor-keys": "7.5.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1724,17 +1724,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.5.0.tgz", - "integrity": "sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.6.0.tgz", + "integrity": "sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.5.0", - "@typescript-eslint/types": "7.5.0", - "@typescript-eslint/typescript-estree": "7.5.0", - "semver": "^7.5.4" + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/typescript-estree": "7.6.0", + "semver": "^7.6.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1748,12 +1748,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz", - "integrity": "sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz", + "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==", "dependencies": { - "@typescript-eslint/types": "7.5.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.6.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1763,15 +1763,29 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/parser": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.5.0.tgz", - "integrity": "sha512-cj+XGhNujfD2/wzR1tabNsidnYRaFfEkcULdcIyVBYcXjBvBKOes+mpMBP7hMpOyk+gBcfXsrg4NBGAStQyxjQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==", "dependencies": { - "@typescript-eslint/scope-manager": "7.5.0", - "@typescript-eslint/types": "7.5.0", - "@typescript-eslint/typescript-estree": "7.5.0", - "@typescript-eslint/visitor-keys": "7.5.0", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/typescript-estree": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", "debug": "^4.3.4" }, "engines": { @@ -1791,12 +1805,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz", - "integrity": "sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz", + "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==", "dependencies": { - "@typescript-eslint/types": "7.5.0", - "@typescript-eslint/visitor-keys": "7.5.0" + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1807,9 +1821,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.5.0.tgz", - "integrity": "sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz", + "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==", "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -1819,18 +1833,18 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz", - "integrity": "sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz", + "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==", "dependencies": { - "@typescript-eslint/types": "7.5.0", - "@typescript-eslint/visitor-keys": "7.5.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1846,12 +1860,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz", - "integrity": "sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz", + "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==", "dependencies": { - "@typescript-eslint/types": "7.5.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.6.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1861,6 +1875,20 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", @@ -1879,14 +1907,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.5.0.tgz", - "integrity": "sha512-A021Rj33+G8mx2Dqh0nMO9GyjjIBK3MqgVgZ2qlKf6CJy51wY/lkkFqq3TqqnH34XyAHUkq27IjlUkWlQRpLHw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.6.0.tgz", + "integrity": "sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==", "dependencies": { - "@typescript-eslint/typescript-estree": "7.5.0", - "@typescript-eslint/utils": "7.5.0", + "@typescript-eslint/typescript-estree": "7.6.0", + "@typescript-eslint/utils": "7.6.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1905,12 +1933,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz", - "integrity": "sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz", + "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==", "dependencies": { - "@typescript-eslint/types": "7.5.0", - "@typescript-eslint/visitor-keys": "7.5.0" + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1921,9 +1949,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.5.0.tgz", - "integrity": "sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz", + "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==", "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -1933,18 +1961,18 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz", - "integrity": "sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz", + "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==", "dependencies": { - "@typescript-eslint/types": "7.5.0", - "@typescript-eslint/visitor-keys": "7.5.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1960,17 +1988,17 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.5.0.tgz", - "integrity": "sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.6.0.tgz", + "integrity": "sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.5.0", - "@typescript-eslint/types": "7.5.0", - "@typescript-eslint/typescript-estree": "7.5.0", - "semver": "^7.5.4" + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/typescript-estree": "7.6.0", + "semver": "^7.6.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1984,12 +2012,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz", - "integrity": "sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz", + "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==", "dependencies": { - "@typescript-eslint/types": "7.5.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.6.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1999,6 +2027,20 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", @@ -6939,9 +6981,9 @@ } }, "node_modules/typescript": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", - "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index 42da13eb1..9baa417fb 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -27,7 +27,7 @@ "dependencies": { "@actions/core": "^1.10.1", "@actions/github": "^6.0.0", - "@typescript-eslint/eslint-plugin": "^7.5.0", + "@typescript-eslint/eslint-plugin": "^7.6.0", "eslint-plugin-prettier": "^5.1.3", "scramjet": "^4.37.0" }, @@ -35,7 +35,7 @@ "@octokit/webhooks-types": "^7.5.0", "@types/jest": "^29.5.12", "@types/node": "^20.12.5", - "@typescript-eslint/parser": "^7.5.0", + "@typescript-eslint/parser": "^7.6.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.57.0", "eslint-plugin-github": "^4.10.2", @@ -45,6 +45,6 @@ "js-yaml": "^4.1.0", "prettier": "3.2.5", "ts-jest": "^29.1.2", - "typescript": "^5.4.4" + "typescript": "^5.4.5" } } diff --git a/licenses/pubspec.yaml b/licenses/pubspec.yaml index 4f23d15f3..1a6f153e3 100644 --- a/licenses/pubspec.yaml +++ b/licenses/pubspec.yaml @@ -10,4 +10,4 @@ dependencies: dev_dependencies: mockito: 5.4.4 - test_api: 0.7.0 + test_api: 0.7.1 diff --git a/test_utilities/pubspec.yaml b/test_utilities/pubspec.yaml index db0be447a..82fd7185d 100644 --- a/test_utilities/pubspec.yaml +++ b/test_utilities/pubspec.yaml @@ -10,6 +10,6 @@ environment: sdk: '>=2.18.0 < 4.0.0' dev_dependencies: - args: 2.4.2 + args: 2.5.0 yaml: 3.1.2 path: 1.9.0