diff --git a/.ci.yaml b/.ci.yaml index 2dfe0d32c..22d7c6847 100644 --- a/.ci.yaml +++ b/.ci.yaml @@ -155,6 +155,16 @@ targets: - cipd_packages/ruby/** - .ci.yaml + - name: Linux ktlint + recipe: cocoon/cipd + timeout: 60 + properties: + script: cipd_packages/ktlint/tools/build.sh + cipd_name: flutter/ktlint/linux-amd64 + runIf: + - cipd_packages/ktlint/** + - .ci.yaml + - name: Linux ci_yaml roller recipe: infra/ci_yaml properties: diff --git a/CODEOWNERS b/CODEOWNERS index 65a0afadc..2f9754e51 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -40,6 +40,7 @@ triage_bot @Hix cipd_packages/codesign/** @XilaiZhang cipd_packages/device_doctor/** @yusuf-goog cipd_packages/doxygen/** @gspencergoog +cipd_packages/ktlint/** @gmackall cipd_packages/ruby/** @godofredoc ## gh_actions diff --git a/app_dart/integration_test/data/cocoon_config.json b/app_dart/integration_test/data/cocoon_config.json index 4d4d4787d..cd0c41708 100644 --- a/app_dart/integration_test/data/cocoon_config.json +++ b/app_dart/integration_test/data/cocoon_config.json @@ -1 +1 @@ -{"targets":[{"name":"Linux Cocoon","properties":{"add_recipes_cq":"true"},"runIf":[".ci.yaml","analyze/**","app_dart/**","auto_submit/**","cipd_packages/**","cloud_build/**","dashboard/**","dev/**","licenses/**","packages/**","test_utilities/**","tooling/**","CI_YAML.md"],"recipe":"cocoon/cocoon"},{"name":"Linux device_doctor","properties":{"script":"cipd_packages/device_doctor/tool/build.sh","cipd_name":"flutter/device_doctor/linux-amd64"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac device_doctor","properties":{"script":"cipd_packages/device_doctor/tool/build.sh","cipd_name":"flutter/device_doctor/mac-amd64","device_type":"none"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac_arm64 device_doctor","properties":{"script":"cipd_packages/device_doctor/tool/build.sh","cipd_name":"flutter/device_doctor/mac-arm64","device_type":"none"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Windows device_doctor","properties":{"script":"cipd_packages\\device_doctor\\tool\\build.bat","cipd_name":"flutter/device_doctor/windows-amd64"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Linux doxygen","properties":{"script":"cipd_packages/doxygen/tool/build.sh","cipd_name":"flutter/doxygen/linux-amd64","dependencies":"[\n {\"dependency\": \"cmake\", \"version\": \"build_id:8787856497187628321\"}\n]"},"runIf":["cipd_packages/doxygen/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac codesign","properties":{"script":"cipd_packages/codesign/tool/build.sh","cipd_name":"flutter/codesign/mac-amd64","device_type":"none"},"runIf":["cipd_packages/codesign/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac_arm64 codesign","properties":{"script":"cipd_packages/codesign/tool/build.sh","cipd_name":"flutter/codesign/mac-arm64","device_type":"none"},"runIf":["cipd_packages/codesign/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac ruby","timeout":60,"properties":{"script":"cipd_packages/ruby/tools/build.sh","cipd_name":"flutter/ruby/mac-amd64","device_os":"iOS","contexts":"[\n \"osx_sdk_devicelab\"\n]","$flutter/osx_sdk":"{\n \"sdk_version\": \"14e300c\"\n}"},"runIf":["cipd_packages/ruby/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac_arm64 ruby","timeout":60,"properties":{"script":"cipd_packages/ruby/tools/build.sh","cipd_name":"flutter/ruby/mac-arm64","device_os":"iOS","contexts":"[\n \"osx_sdk_devicelab\"\n]","$flutter/osx_sdk":"{\n \"sdk_version\": \"14e300c\"\n}"},"runIf":["cipd_packages/ruby/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Linux ci_yaml roller","properties":{"backfill":"false"},"runIf":[".ci.yaml"],"recipe":"infra/ci_yaml"}],"enabledBranches":["main"],"platformProperties":{"linux":{"properties":{"os":"Linux","device_type":"none"}},"mac":{"properties":{"os":"Mac-12|Mac-13","cpu":"x86"}},"mac_arm64":{"properties":{"os":"Mac-12|Mac-13","cpu":"arm64"}},"windows":{"properties":{"os":"Windows","device_type":"none"}}}} +{"targets":[{"name":"Linux Cocoon","properties":{"add_recipes_cq":"true"},"runIf":[".ci.yaml","analyze/**","app_dart/**","auto_submit/**","cipd_packages/**","cloud_build/**","dashboard/**","dev/**","licenses/**","packages/**","test_utilities/**","tooling/**","CI_YAML.md"],"recipe":"cocoon/cocoon"},{"name":"Linux device_doctor","properties":{"script":"cipd_packages/device_doctor/tool/build.sh","cipd_name":"flutter/device_doctor/linux-amd64"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac device_doctor","properties":{"script":"cipd_packages/device_doctor/tool/build.sh","cipd_name":"flutter/device_doctor/mac-amd64","device_type":"none"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac_arm64 device_doctor","properties":{"script":"cipd_packages/device_doctor/tool/build.sh","cipd_name":"flutter/device_doctor/mac-arm64","device_type":"none"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Windows device_doctor","properties":{"script":"cipd_packages\\device_doctor\\tool\\build.bat","cipd_name":"flutter/device_doctor/windows-amd64"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Linux doxygen","properties":{"script":"cipd_packages/doxygen/tool/build.sh","cipd_name":"flutter/doxygen/linux-amd64","dependencies":"[\n {\"dependency\": \"cmake\", \"version\": \"build_id:8787856497187628321\"}\n]"},"runIf":["cipd_packages/doxygen/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac codesign","properties":{"script":"cipd_packages/codesign/tool/build.sh","cipd_name":"flutter/codesign/mac-amd64","device_type":"none"},"runIf":["cipd_packages/codesign/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac_arm64 codesign","properties":{"script":"cipd_packages/codesign/tool/build.sh","cipd_name":"flutter/codesign/mac-arm64","device_type":"none"},"runIf":["cipd_packages/codesign/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac ruby","timeout":60,"properties":{"script":"cipd_packages/ruby/tools/build.sh","cipd_name":"flutter/ruby/mac-amd64","device_os":"iOS","contexts":"[\n \"osx_sdk_devicelab\"\n]","$flutter/osx_sdk":"{\n \"sdk_version\": \"14e300c\"\n}"},"runIf":["cipd_packages/ruby/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac_arm64 ruby","timeout":60,"properties":{"script":"cipd_packages/ruby/tools/build.sh","cipd_name":"flutter/ruby/mac-arm64","device_os":"iOS","contexts":"[\n \"osx_sdk_devicelab\"\n]","$flutter/osx_sdk":"{\n \"sdk_version\": \"14e300c\"\n}"},"runIf":["cipd_packages/ruby/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Linux ktlint","timeout":60,"properties":{"script":"cipd_packages/ktlint/tools/build.sh","cipd_name":"flutter/ktlint/linux-amd64"},"runIf":["cipd_packages/ktlint/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Linux ci_yaml roller","properties":{"backfill":"false"},"runIf":[".ci.yaml"],"recipe":"infra/ci_yaml"}],"enabledBranches":["main"],"platformProperties":{"linux":{"properties":{"os":"Linux","device_type":"none"}},"mac":{"properties":{"os":"Mac-12|Mac-13","cpu":"x86"}},"mac_arm64":{"properties":{"os":"Mac-12|Mac-13","cpu":"arm64"}},"windows":{"properties":{"os":"Windows","device_type":"none"}}}} diff --git a/app_dart/lib/src/model/firestore/github_build_status.dart b/app_dart/lib/src/model/firestore/github_build_status.dart new file mode 100644 index 000000000..d2502b89c --- /dev/null +++ b/app_dart/lib/src/model/firestore/github_build_status.dart @@ -0,0 +1,96 @@ +// 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/cocoon_service.dart'; +import 'package:github/github.dart'; +import 'package:googleapis/firestore/v1.dart' hide Status; + +import '../../service/firestore.dart'; +import '../appengine/github_build_status_update.dart'; + +const String kGithubBuildStatusCollectionId = 'githubBuildStatuses'; +const String kGithubBuildStatusPrNumberField = 'prNumber'; +const String kGithubBuildStatusRepositoryField = 'repository'; +const String kGithubBuildStatusHeadField = 'head'; +const String kGithubBuildStatusStatusField = 'status'; +const String kGithubBuildStatusUpdateTimeMillisField = 'updateTimeMillis'; +const String kGithubBuildStatusUpdatesField = 'updates'; + +/// Class that represents an update having been posted to a GitHub PR on the +/// status of the Flutter build. +class GithubBuildStatus extends Document { + /// Lookup [GithubBuildStatus] from Firestore. + /// + /// `documentName` follows `/projects/{project}/databases/{database}/documents/{document_path}` + static Future fromFirestore({ + required FirestoreService firestoreService, + required String documentName, + }) async { + final Document document = await firestoreService.getDocument(documentName); + return GithubBuildStatus.fromDocument(githubBuildStatus: document); + } + + /// Create [GithubBuildStatus] from a GithubBuildStatus Document. + static GithubBuildStatus fromDocument({ + required Document githubBuildStatus, + }) { + return GithubBuildStatus() + ..fields = githubBuildStatus.fields! + ..name = githubBuildStatus.name!; + } + + static const String statusSuccess = 'success'; + + static const String statusFailure = 'failure'; + + int? get prNumber => int.parse(fields![kGithubBuildStatusPrNumberField]!.integerValue!); + + /// A serializable form of [slug]. + /// + /// This will be of the form `/`. e.g. `flutter/flutter`. + String? get repository => fields![kGithubBuildStatusRepositoryField]!.stringValue!; + + /// [RepositorySlug] of where this commit exists. + RepositorySlug get slug => RepositorySlug.full(repository!); + + String? get head => fields![kGithubBuildStatusHeadField]!.stringValue!; + + String? get status => fields![kGithubBuildStatusStatusField]!.stringValue!; + + /// The last time when the status is updated for the PR. + int? get updateTimeMillis => int.parse(fields![kGithubBuildStatusUpdateTimeMillisField]!.integerValue!); + + int? get updates => int.parse(fields![kGithubBuildStatusUpdatesField]!.integerValue!); + + @override + String toString() { + final StringBuffer buf = StringBuffer() + ..write('$runtimeType(') + ..write(', $kGithubBuildStatusRepositoryField: $repository') + ..write(', $kGithubBuildStatusPrNumberField: $prNumber') + ..write(', $kGithubBuildStatusHeadField: $head') + ..write(', $kGithubBuildStatusStatusField: $status') + ..write(', $kGithubBuildStatusUpdatesField: $updates') + ..write(', $kGithubBuildStatusUpdateTimeMillisField: $updateTimeMillis') + ..write(')'); + return buf.toString(); + } +} + +/// Generates GithubGoldStatus document based on datastore GithubGoldStatusUpdate data model. +GithubBuildStatus githubBuildStatusToDocument(GithubBuildStatusUpdate githubBuildStatus) { + return GithubBuildStatus.fromDocument( + githubBuildStatus: Document( + name: '$kDatabase/documents/$kGithubBuildStatusCollectionId/${githubBuildStatus.head}_${githubBuildStatus.pr}', + fields: { + kGithubBuildStatusUpdateTimeMillisField: Value(stringValue: githubBuildStatus.updateTimeMillis.toString()), + kGithubBuildStatusHeadField: Value(stringValue: githubBuildStatus.head), + kGithubBuildStatusPrNumberField: Value(integerValue: githubBuildStatus.pr.toString()), + kGithubBuildStatusRepositoryField: Value(stringValue: githubBuildStatus.repository), + kGithubBuildStatusStatusField: Value(stringValue: githubBuildStatus.status), + kGithubBuildStatusUpdatesField: Value(integerValue: githubBuildStatus.updates.toString()), + }, + ), + ); +} diff --git a/app_dart/lib/src/model/firestore/github_gold_status.dart b/app_dart/lib/src/model/firestore/github_gold_status.dart index 78218d768..7ac9b7bd2 100644 --- a/app_dart/lib/src/model/firestore/github_gold_status.dart +++ b/app_dart/lib/src/model/firestore/github_gold_status.dart @@ -20,7 +20,7 @@ class GithubGoldStatus extends Document { return GithubGoldStatus.fromDocument(githubGoldStatus: document); } - /// Create [Commit] from a Commit Document. + /// Create [GithubGoldStatus] from a GithubGoldStatus Document. static GithubGoldStatus fromDocument({ required Document githubGoldStatus, }) { diff --git a/app_dart/lib/src/request_handlers/push_build_status_to_github.dart b/app_dart/lib/src/request_handlers/push_build_status_to_github.dart index 7c0de9130..9f8e281ea 100644 --- a/app_dart/lib/src/request_handlers/push_build_status_to_github.dart +++ b/app_dart/lib/src/request_handlers/push_build_status_to_github.dart @@ -5,10 +5,12 @@ import 'dart:async'; import 'package:github/github.dart'; +import 'package:googleapis/firestore/v1.dart'; import 'package:meta/meta.dart'; import '../../cocoon_service.dart'; import '../model/appengine/github_build_status_update.dart'; +import '../model/firestore/github_build_status.dart'; import '../request_handling/api_request_handler.dart'; import '../service/build_status_provider.dart'; import '../service/datastore.dart'; @@ -79,6 +81,24 @@ class PushBuildStatusToGithub extends ApiRequestHandler { } } await datastore.insert(updates); + // TODO(keyonghan): remove try block after fully migrated to firestore + // https://github.com/flutter/flutter/issues/142951 + try { + await updateGithubBuildStatusDocuments(updates); + } catch (error) { + log.warning('Failed to update github build status in Firestore: $error'); + } + } + + Future updateGithubBuildStatusDocuments(List updates) async { + if (updates.isEmpty) { + return; + } + final List githubBuildStatusDocuments = + updates.map((e) => githubBuildStatusToDocument(e)).toList(); + final List writes = documentsToWrites(githubBuildStatusDocuments); + final FirestoreService firestoreService = await config.createFirestoreService(); + await firestoreService.batchWriteDocuments(BatchWriteRequest(writes: writes), kDatabase); } Future _insertBigquery(RepositorySlug slug, String status, String branch, Config config) async { diff --git a/app_dart/pubspec.yaml b/app_dart/pubspec.yaml index 0599de3c7..52349e3b4 100644 --- a/app_dart/pubspec.yaml +++ b/app_dart/pubspec.yaml @@ -22,7 +22,7 @@ dependencies: gcloud: 0.8.12 github: 9.23.0 googleapis: 12.0.0 - googleapis_auth: 1.4.2 + googleapis_auth: 1.5.0 gql: 1.0.1-alpha+1696717343881 graphql: 5.2.0-beta.7 grpc: 3.2.4 diff --git a/app_dart/test/model/firestore/github_build_status_test.dart b/app_dart/test/model/firestore/github_build_status_test.dart new file mode 100644 index 000000000..c2ecac14d --- /dev/null +++ b/app_dart/test/model/firestore/github_build_status_test.dart @@ -0,0 +1,72 @@ +// 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/appengine/github_build_status_update.dart'; +import 'package:cocoon_service/src/model/firestore/github_build_status.dart'; +import 'package:cocoon_service/src/service/firestore.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; + +import '../../src/utilities/entity_generators.dart'; +import '../../src/utilities/mocks.dart'; + +void main() { + group('GithubBuildStatus.fromFirestore', () { + late MockFirestoreService mockFirestoreService; + + setUp(() { + mockFirestoreService = MockFirestoreService(); + }); + + test('generates githubBuildStatus correctly', () async { + final GithubBuildStatus githubBuildStatus = generateFirestoreGithubBuildStatus(1); + when( + mockFirestoreService.getDocument( + captureAny, + ), + ).thenAnswer((Invocation invocation) { + return Future.value( + githubBuildStatus, + ); + }); + final GithubBuildStatus resultedGithubBuildStatus = await GithubBuildStatus.fromFirestore( + firestoreService: mockFirestoreService, + documentName: 'test', + ); + expect(resultedGithubBuildStatus.name, githubBuildStatus.name); + expect(resultedGithubBuildStatus.fields, githubBuildStatus.fields); + }); + }); + + group('Creates github gold status document', () { + test('from data model', () async { + final GithubBuildStatusUpdate githubBuildStatusUpdate = GithubBuildStatusUpdate( + head: 'sha', + pr: 1, + status: GithubBuildStatusUpdate.statusSuccess, + updates: 2, + repository: '', + ); + final GithubBuildStatus githubBuildStatusDocument = githubBuildStatusToDocument(githubBuildStatusUpdate); + expect( + githubBuildStatusDocument.name, + '$kDatabase/documents/$kGithubBuildStatusCollectionId/${githubBuildStatusUpdate.head}_${githubBuildStatusUpdate.pr}', + ); + expect(githubBuildStatusDocument.fields![kGithubBuildStatusHeadField]!.stringValue, githubBuildStatusUpdate.head); + expect( + githubBuildStatusDocument.fields![kGithubBuildStatusPrNumberField]!.integerValue, + githubBuildStatusUpdate.pr.toString(), + ); + expect( + githubBuildStatusDocument.fields![kGithubBuildStatusStatusField]!.stringValue, + githubBuildStatusUpdate.status, + ); + expect( + githubBuildStatusDocument.fields![kGithubBuildStatusUpdatesField]!.integerValue, + githubBuildStatusUpdate.updates.toString(), + ); + expect(githubBuildStatusDocument.fields![kGithubBuildStatusRepositoryField]!.stringValue, ''); + }); + }); +} diff --git a/app_dart/test/request_handlers/push_build_status_to_github_test.dart b/app_dart/test/request_handlers/push_build_status_to_github_test.dart index 17eff2fc5..b0c39d761 100644 --- a/app_dart/test/request_handlers/push_build_status_to_github_test.dart +++ b/app_dart/test/request_handlers/push_build_status_to_github_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'package:cocoon_service/src/model/appengine/github_build_status_update.dart'; +import 'package:cocoon_service/src/model/firestore/github_build_status.dart'; import 'package:cocoon_service/src/request_handlers/push_build_status_to_github.dart'; import 'package:cocoon_service/src/request_handling/body.dart'; import 'package:cocoon_service/src/service/build_status_provider.dart'; @@ -11,6 +12,7 @@ import 'package:cocoon_service/src/service/datastore.dart'; import 'package:gcloud/db.dart'; import 'package:github/github.dart'; import 'package:googleapis/bigquery/v2.dart' hide Model; +import 'package:googleapis/firestore/v1.dart'; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; @@ -27,6 +29,7 @@ import '../src/utilities/mocks.dart'; void main() { group('PushStatusToGithub', () { late FakeBuildStatusService buildStatusService; + late MockFirestoreService mockFirestoreService; late FakeClientContext clientContext; late FakeConfig config; late FakeDatastoreDB db; @@ -52,6 +55,7 @@ void main() { } setUp(() async { + mockFirestoreService = MockFirestoreService(); clientContext = FakeClientContext(); authContext = FakeAuthenticatedContext(clientContext: clientContext); clientContext.isDevelopmentEnvironment = false; @@ -67,6 +71,7 @@ void main() { tabledataResource: tabledataResourceApi, githubService: githubService, dbValue: db, + firestoreService: mockFirestoreService, githubClient: github, ); tester = ApiRequestHandlerTester(context: authContext); @@ -154,6 +159,14 @@ void main() { }); test('updates github and datastore if status has changed since last update', () async { + when( + mockFirestoreService.batchWriteDocuments( + captureAny, + captureAny, + ), + ).thenAnswer((Invocation invocation) { + return Future.value(BatchWriteResponse()); + }); final PullRequest pr = generatePullRequest(id: 1, sha: '1'); when(pullRequestsService.list(any, base: anyNamed('base'))).thenAnswer((_) => Stream.value(pr)); buildStatusService.cumulativeStatus = BuildStatus.success(); @@ -164,6 +177,14 @@ void main() { expect(status.updates, 1); expect(status.updateTimeMillis, isNotNull); expect(status.status, BuildStatus.success().githubStatus); + + final List captured = verify(mockFirestoreService.batchWriteDocuments(captureAny, captureAny)).captured; + expect(captured.length, 2); + final BatchWriteRequest batchWriteRequest = captured[0] as BatchWriteRequest; + expect(batchWriteRequest.writes!.length, 1); + final GithubBuildStatus updatedDocument = + GithubBuildStatus.fromDocument(githubBuildStatus: batchWriteRequest.writes![0].update!); + expect(updatedDocument.updates, status.updates); }); }); } diff --git a/app_dart/test/src/utilities/entity_generators.dart b/app_dart/test/src/utilities/entity_generators.dart index f0bbacc4c..f8e7df165 100644 --- a/app_dart/test/src/utilities/entity_generators.dart +++ b/app_dart/test/src/utilities/entity_generators.dart @@ -7,6 +7,7 @@ import 'package:cocoon_service/cocoon_service.dart'; import 'package:cocoon_service/src/model/appengine/commit.dart'; import 'package:cocoon_service/src/model/appengine/task.dart'; import 'package:cocoon_service/src/model/firestore/commit.dart' as firestore_commit; +import 'package:cocoon_service/src/model/firestore/github_build_status.dart'; import 'package:cocoon_service/src/model/firestore/github_gold_status.dart'; import 'package:cocoon_service/src/model/firestore/task.dart' as firestore; import 'package:cocoon_service/src/model/ci_yaml/target.dart'; @@ -162,7 +163,7 @@ GithubGoldStatus generateFirestoreGithubGoldStatus( }) { pr ??= i; head ??= 'sha$i'; - final GithubGoldStatus commit = GithubGoldStatus() + final GithubGoldStatus githubGoldStatus = GithubGoldStatus() ..name = '{$pr}_$head' ..fields = { kGithubGoldStatusHeadField: Value(stringValue: head), @@ -170,7 +171,28 @@ GithubGoldStatus generateFirestoreGithubGoldStatus( kGithubGoldStatusRepositoryField: Value(stringValue: '$owner/$repo'), kGithubGoldStatusUpdatesField: Value(integerValue: updates.toString()), }; - return commit; + return githubGoldStatus; +} + +GithubBuildStatus generateFirestoreGithubBuildStatus( + int i, { + String? head, + int? pr, + String owner = 'flutter', + String repo = 'flutter', + int? updates, +}) { + pr ??= i; + head ??= 'sha$i'; + final GithubBuildStatus githubBuildStatus = GithubBuildStatus() + ..name = '{$pr}_$head' + ..fields = { + kGithubBuildStatusHeadField: Value(stringValue: head), + kGithubBuildStatusPrNumberField: Value(integerValue: pr.toString()), + kGithubBuildStatusRepositoryField: Value(stringValue: '$owner/$repo'), + kGithubBuildStatusUpdatesField: Value(integerValue: updates.toString()), + }; + return githubBuildStatus; } Target generateTarget( diff --git a/auto_submit/lib/service/revert_issue_body_formatter.dart b/auto_submit/lib/service/revert_issue_body_formatter.dart index 56574938e..d20fd9af9 100644 --- a/auto_submit/lib/service/revert_issue_body_formatter.dart +++ b/auto_submit/lib/service/revert_issue_body_formatter.dart @@ -38,14 +38,14 @@ class RevertIssueBodyFormatter { revertPrTitle = 'Reverts "$prToRevertTitle (#$prToRevertNumber)"'; // create the reverts Link for the body. Looks like Reverts flutter/cocoon#123 but will render as a link. - revertPrLink = 'Reverts ${slug.fullName}#$prToRevertNumber'; + revertPrLink = '${slug.fullName}#$prToRevertNumber'; prToRevertBody ??= 'No description provided.'; // Create the body for the revert issue. revertPrBody = ''' -$revertPrLink +Reverts: $revertPrLink Initiated by: $initiatingAuthor @@ -63,7 +63,6 @@ Reviewed By: ${SetBase.setToString(prToRevertReviewers)} This change reverts the following previous change: -Original Description: $prToRevertBody '''; diff --git a/auto_submit/pubspec.yaml b/auto_submit/pubspec.yaml index dbf5a95df..14d0d6215 100644 --- a/auto_submit/pubspec.yaml +++ b/auto_submit/pubspec.yaml @@ -13,9 +13,9 @@ environment: dependencies: appengine: 0.13.7 corsac_jwt: 1.0.0-nullsafety.1 - github: 9.23.0 + github: 9.24.0 googleapis: 12.0.0 - googleapis_auth: 1.4.2 + googleapis_auth: 1.5.0 graphql: 5.2.0-beta.7 gql: 1.0.1-alpha+1691943394579 http: 1.2.1 diff --git a/cipd_packages/README.md b/cipd_packages/README.md index 9596db035..f0e04d420 100644 --- a/cipd_packages/README.md +++ b/cipd_packages/README.md @@ -13,8 +13,9 @@ necessary lib files if needed. Note: -1) we do not archive the binaries in the repo, and will auto build package artifacts and upload to CIPD via the bot. -2) please add a code owner entry under section `cipd packages` in [CODEOWNERS](https://github.com/flutter/cocoon/blob/main/CODEOWNERS) file. +1) make sure the build scripts create a `build` dir under the package folder and generate artifacts there +2) we do not archive the binaries in the repo, and they will be uploaded to cipd via a bot. +3) please add a code owner entry under section `cipd packages` in [CODEOWNERS](https://github.com/flutter/cocoon/blob/main/CODEOWNERS) file. ## Add an entry to cocoon .ci.yaml diff --git a/cipd_packages/ktlint/README.md b/cipd_packages/ktlint/README.md new file mode 100644 index 000000000..aa5ff8db7 --- /dev/null +++ b/cipd_packages/ktlint/README.md @@ -0,0 +1,14 @@ +# ktlint at Flutter + +The scripts in this folder are used to package the kotlin linter +ktlint as a self contained CIPD package. This package is used +for linting kotlin code in the flutter/flutter repository. + +# Updating to new ktlint versions. + +Update `ktlint_metadata.txt` with the major version +and the file name. New versions can be found at the releases page for ktlint +(https://github.com/pinterest/ktlint/releases). Before changing the version here, +you must also identify and resolve any new lints in flutter/flutter, by +running the new version of ktlint from the root of flutter/flutter (passing in the +current baseline). diff --git a/cipd_packages/ktlint/ktlint_metadata.txt b/cipd_packages/ktlint/ktlint_metadata.txt new file mode 100644 index 000000000..b11530828 --- /dev/null +++ b/cipd_packages/ktlint/ktlint_metadata.txt @@ -0,0 +1 @@ +1.1.1,ktlint diff --git a/cipd_packages/ktlint/tools/build.sh b/cipd_packages/ktlint/tools/build.sh new file mode 100644 index 000000000..53fea0859 --- /dev/null +++ b/cipd_packages/ktlint/tools/build.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# 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. + +# Script to build a self contained ktlint cipd package. + +set -e +set -x + +# Get the directory of this script. +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# Get versions from config files. +KTLINT_MAJOR_VERSION=$(cat $DIR/../ktlint_metadata.txt | cut -d ',' -f 1) +KTLINT_FILE_NAME=$(cat $DIR/../ktlint_metadata.txt | cut -d ',' -f 2) + +# Create the package structure. +rm -rf $DIR/../build && mkdir -p $DIR/../build + +curl -L https://github.com/pinterest/ktlint/releases/download/"$KTLINT_MAJOR_VERSION"/"$KTLINT_FILE_NAME" -o $DIR/../build/ktlint diff --git a/cipd_packages/ruby/README b/cipd_packages/ruby/README.md similarity index 100% rename from cipd_packages/ruby/README rename to cipd_packages/ruby/README.md diff --git a/dashboard/pubspec.yaml b/dashboard/pubspec.yaml index 41f88eb05..130edd93f 100644 --- a/dashboard/pubspec.yaml +++ b/dashboard/pubspec.yaml @@ -15,14 +15,14 @@ dependencies: sdk: flutter collection: any # Match Flutter SDK firebase_crashlytics: 3.4.15 # Rolled by dependabot - firebase_core: 2.25.4 # Rolled by dependabot + firebase_core: 2.25.5 # Rolled by dependabot fixnum: 1.1.0 # Rolled by dependabot flutter_app_icons: 0.0.9 # Rolled by dependabot google_sign_in: 6.2.1 # Rolled by dependabot google_sign_in_web: 0.12.3+2 # Rolled by dependabot http: 1.2.0 # Rolled by dependabot protobuf: 3.1.0 # Rolled by dependabot - provider: 6.1.1 # 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_platform_interface: 2.3.2 # 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 f645e749a..b18a6e143 100644 --- a/gh_actions/third_party/no-response/package-lock.json +++ b/gh_actions/third_party/no-response/package-lock.json @@ -17,11 +17,11 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.2", "@types/jest": "^29.5.12", - "@types/node": "^20.11.20", + "@types/node": "^20.11.24", "@typescript-eslint/parser": "^6.21.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.57.0", - "eslint-plugin-github": "^4.10.1", + "eslint-plugin-github": "^4.10.2", "eslint-plugin-jest": "^27.9.0", "extract-pr-titles": "^1.1.0", "jest": "^29.7.0", @@ -1554,9 +1554,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", - "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", + "version": "20.11.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", + "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1594,6 +1594,8 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.10.0", @@ -1629,6 +1631,8 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -1786,6 +1790,8 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/types": "6.10.0", "@typescript-eslint/visitor-keys": "6.10.0" @@ -1803,6 +1809,8 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/typescript-estree": "6.10.0", "@typescript-eslint/utils": "6.10.0", @@ -1830,6 +1838,8 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -1843,6 +1853,8 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/types": "6.10.0", "@typescript-eslint/visitor-keys": "6.10.0", @@ -1870,6 +1882,8 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -1885,6 +1899,8 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", @@ -1910,6 +1926,8 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -1925,6 +1943,8 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@typescript-eslint/types": "6.10.0", "eslint-visitor-keys": "^3.4.1" @@ -3143,14 +3163,14 @@ } }, "node_modules/eslint-plugin-github": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.10.1.tgz", - "integrity": "sha512-1AqQBockOM+m0ZUpwfjWtX0lWdX5cRi/hwJnSNvXoOmz/Hh+ULH6QFz6ENWueTWjoWpgPv0af3bj+snps6o4og==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.10.2.tgz", + "integrity": "sha512-F1F5aAFgi1Y5hYoTFzGQACBkw5W1hu2Fu5FSTrMlXqrojJnKl1S2pWO/rprlowRQpt+hzHhqSpsfnodJEVd5QA==", "dev": true, "dependencies": { "@github/browserslist-config": "^1.0.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", + "@typescript-eslint/eslint-plugin": "^7.0.1", + "@typescript-eslint/parser": "^7.0.1", "aria-query": "^5.3.0", "eslint-config-prettier": ">=8.0.0", "eslint-plugin-escompat": "^3.3.3", @@ -3173,6 +3193,235 @@ "eslint": "^8.0.1" } }, + "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz", + "integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/type-utils": "7.1.0", + "@typescript-eslint/utils": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz", + "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/scope-manager": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz", + "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/type-utils": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz", + "integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/utils": "7.1.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/types": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz", + "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz", + "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.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" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/utils": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz", + "integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", + "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.1.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-github/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-github/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-github/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-plugin-i18n-text": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz", @@ -8530,9 +8779,9 @@ "dev": true }, "@types/node": { - "version": "20.11.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", - "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", + "version": "20.11.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", + "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", "dev": true, "requires": { "undici-types": "~5.26.4" @@ -8570,6 +8819,8 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", "dev": true, + "optional": true, + "peer": true, "requires": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.10.0", @@ -8589,6 +8840,8 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "optional": true, + "peer": true, "requires": { "lru-cache": "^6.0.0" } @@ -8684,6 +8937,8 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", "dev": true, + "optional": true, + "peer": true, "requires": { "@typescript-eslint/types": "6.10.0", "@typescript-eslint/visitor-keys": "6.10.0" @@ -8694,6 +8949,8 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", "dev": true, + "optional": true, + "peer": true, "requires": { "@typescript-eslint/typescript-estree": "6.10.0", "@typescript-eslint/utils": "6.10.0", @@ -8705,13 +8962,17 @@ "version": "6.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "@typescript-eslint/typescript-estree": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", "dev": true, + "optional": true, + "peer": true, "requires": { "@typescript-eslint/types": "6.10.0", "@typescript-eslint/visitor-keys": "6.10.0", @@ -8727,6 +8988,8 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "optional": true, + "peer": true, "requires": { "lru-cache": "^6.0.0" } @@ -8738,6 +9001,8 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", "dev": true, + "optional": true, + "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", @@ -8753,6 +9018,8 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "optional": true, + "peer": true, "requires": { "lru-cache": "^6.0.0" } @@ -8764,6 +9031,8 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", "dev": true, + "optional": true, + "peer": true, "requires": { "@typescript-eslint/types": "6.10.0", "eslint-visitor-keys": "^3.4.1" @@ -9708,14 +9977,14 @@ } }, "eslint-plugin-github": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.10.1.tgz", - "integrity": "sha512-1AqQBockOM+m0ZUpwfjWtX0lWdX5cRi/hwJnSNvXoOmz/Hh+ULH6QFz6ENWueTWjoWpgPv0af3bj+snps6o4og==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.10.2.tgz", + "integrity": "sha512-F1F5aAFgi1Y5hYoTFzGQACBkw5W1hu2Fu5FSTrMlXqrojJnKl1S2pWO/rprlowRQpt+hzHhqSpsfnodJEVd5QA==", "dev": true, "requires": { "@github/browserslist-config": "^1.0.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", + "@typescript-eslint/eslint-plugin": "^7.0.1", + "@typescript-eslint/parser": "^7.0.1", "aria-query": "^5.3.0", "eslint-config-prettier": ">=8.0.0", "eslint-plugin-escompat": "^3.3.3", @@ -9730,6 +9999,136 @@ "jsx-ast-utils": "^3.3.2", "prettier": "^3.0.0", "svg-element-attributes": "^1.3.1" + }, + "dependencies": { + "@typescript-eslint/eslint-plugin": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz", + "integrity": "sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/type-utils": "7.1.0", + "@typescript-eslint/utils": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.0.tgz", + "integrity": "sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz", + "integrity": "sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz", + "integrity": "sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "7.1.0", + "@typescript-eslint/utils": "7.1.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.0.tgz", + "integrity": "sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz", + "integrity": "sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/visitor-keys": "7.1.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" + } + }, + "@typescript-eslint/utils": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.0.tgz", + "integrity": "sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.1.0", + "@typescript-eslint/types": "7.1.0", + "@typescript-eslint/typescript-estree": "7.1.0", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz", + "integrity": "sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.1.0", + "eslint-visitor-keys": "^3.4.1" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "eslint-plugin-i18n-text": { diff --git a/gh_actions/third_party/no-response/package.json b/gh_actions/third_party/no-response/package.json index ce43cc97c..f4290b930 100644 --- a/gh_actions/third_party/no-response/package.json +++ b/gh_actions/third_party/no-response/package.json @@ -33,11 +33,11 @@ "devDependencies": { "@octokit/webhooks-types": "^7.3.2", "@types/jest": "^29.5.12", - "@types/node": "^20.11.20", + "@types/node": "^20.11.24", "@typescript-eslint/parser": "^6.21.0", "@vercel/ncc": "^0.38.1", "eslint": "^8.57.0", - "eslint-plugin-github": "^4.10.1", + "eslint-plugin-github": "^4.10.2", "eslint-plugin-jest": "^27.9.0", "extract-pr-titles": "^1.1.0", "jest": "^29.7.0",