Repository: DefinitelyTyped/dt-mergebot
Pull request #423 (2021-09-06 21:49:22)

Add a ping about 'hey you can do tests for this'
Adds a message hinting that you can skip waiting on a DT owner

orta: Good from my side 👍🏻 

Patch:
diff --git a/.gitignore b/.gitignore
index beb6c85..262e60f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@
 /node_modules/
 /coverage/
 tsconfig.tsbuildinfo
+.DS_Store
\ No newline at end of file
diff --git a/src/comments.ts b/src/comments.ts
index 0216e28..6509cf9 100644
--- a/src/comments.ts
+++ b/src/comments.ts
@@ -1,4 +1,5 @@
 import { sha256, txt } from "./util/util";
+import * as urls from "./urls";
 
 // use `deletedWhenNotPresent` for comments that should be removed if not in the actions
 export const tagsToDeleteIfNotPosted: string[] = [];
@@ -120,6 +121,20 @@ export const WaitUntilMergeIsOK = (user: string, abbrOid: string, uri: string, m
         |Thanks, and happy typing!`
 });
 
+export const RemindPeopleTheyCanUnblockPR = (user: string, approvalUsers: string[], abbrOid: string) => ({
+    // at most one reminder per update
+    tag: `wait-for-merge-offer-${abbrOid}`,
+    status: txt`
+        |:hourglass_flowing_sand: Hi @${user},
+        |
+        |It's been a few days since this PR was approved by ${approvalUsers.join(", ")}
+         and we're waiting on a DT maintainer to give a review.
+        |
+        |If you would like to short-circuit this wait, you can edit some of the [test files](${urls.testsTs})
+         in the package which verify how the \`.d.ts\` files work. This would allow the PR to be
+         merged by you or the DT module owners after a re-review.`
+});
+
 // Explanation for the stalness count in the welcome message
 export const StalenessExplanations: { [k: string]: string } = {
     "Unmerged:nearly": "please merge or say something if there's a problem, otherwise it will be closed!",
diff --git a/src/compute-pr-actions.ts b/src/compute-pr-actions.ts
index 123c064..220a060 100644
--- a/src/compute-pr-actions.ts
+++ b/src/compute-pr-actions.ts
@@ -271,7 +271,7 @@ export function process(prInfo: BotResult,
         }
     }
 
-    // Some step should override actions.projectColumn, the default "Other" indicates a probelm
+    // Some step should override actions.projectColumn, the default "Other" indicates a problem
 
     // First-timers are blocked from CI runs until approved, this case is for infra edits (require a maintainer)
     if (info.ciResult === "action_required") {
@@ -330,6 +330,12 @@ export function process(prInfo: BotResult,
         post(Comments.WaitUntilMergeIsOK(info.mergeRequestUser, headCommitAbbrOid, urls.workflow, info.mainBotCommentID));
     }
 
+    // Has it: got no DT tests but is approved by DT modules and basically blocked by the DT maintainers - and it has been over 3 days?
+    // Send a message reminding them that they can un-block themselves by adding tests.
+    if (!info.hasTests && !info.hasMultiplePackages && info.approvedBy.includes("owner") && !info.editsInfra  && info.approverKind === "maintainer" && info.staleness && info.staleness.days > 3) {
+        post(Comments.RemindPeopleTheyCanUnblockPR(info.author, info.approvedReviews.map(r => r.reviewer), headCommitAbbrOid));
+    }
+
     // Timeline-related actions
     info.staleness?.doTimelineActions(actions);
 
diff --git a/src/urls.ts b/src/urls.ts
index d82e206..17ebbe8 100644
--- a/src/urls.ts
+++ b/src/urls.ts
@@ -11,6 +11,7 @@ export const otherFilesTxt = readmeLink("`OTHER_FILES.txt`");
 export const packageJson = readmeLink("`package.json`");
 export const linterJson = readmeLink("Linter: `tslint.json`");
 export const tsconfigJson = readmeLink("`tsconfig.json`");
+export const testsTs = readmeLink("`<my-package>-tests.ts`");
 
 export const playground = (prNum: number) =>
     `https://www.typescriptlang.org/play/?dtPR=${prNum}&install-plugin=playground-dt-review`;


Test patch:
diff --git a/src/_tests/fixtures/51338/mutations.json b/src/_tests/fixtures/51338/mutations.json
index 7c78dc6..70cd8e9 100644
--- a/src/_tests/fixtures/51338/mutations.json
+++ b/src/_tests/fixtures/51338/mutations.json
@@ -19,6 +19,15 @@
       }
     }
   },
+  {
+    "mutation": "mutation ($input: AddCommentInput!) {\n  addComment(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "subjectId": "MDExOlB1bGxSZXF1ZXN0NTc2NTk4OTQ2",
+        "body": ":hourglass_flowing_sand: Hi @pkuczynski,\n\nIt's been a few days since this PR was approved by tellnes and we're waiting on a DT maintainer to give a review.\n\nIf you would like to short-circuit this wait, you can edit some of the [test files](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-my-package-teststs) in the package which verify how the `.d.ts` files work. This would allow the PR to be merged by you or the DT module owners after a re-review.\n<!--typescript_bot_wait-for-merge-offer-4a7712f-->"
+      }
+    }
+  },
   {
     "mutation": "mutation ($input: AddCommentInput!) {\n  addComment(input: $input) {\n    __typename\n  }\n}\n",
     "variables": {
diff --git a/src/_tests/fixtures/51338/result.json b/src/_tests/fixtures/51338/result.json
index fd40f36..2ab5a3d 100644
--- a/src/_tests/fixtures/51338/result.json
+++ b/src/_tests/fixtures/51338/result.json
@@ -17,6 +17,10 @@
       "tag": "welcome",
       "status": "@pkuczynski Thank you for submitting this PR!\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `koa` — [on npm](https://www.npmjs.com/package/koa), [on unpkg](https://unpkg.com/browse/koa@latest/) (author is owner)\n  - owner-approval: @tellnes\n  - Config files to check:\n    - [`koa/tsconfig.json`](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/51338/files/4a7712f61d17eb33e89171f317deeb31b3d555ae#diff-1730c5405d0220a98f28feeec2de3f5a511ebc6a04ceadf12415b81de841672e): not [the expected form](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-tsconfigjson) and not moving towards it (check: `compilerOptions.esModuleInterop`)\n\n## Code Reviews\n\nBecause this is a widely-used package, a DT maintainer will need to review it before it can be merged.\n\nYou can test the changes of this PR [in the Playground](https://www.typescriptlang.org/play/?dtPR=51338&install-plugin=playground-dt-review).\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 A DT maintainer needs to approve changes which affect module config files\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n## Inactive\n\nThis PR has been inactive for 11 days — please try to get reviewers!\n\n----------------------\n... diagnostics scrubbed ..."
     },
+    {
+      "tag": "wait-for-merge-offer-4a7712f",
+      "status": ":hourglass_flowing_sand: Hi @pkuczynski,\n\nIt's been a few days since this PR was approved by tellnes and we're waiting on a DT maintainer to give a review.\n\nIf you would like to short-circuit this wait, you can edit some of the [test files](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-my-package-teststs) in the package which verify how the `.d.ts` files work. This would allow the PR to be merged by you or the DT module owners after a re-review."
+    },
     {
       "tag": "Unreviewed:nearly:2021-02-19",
       "status": "Re-ping @DavidCai1993, @jkeylu, @brikou, @harryparkdotio, @chatoo2412:\n\nThis PR has been out for over a week, yet I haven't seen any reviews.\n\nCould someone please give it some attention? Thanks!"
diff --git a/src/_tests/fixtures/55508/_downloads.json b/src/_tests/fixtures/55508/_downloads.json
new file mode 100644
index 0000000..5a8d8d1
--- /dev/null
+++ b/src/_tests/fixtures/55508/_downloads.json
@@ -0,0 +1,3 @@
+{
+  "chrome": 702255
+}
diff --git a/src/_tests/fixtures/55508/_files.json b/src/_tests/fixtures/55508/_files.json
new file mode 100644
index 0000000..a1b4808
--- /dev/null
+++ b/src/_tests/fixtures/55508/_files.json
@@ -0,0 +1,4 @@
+{
+  "master:types/chrome/index.d.ts": "// Type definitions for Chrome extension development\n// Project: http://developer.chrome.com/extensions/\n// Definitions by: Matthew Kimber <https://github.com/matthewkimber>\n//                 otiai10 <https://github.com/otiai10>\n//                 couven92 <https://github.com/couven92>\n//                 RReverser <https://github.com/rreverser>\n//                 sreimer15 <https://github.com/sreimer15>\n//                 MatCarlson <https://github.com/MatCarlson>\n//                 ekinsol <https://github.com/ekinsol>\n//                 Thierry Régagnon <https://github.com/tregagnon>\n//                 Brian Wilson <https://github.com/echoabstract>\n//                 Sebastiaan Pasma <https://github.com/spasma>\n//                 bdbai <https://github.com/bdbai>\n//                 pokutuna <https://github.com/pokutuna>\n//                 Jason Xian <https://github.com/JasonXian>\n//                 userTim <https://github.com/usertim>\n//                 Idan Zeierman <https://github.com/idan315>\n//                 Nicolas Rodriguez <https://github.com/nicolas377>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.4\n\n/// <reference types=\"filesystem\" />\n/// <reference path=\"./har-format/index.d.ts\" />\n\n////////////////////\n// Global object\n////////////////////\ninterface Window {\n    chrome: typeof chrome;\n}\n\n////////////////////\n// Accessibility Features\n////////////////////\n/**\n * Use the chrome.accessibilityFeatures API to manage Chrome's accessibility features. This API relies on the ChromeSetting prototype of the type API for getting and setting individual accessibility features. In order to get feature states the extension must request accessibilityFeatures.read permission. For modifying feature state, the extension needs accessibilityFeatures.modify permission. Note that accessibilityFeatures.modify does not imply accessibilityFeatures.read permission.\n * Availability: Since Chrome 37.\n * Permissions: \"accessibilityFeatures.read\"\n * Important: This API works only on Chrome OS.\n */\ndeclare namespace chrome.accessibilityFeatures {\n    /** **ChromeOS only.** Spoken feedback (text-to-speech). */\n    export var spokenFeedback: chrome.types.ChromeSetting;\n    /** **ChromeOS only.** Enlarged cursor. */\n    export var largeCursor: chrome.types.ChromeSetting;\n    /** **ChromeOS only.** Sticky modifier keys (like shift or alt). */\n    export var stickyKeys: chrome.types.ChromeSetting;\n    /** **ChromeOS only.** High contrast rendering mode. */\n    export var highContrast: chrome.types.ChromeSetting;\n    /** **ChromeOS only.** Full screen magnification. */\n    export var screenMagnifier: chrome.types.ChromeSetting;\n    /** **ChromeOS only.** Auto mouse click after mouse stops moving. */\n    export var autoclick: chrome.types.ChromeSetting;\n    /** **ChromeOS only.** Virtual on-screen keyboard. */\n    export var virtualKeyboard: chrome.types.ChromeSetting;\n    /**\n     * **ChromeOS only.**\n     * Caret highlighting.\n     * @since Chrome 51.\n     */\n    export var caretHighlight: chrome.types.ChromeSetting;\n    /**\n     * **ChromeOS only.**\n     * Cursor highlighting.\n     * @since Chrome 51.\n     */\n    export var cursorHighlight: chrome.types.ChromeSetting;\n    /**\n     * **ChromeOS only.**\n     * Focus highlighting.\n     * @since Chrome 51.\n     */\n    export var focusHighlight: chrome.types.ChromeSetting;\n    /**\n     * **ChromeOS only.**\n     * Select-to-speak.\n     * @since Chrome 51.\n     */\n    export var selectToSpeak: chrome.types.ChromeSetting;\n    /**\n     * **ChromeOS only.**\n     * Switch Access.\n     * @since Chrome 51.\n     */\n    export var switchAccess: chrome.types.ChromeSetting;\n    /**\n     * @since Chrome 42.\n     */\n    export var animationPolicy: chrome.types.ChromeSetting;\n}\n\n////////////////////\n// Action\n////////////////////\n/**\n * Use the chrome.action API to control the extension's icon in the Google Chrome toolbar.\n * Availability: Since Chrome 88. Manifest v3.\n * Manifest:  \"action\": {...}\n */\ndeclare namespace chrome.action {\n    export interface BadgeBackgroundColorDetails {\n        /** An array of four integers in the range [0,255] that make up the RGBA color of the badge. For example, opaque red is [255, 0, 0, 255]. Can also be a string with a CSS value, with opaque red being #FF0000 or #F00. */\n        color: string | ColorArray;\n        /** Optional. Limits the change to when a particular tab is selected. Automatically resets when the tab is closed.  */\n        tabId?: number | undefined;\n    }\n\n    export interface BadgeTextDetails {\n        /** Any number of characters can be passed, but only about four can fit in the space. */\n        text: string;\n        /** Optional. Limits the change to when a particular tab is selected. Automatically resets when the tab is closed.  */\n        tabId?: number | undefined;\n    }\n\n    export type ColorArray = [number, number, number, number];\n\n    export interface TitleDetails {\n        /** The string the action should display when moused over. */\n        title: string;\n        /** Optional. Limits the change to when a particular tab is selected. Automatically resets when the tab is closed.  */\n        tabId?: number | undefined;\n    }\n\n    export interface PopupDetails {\n        /** Optional. Limits the change to when a particular tab is selected. Automatically resets when the tab is closed.  */\n        tabId?: number | undefined;\n        /** The html file to show in a popup. If set to the empty string (''), no popup is shown. */\n        popup: string;\n    }\n\n    export interface BrowserClickedEvent extends chrome.events.Event<(tab: chrome.tabs.Tab) => void> {}\n\n    export interface TabIconDetails {\n        /** Optional. Either a relative image path or a dictionary {size -> relative image path} pointing to icon to be set. If the icon is specified as a dictionary, the actual image to be used is chosen depending on screen's pixel density. If the number of image pixels that fit into one screen space unit equals scale, then image with size scale * 19 will be selected. Initially only scales 1 and 2 will be supported. At least one image must be specified. Note that 'details.path = foo' is equivalent to 'details.imageData = {'19': foo}'  */\n        path?: string | { [index: number]: string } | undefined;\n        /** Optional. Limits the change to when a particular tab is selected. Automatically resets when the tab is closed.  */\n        tabId?: number | undefined;\n        /** Optional. Either an ImageData object or a dictionary {size -> ImageData} representing icon to be set. If the icon is specified as a dictionary, the actual image to be used is chosen depending on screen's pixel density. If the number of image pixels that fit into one screen space unit equals scale, then image with size scale * 19 will be selected. Initially only scales 1 and 2 will be supported. At least one image must be specified. Note that 'details.imageData = foo' is equivalent to 'details.imageData = {'19': foo}'  */\n        imageData?: ImageData | { [index: number]: ImageData } | undefined;\n    }\n\n    export interface TabDetails {\n        /** Optional. The ID of the tab to query state for. If no tab is specified, the non-tab-specific state is returned.  */\n        tabId?: number | undefined;\n    }\n\n    /**\n     * Since Chrome 88.\n     * Disables the action for a tab.\n     * @param tabId The id of the tab for which you want to modify the action.\n     * @return The `disable` method provides its result via callback or returned as a `Promise` (MV3 only). It has no parameters.\n     */\n    export function disable(tabId?: number): Promise<void>;\n\n    /**\n     * Since Chrome 88.\n     * Disables the action for a tab.\n     * @param tabId The id of the tab for which you want to modify the action.\n     * @param callback\n     */\n    export function disable(tabId?: number, callback?: () => void): void;\n\n    /**\n     * Since Chrome 88.\n     * Enables the action for a tab. By default, actions are enabled.\n     * @param tabId The id of the tab for which you want to modify the action.\n     * @return The `enable` method provides its result via callback or returned as a `Promise` (MV3 only). It has no parameters.\n     */\n    export function enable(tabId?: number): Promise<void>;\n\n    /**\n     * Since Chrome 88.\n     * Enables the action for a tab. By default, actions are enabled.\n     * @param tabId The id of the tab for which you want to modify the action.\n     * @param callback\n     */\n    export function enable(tabId?: number, callback?: () => void): void;\n\n    /**\n     * Since Chrome 88.\n     * Gets the background color of the action.\n     * @param callback The callback parameter should be a function that looks like this:\n     * (result: ColorArray) => {...}\n     */\n    export function getBadgeBackgroundColor(details: TabDetails, callback: (result: ColorArray) => void): void;\n    /**\n     * Since Chrome 88.\n     * Gets the background color of the action.\n     * @return The `getBadgeBackgroundColor` method provides its result via callback or returned as a `Promise` (MV3 only).\n     */\n    export function getBadgeBackgroundColor(details: TabDetails): Promise<ColorArray>;\n\n    /**\n     * Since Chrome 88.\n     * Gets the badge text of the action. If no tab is specified, the non-tab-specific badge text is returned.\n     * If displayActionCountAsBadgeText is enabled, a placeholder text will be returned unless the\n     * declarativeNetRequestFeedback permission is present or tab-specific badge text was provided.\n     * @param callback The callback parameter should be a function that looks like this:\n     * (result: string) => {...}\n     */\n    export function getBadgeText(details: TabDetails, callback: (result: string) => void): void;\n\n    /**\n     * Since Chrome 88.\n     * Gets the badge text of the action. If no tab is specified, the non-tab-specific badge text is returned.\n     * If displayActionCountAsBadgeText is enabled, a placeholder text will be returned unless the\n     * declarativeNetRequestFeedback permission is present or tab-specific badge text was provided.\n     * @return The `getBadgeText` method provides its result via callback or returned as a `Promise` (MV3 only).\n     */",
+  "7288ad262198cd40a8457837580b67f9d1b68c7b:types/chrome/index.d.ts": "// Type definitions for Chrome extension development\n// Project: http://developer.chrome.com/extensions/\n// Definitions by: Matthew Kimber <https://github.com/matthewkimber>\n//                 otiai10 <https://github.com/otiai10>\n//                 couven92 <https://github.com/couven92>\n//                 RReverser <https://github.com/rreverser>\n//                 sreimer15 <https://github.com/sreimer15>\n//                 MatCarlson <https://github.com/MatCarlson>\n//                 ekinsol <https://github.com/ekinsol>\n//                 Thierry Régagnon <https://github.com/tregagnon>\n//                 Brian Wilson <https://github.com/echoabstract>\n//                 Sebastiaan Pasma <https://github.com/spasma>\n//                 bdbai <https://github.com/bdbai>\n//                 pokutuna <https://github.com/pokutuna>\n//                 Jason Xian <https://github.com/JasonXian>\n//                 userTim <https://github.com/usertim>\n//                 Idan Zeierman <https://github.com/idan315>\n//                 Nicolas Rodriguez <https://github.com/nicolas377>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.4\n\n/// <reference types=\"filesystem\" />\n/// <reference path=\"./har-format/index.d.ts\" />\n\n////////////////////\n// Global object\n////////////////////\ninterface Window {\n    chrome: typeof chrome;\n}\n\n////////////////////\n// Accessibility Features\n////////////////////\n/**\n * Use the chrome.accessibilityFeatures API to manage Chrome's accessibility features. This API relies on the ChromeSetting prototype of the type API for getting and setting individual accessibility features. In order to get feature states the extension must request accessibilityFeatures.read permission. For modifying feature state, the extension needs accessibilityFeatures.modify permission. Note that accessibilityFeatures.modify does not imply accessibilityFeatures.read permission.\n * Availability: Since Chrome 37.\n * Permissions: \"accessibilityFeatures.read\"\n * Important: This API works only on Chrome OS.\n */\ndeclare namespace chrome.accessibilityFeatures {\n    /** **ChromeOS only.** Spoken feedback (text-to-speech). */\n    export var spokenFeedback: chrome.types.ChromeSetting;\n    /** **ChromeOS only.** Enlarged cursor. */\n    export var largeCursor: chrome.types.ChromeSetting;\n    /** **ChromeOS only.** Sticky modifier keys (like shift or alt). */\n    export var stickyKeys: chrome.types.ChromeSetting;\n    /** **ChromeOS only.** High contrast rendering mode. */\n    export var highContrast: chrome.types.ChromeSetting;\n    /** **ChromeOS only.** Full screen magnification. */\n    export var screenMagnifier: chrome.types.ChromeSetting;\n    /** **ChromeOS only.** Auto mouse click after mouse stops moving. */\n    export var autoclick: chrome.types.ChromeSetting;\n    /** **ChromeOS only.** Virtual on-screen keyboard. */\n    export var virtualKeyboard: chrome.types.ChromeSetting;\n    /**\n     * **ChromeOS only.**\n     * Caret highlighting.\n     * @since Chrome 51.\n     */\n    export var caretHighlight: chrome.types.ChromeSetting;\n    /**\n     * **ChromeOS only.**\n     * Cursor highlighting.\n     * @since Chrome 51.\n     */\n    export var cursorHighlight: chrome.types.ChromeSetting;\n    /**\n     * **ChromeOS only.**\n     * Focus highlighting.\n     * @since Chrome 51.\n     */\n    export var focusHighlight: chrome.types.ChromeSetting;\n    /**\n     * **ChromeOS only.**\n     * Select-to-speak.\n     * @since Chrome 51.\n     */\n    export var selectToSpeak: chrome.types.ChromeSetting;\n    /**\n     * **ChromeOS only.**\n     * Switch Access.\n     * @since Chrome 51.\n     */\n    export var switchAccess: chrome.types.ChromeSetting;\n    /**\n     * @since Chrome 42.\n     */\n    export var animationPolicy: chrome.types.ChromeSetting;\n}\n\n////////////////////\n// Action\n////////////////////\n/**\n * Use the chrome.action API to control the extension's icon in the Google Chrome toolbar.\n * Availability: Since Chrome 88. Manifest v3.\n * Manifest:  \"action\": {...}\n */\ndeclare namespace chrome.action {\n    export interface BadgeBackgroundColorDetails {\n        /** An array of four integers in the range [0,255] that make up the RGBA color of the badge. For example, opaque red is [255, 0, 0, 255]. Can also be a string with a CSS value, with opaque red being #FF0000 or #F00. */\n        color: string | ColorArray;\n        /** Optional. Limits the change to when a particular tab is selected. Automatically resets when the tab is closed.  */\n        tabId?: number | undefined;\n    }\n\n    export interface BadgeTextDetails {\n        /** Any number of characters can be passed, but only about four can fit in the space. */\n        text: string;\n        /** Optional. Limits the change to when a particular tab is selected. Automatically resets when the tab is closed.  */\n        tabId?: number | undefined;\n    }\n\n    export type ColorArray = [number, number, number, number];\n\n    export interface TitleDetails {\n        /** The string the action should display when moused over. */\n        title: string;\n        /** Optional. Limits the change to when a particular tab is selected. Automatically resets when the tab is closed.  */\n        tabId?: number | undefined;\n    }\n\n    export interface PopupDetails {\n        /** Optional. Limits the change to when a particular tab is selected. Automatically resets when the tab is closed.  */\n        tabId?: number | undefined;\n        /** The html file to show in a popup. If set to the empty string (''), no popup is shown. */\n        popup: string;\n    }\n\n    export interface BrowserClickedEvent extends chrome.events.Event<(tab: chrome.tabs.Tab) => void> { }\n\n    export interface TabIconDetails {\n        /** Optional. Either a relative image path or a dictionary {size -> relative image path} pointing to icon to be set. If the icon is specified as a dictionary, the actual image to be used is chosen depending on screen's pixel density. If the number of image pixels that fit into one screen space unit equals scale, then image with size scale * 19 will be selected. Initially only scales 1 and 2 will be supported. At least one image must be specified. Note that 'details.path = foo' is equivalent to 'details.imageData = {'19': foo}'  */\n        path?: string | { [index: number]: string } | undefined;\n        /** Optional. Limits the change to when a particular tab is selected. Automatically resets when the tab is closed.  */\n        tabId?: number | undefined;\n        /** Optional. Either an ImageData object or a dictionary {size -> ImageData} representing icon to be set. If the icon is specified as a dictionary, the actual image to be used is chosen depending on screen's pixel density. If the number of image pixels that fit into one screen space unit equals scale, then image with size scale * 19 will be selected. Initially only scales 1 and 2 will be supported. At least one image must be specified. Note that 'details.imageData = foo' is equivalent to 'details.imageData = {'19': foo}'  */\n        imageData?: ImageData | { [index: number]: ImageData } | undefined;\n    }\n\n    export interface TabDetails {\n        /** Optional. The ID of the tab to query state for. If no tab is specified, the non-tab-specific state is returned.  */\n        tabId?: number | undefined;\n    }\n\n    /**\n     * Since Chrome 88.\n     * Disables the action for a tab.\n     * @param tabId The id of the tab for which you want to modify the action.\n     * @return The `disable` method provides its result via callback or returned as a `Promise` (MV3 only). It has no parameters.\n     */\n    export function disable(tabId: number): Promise<void>;\n\n    /**\n     * Since Chrome 88.\n     * Disables the action for a tab.\n     * @param tabId The id of the tab for which you want to modify the action.\n     * @param callback\n     */\n    export function disable(tabId: number, callback?: () => void): void;\n\n    /**\n     * Since Chrome 88.\n     * Enables the action for a tab. By default, actions are enabled.\n     * @param tabId The id of the tab for which you want to modify the action.\n     * @return The `enable` method provides its result via callback or returned as a `Promise` (MV3 only). It has no parameters.\n     */\n    export function enable(tabId: number): Promise<void>;\n\n    /**\n     * Since Chrome 88.\n     * Enables the action for a tab. By default, actions are enabled.\n     * @param tabId The id of the tab for which you want to modify the action.\n     * @param callback\n     */\n    export function enable(tabId: number, callback?: () => void): void;\n\n    /**\n     * Since Chrome 88.\n     * Gets the background color of the action.\n     * @param callback The callback parameter should be a function that looks like this:\n     * (result: ColorArray) => {...}\n     */\n    export function getBadgeBackgroundColor(details: TabDetails, callback: (result: ColorArray) => void): void;\n    /**\n     * Since Chrome 88.\n     * Gets the background color of the action.\n     * @return The `getBadgeBackgroundColor` method provides its result via callback or returned as a `Promise` (MV3 only).\n     */\n    export function getBadgeBackgroundColor(details: TabDetails): Promise<ColorArray>;\n\n    /**\n     * Since Chrome 88.\n     * Gets the badge text of the action. If no tab is specified, the non-tab-specific badge text is returned.\n     * If displayActionCountAsBadgeText is enabled, a placeholder text will be returned unless the\n     * declarativeNetRequestFeedback permission is present or tab-specific badge text was provided.\n     * @param callback The callback parameter should be a function that looks like this:\n     * (result: string) => {...}\n     */\n    export function getBadgeText(details: TabDetails, callback: (result: string) => void): void;\n\n    /**\n     * Since Chrome 88.\n     * Gets the badge text of the action. If no tab is specified, the non-tab-specific badge text is returned.\n     * If displayActionCountAsBadgeText is enabled, a placeholder text will be returned unless the\n     * declarativeNetRequestFeedback permission is present or tab-specific badge text was provided.\n     * @return The `getBadgeText` method provides its result via callback or returned as a `Promise` (MV3 only).\n     */\n  "
+}
diff --git a/src/_tests/fixtures/55508/_response.json b/src/_tests/fixtures/55508/_response.json
new file mode 100644
index 0000000..83e5eaf
--- /dev/null
+++ b/src/_tests/fixtures/55508/_response.json
@@ -0,0 +1,734 @@
+{
+  "data": {
+    "repository": {
+      "id": "MDEwOlJlcG9zaXRvcnk2MDkzMzE2",
+      "pullRequest": {
+        "id": "MDExOlB1bGxSZXF1ZXN0NzIzMzAzODAx",
+        "title": "Updated \"chrome.downloads\"",
+        "createdAt": "2021-08-31T12:00:59Z",
+        "author": {
+          "login": "avi12",
+          "__typename": "User"
+        },
+        "authorAssociation": "FIRST_TIME_CONTRIBUTOR",
+        "baseRef": {
+          "name": "master",
+          "__typename": "Ref"
+        },
+        "labels": {
+          "nodes": [
+            {
+              "name": "Popular package",
+              "__typename": "Label"
+            },
+            {
+              "name": "Owner Approved",
+              "__typename": "Label"
+            },
+            {
+              "name": "Untested Change",
+              "__typename": "Label"
+            }
+          ],
+          "__typename": "LabelConnection"
+        },
+        "isDraft": false,
+        "mergeable": "MERGEABLE",
+        "number": 55508,
+        "state": "OPEN",
+        "headRefOid": "7288ad262198cd40a8457837580b67f9d1b68c7b",
+        "changedFiles": 1,
+        "timelineItems": {
+          "nodes": [
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-08-31T12:06:45Z",
+              "projectColumnName": "Needs Maintainer Review",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-08-31T12:43:49Z",
+              "projectColumnName": "Needs Author Action",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-08-31T13:39:37Z",
+              "projectColumnName": "Waiting for Code Reviews",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-08-31T13:46:27Z",
+              "projectColumnName": "Needs Maintainer Review",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-08-31T14:55:01Z",
+              "projectColumnName": "Needs Author Action",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-09-01T09:13:52Z",
+              "projectColumnName": "Waiting for Code Reviews",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-09-01T09:18:44Z",
+              "projectColumnName": "Needs Author Action",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-09-01T10:25:50Z",
+              "projectColumnName": "Waiting for Code Reviews",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-09-01T10:30:47Z",
+              "projectColumnName": "Needs Author Action",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-09-01T12:12:50Z",
+              "projectColumnName": "Waiting for Code Reviews",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-09-01T12:17:44Z",
+              "projectColumnName": "Needs Maintainer Review",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-09-01T12:28:17Z",
+              "projectColumnName": "Needs Author Action",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-09-01T12:30:32Z",
+              "projectColumnName": "Waiting for Code Reviews",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-09-01T12:35:34Z",
+              "projectColumnName": "Needs Maintainer Review",
+              "__typename": "MovedColumnsInProjectEvent"
+            }
+          ],
+          "__typename": "PullRequestTimelineItemsConnection"
+        },
+        "reviews": {
+          "nodes": [
+            {
+              "author": {
+                "login": "nicolas377",
+                "__typename": "User"
+              },
+              "commit": {
+                "oid": "14188c3b9c7f7b8329485f86fccede3c883599fb",
+                "__typename": "Commit"
+              },
+              "comments": {
+                "nodes": [
+                  {
+                    "author": {
+                      "login": "nicolas377",
+                      "__typename": "User"
+                    },
+                    "createdAt": "2021-08-31T12:34:48Z",
+                    "__typename": "PullRequestReviewComment"
+                  },
+                  {
+                    "author": {
+                      "login": "nicolas377",
+                      "__typename": "User"
+                    },
+                    "createdAt": "2021-08-31T12:35:04Z",
+                    "__typename": "PullRequestReviewComment"
+                  }
+                ],
+                "__typename": "PullRequestReviewCommentConnection"
+              },
+              "authorAssociation": "CONTRIBUTOR",
+              "state": "CHANGES_REQUESTED",
+              "submittedAt": "2021-08-31T12:42:48Z",
+              "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/pull/55508#pullrequestreview-742666100",
+              "__typename": "PullRequestReview"
+            },
+            {
+              "author": {
+                "login": "avi12",
+                "__typename": "User"
+              },
+              "commit": {
+                "oid": "c90e5830dfdffafd7362a697a0b3026cdc9d3e85",
+                "__typename": "Commit"
+              },
+              "comments": {
+                "nodes": [
+                  {
+                    "author": {
+                      "login": "avi12",
+                      "__typename": "User"
+                    },
+                    "createdAt": "2021-08-31T13:41:33Z",
+                    "__typename": "PullRequestReviewComment"
+                  }
+                ],
+                "__typename": "PullRequestReviewCommentConnection"
+              },
+              "authorAssociation": "NONE",
+              "state": "COMMENTED",
+              "submittedAt": "2021-08-31T13:41:34Z",
+              "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/pull/55508#pullrequestreview-742744242",
+              "__typename": "PullRequestReview"
+            },
+            {
+              "author": {
+                "login": "avi12",
+                "__typename": "User"
+              },
+              "commit": {
+                "oid": "c90e5830dfdffafd7362a697a0b3026cdc9d3e85",
+                "__typename": "Commit"
+              },
+              "comments": {
+                "nodes": [
+                  {
+                    "author": {
+                      "login": "avi12",
+                      "__typename": "User"
+                    },
+                    "createdAt": "2021-08-31T13:42:00Z",
+                    "__typename": "PullRequestReviewComment"
+                  }
+                ],
+                "__typename": "PullRequestReviewCommentConnection"
+              },
+              "authorAssociation": "NONE",
+              "state": "COMMENTED",
+              "submittedAt": "2021-08-31T13:42:00Z",
+              "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/pull/55508#pullrequestreview-742744823",
+              "__typename": "PullRequestReview"
+            },
+            {
+              "author": {
+                "login": "nicolas377",
+                "__typename": "User"
+              },
+              "commit": {
+                "oid": "42183f97e87038014a22dccccc414c84054a5202",
+                "__typename": "Commit"
+              },
+              "comments": {
+                "nodes": [
+                  {
+                    "author": {
+                      "login": "nicolas377",
+                      "__typename": "User"
+                    },
+                    "createdAt": "2021-08-31T14:12:23Z",
+                    "__typename": "PullRequestReviewComment"
+                  },
+                  {
+                    "author": {
+                      "login": "nicolas377",
+                      "__typename": "User"
+                    },
+                    "createdAt": "2021-08-31T14:14:40Z",
+                    "__typename": "PullRequestReviewComment"
+                  },
+                  {
+                    "author": {
+                      "login": "nicolas377",
+                      "__typename": "User"
+                    },
+                    "createdAt": "2021-08-31T14:52:23Z",
+                    "__typename": "PullRequestReviewComment"
+                  },
+                  {
+                    "author": {
+                      "login": "nicolas377",
+                      "__typename": "User"
+                    },
+                    "createdAt": "2021-08-31T14:53:32Z",
+                    "__typename": "PullRequestReviewComment"
+                  }
+                ],
+                "__typename": "PullRequestReviewCommentConnection"
+              },
+              "authorAssociation": "CONTRIBUTOR",
+              "state": "CHANGES_REQUESTED",
+              "submittedAt": "2021-08-31T14:54:24Z",
+              "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/pull/55508#pullrequestreview-742784963",
+              "__typename": "PullRequestReview"
+            },
+            {
+              "author": {
+                "login": "nicolas377",
+                "__typename": "User"
+              },
+              "commit": {
+                "oid": "e531c812cd9e1c19d70b397e403612aa2186b598",
+                "__typename": "Commit"
+              },
+              "comments": {
+                "nodes": [
+                  {
+                    "author": {
+                      "login": "nicolas377",
+                      "__typename": "User"
+                    },
+                    "createdAt": "2021-09-01T12:27:21Z",
+                    "__typename": "PullRequestReviewComment"
+                  }
+                ],
+                "__typename": "PullRequestReviewCommentConnection"
+              },
+              "authorAssociation": "CONTRIBUTOR",
+              "state": "CHANGES_REQUESTED",
+              "submittedAt": "2021-09-01T12:27:43Z",
+              "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/pull/55508#pullrequestreview-743857405",
+              "__typename": "PullRequestReview"
+            },
+            {
+              "author": {
+                "login": "nicolas377",
+                "__typename": "User"
+              },
+              "commit": {
+                "oid": "7288ad262198cd40a8457837580b67f9d1b68c7b",
+                "__typename": "Commit"
+              },
+              "comments": {
+                "nodes": [],
+                "__typename": "PullRequestReviewCommentConnection"
+              },
+              "authorAssociation": "CONTRIBUTOR",
+              "state": "APPROVED",
+              "submittedAt": "2021-09-01T12:38:30Z",
+              "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/pull/55508#pullrequestreview-743868774",
+              "__typename": "PullRequestReview"
+            },
+            {
+              "author": {
+                "login": "userTim",
+                "__typename": "User"
+              },
+              "commit": {
+                "oid": "7288ad262198cd40a8457837580b67f9d1b68c7b",
+                "__typename": "Commit"
+              },
+              "comments": {
+                "nodes": [],
+                "__typename": "PullRequestReviewCommentConnection"
+              },
+              "authorAssociation": "CONTRIBUTOR",
+              "state": "APPROVED",
+              "submittedAt": "2021-09-01T14:59:00Z",
+              "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/pull/55508#pullrequestreview-744045372",
+              "__typename": "PullRequestReview"
+            }
+          ],
+          "__typename": "PullRequestReviewConnection"
+        },
+        "commits": {
+          "totalCount": 7,
+          "nodes": [
+            {
+              "commit": {
+                "checkSuites": {
+                  "nodes": [
+                    {
+                      "databaseId": 3652983301,
+                      "app": {
+                        "name": "GitHub Actions",
+                        "__typename": "App"
+                      },
+                      "conclusion": "SUCCESS",
+                      "resourcePath": "/DefinitelyTyped/DefinitelyTyped/commit/7288ad262198cd40a8457837580b67f9d1b68c7b/checks?check_suite_id=3652983301",
+                      "status": "COMPLETED",
+                      "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/commit/7288ad262198cd40a8457837580b67f9d1b68c7b/checks?check_suite_id=3652983301",
+                      "checkRuns": {
+                        "nodes": [
+                          {
+                            "title": null,
+                            "__typename": "CheckRun"
+                          }
+                        ],
+                        "__typename": "CheckRunConnection"
+                      },
+                      "__typename": "CheckSuite"
+                    },
+                    {
+                      "databaseId": 3652985844,
+                      "app": {
+                        "name": "Azure Pipelines",
+                        "__typename": "App"
+                      },
+                      "conclusion": "SUCCESS",
+                      "resourcePath": "/DefinitelyTyped/DefinitelyTyped/commit/7288ad262198cd40a8457837580b67f9d1b68c7b/checks?check_suite_id=3652985844",
+                      "status": "COMPLETED",
+                      "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/commit/7288ad262198cd40a8457837580b67f9d1b68c7b/checks?check_suite_id=3652985844",
+                      "checkRuns": {
+                        "nodes": [
+                          {
+                            "title": "Build #20210901.18 succeeded",
+                            "__typename": "CheckRun"
+                          }
+                        ],
+                        "__typename": "CheckRunConnection"
+                      },
+                      "__typename": "CheckSuite"
+                    }
+                  ],
+                  "__typename": "CheckSuiteConnection"
+                },
+                "status": null,
+                "authoredDate": "2021-09-01T12:29:58Z",
+                "committedDate": "2021-09-01T12:29:58Z",
+                "pushedDate": "2021-09-01T12:30:10Z",
+                "oid": "7288ad262198cd40a8457837580b67f9d1b68c7b",
+                "__typename": "Commit"
+              },
+              "__typename": "PullRequestCommit"
+            }
+          ],
+          "__typename": "PullRequestCommitConnection"
+        },
+        "comments": {
+          "totalCount": 15,
+          "nodes": [
+            {
+              "id": "IC_kwDOAFz6BM42MNiP",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 909170831,
+              "body": "@avi12 Thank you for submitting this PR! I see this is your first time submitting to DefinitelyTyped 👋 — I'm the local bot who will help you through the process of getting things through.\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `chrome` — [on npm](https://www.npmjs.com/package/chrome), [on unpkg](https://unpkg.com/browse/chrome@latest/)\n  - owner-approval: @userTim, @nicolas377\n\n## Code Reviews\n\nThis PR can be merged once it's reviewed by a DT maintainer.\n\nYou can test the changes of this PR [in the Playground](https://www.typescriptlang.org/play/?dtPR=55508&install-plugin=playground-dt-review).\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Only a DT maintainer can approve changes [without tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package)\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->",
+              "createdAt": "2021-08-31T12:01:34Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42MNin",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 909170855,
+              "body": "Hey @avi12,\n\n:unamused: Your PR doesn't modify any tests, so it's hard to know what's being fixed, and your changes might regress in the future. Please consider [adding tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package) to cover the change you're making. Including tests allows this PR to be merged by yourself and the owners of this module.\n\n***This can potentially save days of time for you!***\n<!--typescript_bot_suggest-testing-->",
+              "createdAt": "2021-08-31T12:01:36Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42MNix",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 909170865,
+              "body": "🔔 @matthewkimber @otiai10 @couven92 @rreverser @sreimer15 @MatCarlson @ekinsol @tregagnon @echoabstract @spasma @bdbai @pokutuna @JasonXian @usertim @idan315 @nicolas377 — please [review this PR](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/55508/files) in the next few days. Be sure to explicitly select **`Approve`** or **`Request Changes`** in the GitHub UI so I know what's going on.\n<!--typescript_bot_pinging-reviewers-->",
+              "createdAt": "2021-08-31T12:01:37Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42MUfX",
+              "author": {
+                "login": "nicolas377",
+                "__typename": "User"
+              },
+              "databaseId": 909199319,
+              "body": "Hey @avi12! You should probably modify tests for this change. It makes it a lot easier for us to merge this PR. Also, your top comment should follow this format:\r\n\r\n```\r\nPlease fill in this template.\r\n\r\n- [ ] Use a meaningful title for the pull request. Include the name of the package modified.\r\n- [ ] Test the change in your own code. (Compile and run.)\r\n- [ ] [Add or edit tests](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.md#my-package-teststs) to reflect the change.\r\n- [ ] Follow the advice from the [readme](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.md#make-a-pull-request).\r\n- [ ] Avoid [common mistakes](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.md#common-mistakes).\r\n- [ ] [Run `npm test <package to test>`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/README.md#running-tests).\r\n\r\nIf changing an existing definition:\r\n- [ ] Provide a URL to documentation or source code which provides context for the suggested changes: <<url here>>\r\n- [ ] If this PR brings the type definitions up to date with a new version of the JS library, update the version number in the header.```",
+              "createdAt": "2021-08-31T12:40:00Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42MVCZ",
+              "author": {
+                "login": "avi12",
+                "__typename": "User"
+              },
+              "databaseId": 909201561,
+              "body": "> You should probably modify tests for this change.\r\n\r\nApologies. I'm honestly not used to making PRs.\r\n\r\n> Also, your top comment should follow this format:\r\n\r\nApologies. I made the pull request directly from the online VSCode (accessed via \"`.`\"), and I do not remember it offering me to add a description.",
+              "createdAt": "2021-08-31T12:43:15Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42MVIX",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 909201943,
+              "body": "@avi12 One or more reviewers has requested changes. Please address their comments. I'll be back once they sign off or you've pushed new commits. Thank you!\n<!--typescript_bot_reviewer-complaint-14188c3-->",
+              "createdAt": "2021-08-31T12:43:49Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42MVW-",
+              "author": {
+                "login": "nicolas377",
+                "__typename": "User"
+              },
+              "databaseId": 909202878,
+              "body": "That's fine!",
+              "createdAt": "2021-08-31T12:45:10Z",
+              "reactions": {
+                "nodes": [
+                  {
+                    "user": {
+                      "login": "avi12",
+                      "__typename": "User"
+                    },
+                    "__typename": "Reaction"
+                  }
+                ],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42MhzK",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 909253834,
+              "body": "@nicolas377 Thank you for reviewing this PR! The author has pushed new commits since your last review. Could you take another look and submit a fresh review?\n<!--typescript_bot_stale-ping-8e0f38-14188c3-->",
+              "createdAt": "2021-08-31T13:46:27Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42Mwj4",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 909314296,
+              "body": "@avi12 One or more reviewers has requested changes. Please address their comments. I'll be back once they sign off or you've pushed new commits. Thank you!\n<!--typescript_bot_reviewer-complaint-42183f9-->",
+              "createdAt": "2021-08-31T14:55:02Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42PwAM",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 910098444,
+              "body": "@avi12 The CI build failed! Please [review the logs for more information](https://github.com/DefinitelyTyped/DefinitelyTyped/commit/b083a84b808480af07a1e5049b630a037e7e3ad1/checks?check_suite_id=3651267318).\n\nOnce you've pushed the fixes, the build will automatically re-run. Thanks!\n\n**Note: builds which are failing do not end up on the list of PRs for the DT maintainers to review.**\n<!--typescript_bot_gh-actions-complaint-b083a84-->",
+              "createdAt": "2021-09-01T09:18:45Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42P9St",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 910152877,
+              "body": "@avi12 The CI build failed! Please [review the logs for more information](https://github.com/DefinitelyTyped/DefinitelyTyped/commit/6d3b290140ec106883a1b665a62fbce245ed45d7/checks?check_suite_id=3651921424).\n\nOnce you've pushed the fixes, the build will automatically re-run. Thanks!\n\n**Note: builds which are failing do not end up on the list of PRs for the DT maintainers to review.**\n<!--typescript_bot_gh-actions-complaint-6d3b290-->",
+              "createdAt": "2021-09-01T10:30:48Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42QP3F",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 910228933,
+              "body": "@nicolas377 Thank you for reviewing this PR! The author has pushed new commits since your last review. Could you take another look and submit a fresh review?\n<!--typescript_bot_stale-ping-8e0f38-42183f9-->",
+              "createdAt": "2021-09-01T12:17:44Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42QRrg",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 910236384,
+              "body": "@avi12 One or more reviewers has requested changes. Please address their comments. I'll be back once they sign off or you've pushed new commits. Thank you!\n<!--typescript_bot_reviewer-complaint-e531c81-->",
+              "createdAt": "2021-09-01T12:28:17Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42QS-Q",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 910241680,
+              "body": "@nicolas377 Thank you for reviewing this PR! The author has pushed new commits since your last review. Could you take another look and submit a fresh review?\n<!--typescript_bot_stale-ping-8e0f38-e531c81-->",
+              "createdAt": "2021-09-01T12:35:34Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42QUCP",
+              "author": {
+                "login": "nicolas377",
+                "__typename": "User"
+              },
+              "databaseId": 910246031,
+              "body": "@orta This PR is good to go! Could you approve it?",
+              "createdAt": "2021-09-01T12:41:45Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            }
+          ],
+          "__typename": "IssueCommentConnection"
+        },
+        "files": {
+          "totalCount": 1,
+          "nodes": [
+            {
+              "path": "types/chrome/index.d.ts",
+              "additions": 16,
+              "deletions": 8,
+              "__typename": "PullRequestChangedFile"
+            }
+          ],
+          "pageInfo": {
+            "hasNextPage": false,
+            "endCursor": "MQ",
+            "__typename": "PageInfo"
+          },
+          "__typename": "PullRequestChangedFileConnection"
+        },
+        "projectCards": {
+          "nodes": [
+            {
+              "id": "PRC_lALOAFz6BM4AORWwzgQLTuM",
+              "project": {
+                "id": "MDc6UHJvamVjdDM3NDExMDQ=",
+                "number": 5,
+                "name": "New Pull Request Status Board",
+                "__typename": "Project"
+              },
+              "column": {
+                "id": "MDEzOlByb2plY3RDb2x1bW43NTUyOTIy",
+                "name": "Needs Maintainer Review",
+                "__typename": "ProjectColumn"
+              },
+              "__typename": "ProjectCard"
+            }
+          ],
+          "__typename": "ProjectCardConnection"
+        },
+        "__typename": "PullRequest"
+      },
+      "__typename": "Repository"
+    }
+  },
+  "loading": false,
+  "networkStatus": 7
+}
diff --git a/src/_tests/fixtures/55508/derived.json b/src/_tests/fixtures/55508/derived.json
new file mode 100644
index 0000000..8f7fb88
--- /dev/null
+++ b/src/_tests/fixtures/55508/derived.json
@@ -0,0 +1,62 @@
+{
+  "type": "info",
+  "now": "2021-09-06T21:31:20.974Z",
+  "pr_number": 55508,
+  "author": "avi12",
+  "headCommitOid": "7288ad262198cd40a8457837580b67f9d1b68c7b",
+  "lastPushDate": "2021-09-01T12:30:10.000Z",
+  "lastActivityDate": "2021-09-01T14:59:00.000Z",
+  "hasMergeConflict": false,
+  "isFirstContribution": true,
+  "tooManyFiles": false,
+  "popularityLevel": "Popular",
+  "pkgInfo": [
+    {
+      "name": "chrome",
+      "kind": "edit",
+      "files": [
+        {
+          "path": "types/chrome/index.d.ts",
+          "kind": "definition"
+        }
+      ],
+      "owners": [
+        "matthewkimber",
+        "otiai10",
+        "couven92",
+        "rreverser",
+        "sreimer15",
+        "MatCarlson",
+        "ekinsol",
+        "tregagnon",
+        "echoabstract",
+        "spasma",
+        "bdbai",
+        "pokutuna",
+        "JasonXian",
+        "usertim",
+        "idan315",
+        "nicolas377"
+      ],
+      "addedOwners": [],
+      "deletedOwners": [],
+      "popularityLevel": "Popular"
+    }
+  ],
+  "reviews": [
+    {
+      "type": "approved",
+      "reviewer": "userTim",
+      "date": "2021-09-01T14:59:00.000Z",
+      "isMaintainer": false
+    },
+    {
+      "type": "approved",
+      "reviewer": "nicolas377",
+      "date": "2021-09-01T12:38:30.000Z",
+      "isMaintainer": false
+    }
+  ],
+  "mainBotCommentID": 909170831,
+  "ciResult": "pass"
+}
diff --git a/src/_tests/fixtures/55508/mutations.json b/src/_tests/fixtures/55508/mutations.json
new file mode 100644
index 0000000..14ba513
--- /dev/null
+++ b/src/_tests/fixtures/55508/mutations.json
@@ -0,0 +1,20 @@
+[
+  {
+    "mutation": "mutation ($input: UpdateIssueCommentInput!) {\n  updateIssueComment(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "id": "IC_kwDOAFz6BM42MNiP",
+        "body": "@avi12 Thank you for submitting this PR! I see this is your first time submitting to DefinitelyTyped 👋 — I'm the local bot who will help you through the process of getting things through.\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `chrome` — [on npm](https://www.npmjs.com/package/chrome), [on unpkg](https://unpkg.com/browse/chrome@latest/)\n  - owner-approval: @userTim, @nicolas377\n\n## Code Reviews\n\nThis PR can be merged once it's reviewed by a DT maintainer.\n\nYou can test the changes of this PR [in the Playground](https://www.typescriptlang.org/play/?dtPR=55508&install-plugin=playground-dt-review).\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Only a DT maintainer can approve changes [without tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package)\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->"
+      }
+    }
+  },
+  {
+    "mutation": "mutation ($input: AddCommentInput!) {\n  addComment(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "subjectId": "MDExOlB1bGxSZXF1ZXN0NzIzMzAzODAx",
+        "body": ":hourglass_flowing_sand: Hi @avi12,\n\nIt's been a few days since this PR was approved by userTim, nicolas377 and we're waiting on a DT maintainer to give a review.\n\nIf you would like to short-circuit this wait, you can edit some of the [test files](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-my-package-teststs) in the package which verify how the `.d.ts` files work. This would allow the PR to be merged by you or the DT module owners after a re-review.\n<!--typescript_bot_wait-for-merge-offer-7288ad2-->"
+      }
+    }
+  }
+]
diff --git a/src/_tests/fixtures/55508/result.json b/src/_tests/fixtures/55508/result.json
new file mode 100644
index 0000000..75fc19f
--- /dev/null
+++ b/src/_tests/fixtures/55508/result.json
@@ -0,0 +1,25 @@
+{
+  "projectColumn": "Needs Maintainer Review",
+  "labels": [
+    "Popular package",
+    "Owner Approved",
+    "Untested Change"
+  ],
+  "responseComments": [
+    {
+      "tag": "suggest-testing",
+      "status": "Hey @avi12,\n\n:unamused: Your PR doesn't modify any tests, so it's hard to know what's being fixed, and your changes might regress in the future. Please consider [adding tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package) to cover the change you're making. Including tests allows this PR to be merged by yourself and the owners of this module.\n\n***This can potentially save days of time for you!***"
+    },
+    {
+      "tag": "welcome",
+      "status": "@avi12 Thank you for submitting this PR! I see this is your first time submitting to DefinitelyTyped 👋 — I'm the local bot who will help you through the process of getting things through.\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `chrome` — [on npm](https://www.npmjs.com/package/chrome), [on unpkg](https://unpkg.com/browse/chrome@latest/)\n  - owner-approval: @userTim, @nicolas377\n\n## Code Reviews\n\nThis PR can be merged once it's reviewed by a DT maintainer.\n\nYou can test the changes of this PR [in the Playground](https://www.typescriptlang.org/play/?dtPR=55508&install-plugin=playground-dt-review).\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Only a DT maintainer can approve changes [without tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package)\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ..."
+    },
+    {
+      "tag": "wait-for-merge-offer-7288ad2",
+      "status": ":hourglass_flowing_sand: Hi @avi12,\n\nIt's been a few days since this PR was approved by userTim, nicolas377 and we're waiting on a DT maintainer to give a review.\n\nIf you would like to short-circuit this wait, you can edit some of the [test files](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-my-package-teststs) in the package which verify how the `.d.ts` files work. This would allow the PR to be merged by you or the DT module owners after a re-review."
+    }
+  ],
+  "shouldClose": false,
+  "shouldMerge": false,
+  "shouldUpdateLabels": true
+}
diff --git a/src/_tests/fixtures/55512/_downloads.json b/src/_tests/fixtures/55512/_downloads.json
new file mode 100644
index 0000000..663d3c4
--- /dev/null
+++ b/src/_tests/fixtures/55512/_downloads.json
@@ -0,0 +1,3 @@
+{
+  "react-datepicker": 1437773
+}
diff --git a/src/_tests/fixtures/55512/_files.json b/src/_tests/fixtures/55512/_files.json
new file mode 100644
index 0000000..dfe8c96
--- /dev/null
+++ b/src/_tests/fixtures/55512/_files.json
@@ -0,0 +1,4 @@
+{
+  "master:types/react-datepicker/index.d.ts": "// Type definitions for react-datepicker 4.1\n// Project: https://github.com/Hacker0x01/react-datepicker\n// Definitions by: Rajab Shakirov <https://github.com/radziksh>,\n//                 Andrey Balokha <https://github.com/andrewBalekha>,\n//                 Greg Smith <https://github.com/smrq>,\n//                 Roy Xue <https://github.com/royxue>\n//                 Koala Human <https://github.com/KoalaHuman>\n//                 Justin Grant <https://github.com/justingrant>\n//                 Jake Boone <https://github.com/jakeboone02>\n//                 Roman Nuritdinov <https://github.com/Ky6uk>\n//                 Avi Klaiman <https://github.com/aviklai>\n//                 Naoki Sekiguchi <https://github.com/seckie>\n//                 tu4mo <https://github.com/tu4mo>\n//                 Kerry Gougeon <https://github.com/kerry-g>\n//                 Shiftr Tech SAS <https://github.com/ShiftrTechSAS>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// Minimum TypeScript Version: 3.8\n\nimport * as React from 'react';\nimport * as Popper from '@popperjs/core';\nimport { Locale } from 'date-fns';\nimport { Modifier, StrictModifierNames } from 'react-popper';\n\nexport function registerLocale(localeName: string, localeData: {}): void;\nexport function setDefaultLocale(localeName: string): void;\nexport function getDefaultLocale(): string;\nexport function CalendarContainer(props: {\n    className?: string | undefined;\n    children?: React.ReactNode | undefined;\n    showPopperArrow?: boolean | undefined;\n    arrowProps?: { [propName: string]: any } | undefined;\n}): React.ReactElement;\n\ninterface HighlightDates {\n    [className: string]: Date[];\n}\n\nexport interface ReactDatePickerProps<CustomModifierNames extends string = never> {\n    adjustDateOnChange?: boolean | undefined;\n    allowSameDay?: boolean | undefined;\n    ariaDescribedBy?: string | undefined;\n    ariaInvalid?: string | undefined;\n    ariaLabelClose?: string | undefined;\n    ariaLabelledBy?: string | undefined;\n    ariaRequired?: string | undefined;\n    autoComplete?: string | undefined;\n    autoFocus?: boolean | undefined;\n    calendarClassName?: string | undefined;\n    calendarContainer?(props: { children: React.ReactNode[] }): React.ReactNode;\n    calendarStartDay?: number | undefined;\n    children?: React.ReactNode | undefined;\n    chooseDayAriaLabelPrefix?: string | undefined;\n    className?: string | undefined;\n    clearButtonClassName?: string | undefined;\n    clearButtonTitle?: string | undefined;\n    closeOnScroll?: boolean | ((e: Event) => boolean) | undefined;\n    customInput?: React.ReactNode | undefined;\n    customInputRef?: string | undefined;\n    customTimeInput?: React.ReactNode | undefined;\n    dateFormat?: string | string[] | undefined;\n    dateFormatCalendar?: string | undefined;\n    dayClassName?(date: Date): string | null;\n    weekDayClassName?(date: Date): string | null;\n    monthClassName?(date: Date): string | null;\n    timeClassName?(date: Date): string | null;\n    disabledDayAriaLabelPrefix?: string | undefined;\n    disabled?: boolean | undefined;\n    disabledKeyboardNavigation?: boolean | undefined;\n    dropdownMode?: 'scroll' | 'select' | undefined;\n    endDate?: Date | null | undefined;\n    excludeDates?: Date[] | undefined;\n    excludeTimes?: Date[] | undefined;\n    filterDate?(date: Date): boolean;\n    filterTime?(date: Date): boolean;\n    fixedHeight?: boolean | undefined;\n    forceShowMonthNavigation?: boolean | undefined;\n    formatWeekDay?(formattedDate: string): React.ReactNode;\n    formatWeekNumber?(date: Date): string | number;\n    highlightDates?: Array<HighlightDates | Date> | undefined;\n    id?: string | undefined;\n    includeDates?: Date[] | undefined;\n    includeTimes?: Date[] | undefined;\n    injectTimes?: Date[] | undefined;\n    inline?: boolean | undefined;\n    focusSelectedMonth?: boolean | undefined;\n    isClearable?: boolean | undefined;\n    locale?: string | Locale | undefined;\n    maxDate?: Date | null | undefined;\n    maxTime?: Date | undefined;\n    minDate?: Date | null | undefined;\n    minTime?: Date | undefined;\n    monthsShown?: number | undefined;\n    name?: string | undefined;\n    nextMonthButtonLabel?: string | React.ReactNode | undefined;\n    nextYearButtonLabel?: string | undefined;\n    onBlur?(event: React.FocusEvent<HTMLInputElement>): void;\n    onCalendarClose?(): void;\n    onCalendarOpen?(): void;\n    onChange(\n        date: Date | [Date | null, Date | null] | /* for selectsRange */ null,\n        event: React.SyntheticEvent<any> | undefined,\n    ): void;\n    onChangeRaw?(event: React.FocusEvent<HTMLInputElement>): void;\n    onClickOutside?(event: React.MouseEvent<HTMLDivElement>): void;\n    onDayMouseEnter?: ((date: Date) => void) | undefined;\n    onFocus?(event: React.FocusEvent<HTMLInputElement>): void;\n    onInputClick?(): void;\n    onInputError?(err: { code: number; msg: string }): void;\n    onKeyDown?(event: React.KeyboardEvent<HTMLDivElement>): void;\n    onMonthChange?(date: Date): void;\n    onMonthMouseLeave?: (() => void) | undefined;\n    onSelect?(date: Date, event: React.SyntheticEvent<any> | undefined): void;\n    onWeekSelect?(\n        firstDayOfWeek: Date,\n        weekNumber: string | number,\n        event: React.SyntheticEvent<any> | undefined,\n    ): void;\n    onYearChange?(date: Date): void;\n    open?: boolean | undefined;\n    openToDate?: Date | undefined;\n    peekNextMonth?: boolean | undefined;\n    placeholderText?: string | undefined;\n    popperClassName?: string | undefined;\n    popperContainer?(props: { children: React.ReactNode[] }): React.ReactNode;\n    popperModifiers?: ReadonlyArray<Modifier<StrictModifierNames | CustomModifierNames>> | undefined;\n    popperPlacement?: Popper.Placement | undefined;\n    popperProps?: {} | undefined;\n    preventOpenOnFocus?: boolean | undefined;\n    previousMonthButtonLabel?: string | React.ReactNode | undefined;\n    previousYearButtonLabel?: string | undefined;\n    readOnly?: boolean | undefined;\n    renderCustomHeader?(params: {\n        monthDate: Date;\n        date: Date;\n        changeYear(year: number): void;\n        changeMonth(month: number): void;\n        customHeaderCount: number;\n        decreaseMonth(): void;\n        increaseMonth(): void;\n        prevMonthButtonDisabled: boolean;\n        nextMonthButtonDisabled: boolean;\n        decreaseYear(): void;\n        increaseYear(): void;\n        prevYearButtonDisabled: boolean;\n        nextYearButtonDisabled: boolean;\n    }): React.ReactNode;\n    renderDayContents?(dayOfMonth: number, date?: Date): React.ReactNode;\n    required?: boolean | undefined;\n    scrollableMonthYearDropdown?: boolean | undefined;\n    scrollableYearDropdown?: boolean | undefined;\n    selected?: Date | null | undefined;\n    selectsEnd?: boolean | undefined;\n    selectsStart?: boolean | undefined;\n    selectsRange?: boolean | undefined;\n    shouldCloseOnSelect?: boolean | undefined;\n    showDisabledMonthNavigation?: boolean | undefined;\n    showFullMonthYearPicker?: boolean | undefined;\n    showMonthDropdown?: boolean | undefined;\n    showMonthYearDropdown?: boolean | undefined;\n    showMonthYearPicker?: boolean | undefined;\n    showPopperArrow?: boolean | undefined;\n    showPreviousMonths?: boolean | undefined;\n    showQuarterYearPicker?: boolean | undefined;\n    showTimeInput?: boolean | undefined;\n    showTimeSelect?: boolean | undefined;\n    showTimeSelectOnly?: boolean | undefined;\n    showTwoColumnMonthYearPicker?: boolean | undefined;\n    showFourColumnMonthYearPicker?: boolean | undefined;\n    showWeekNumbers?: boolean | undefined;\n    showYearDropdown?: boolean | undefined;\n    showYearPicker?: boolean | undefined;\n    startDate?: Date | null | undefined;\n    startOpen?: boolean | undefined;\n    strictParsing?: boolean | undefined;\n    tabIndex?: number | undefined;\n    timeCaption?: string | undefined;\n    timeFormat?: string | undefined;\n    timeInputLabel?: string | undefined;\n    timeIntervals?: number | undefined;\n    title?: string | undefined;\n    todayButton?: React.ReactNode | undefined;\n    useShortMonthInDropdown?: boolean | undefined;\n    useWeekdaysShort?: boolean | undefined;\n    weekAriaLabelPrefix?: string | undefined;\n    value?: string | undefined;\n    weekLabel?: string | undefined;\n    withPortal?: boolean | undefined;\n    portalId?: string | undefined;\n    wrapperClassName?: string | undefined;\n    yearDropdownItemNumber?: number | undefined;\n    excludeScrollbar?: boolean | undefined;\n    enableTabLoop?: boolean | undefined;\n    yearItemNumber?: number | undefined;\n}\n\nexport class ReactDatePicker<CustomModifierNames extends string = never> extends React.Component<\n    ReactDatePickerProps<CustomModifierNames>\n> {\n    readonly setBlur: () => void;\n    readonly setFocus: () => void;\n    readonly setOpen: (open: boolean, skipSetBlur?: boolean) => void;\n    readonly isCalendarOpen: () => boolean;\n}\n\nexport default ReactDatePicker;\n",
+  "e90d61bddfd00fa6db114993d0689cdb367be7e5:types/react-datepicker/index.d.ts": "// Type definitions for react-datepicker 4.1\n// Project: https://github.com/Hacker0x01/react-datepicker\n// Definitions by: Rajab Shakirov <https://github.com/radziksh>,\n//                 Andrey Balokha <https://github.com/andrewBalekha>,\n//                 Greg Smith <https://github.com/smrq>,\n//                 Roy Xue <https://github.com/royxue>\n//                 Koala Human <https://github.com/KoalaHuman>\n//                 Justin Grant <https://github.com/justingrant>\n//                 Jake Boone <https://github.com/jakeboone02>\n//                 Roman Nuritdinov <https://github.com/Ky6uk>\n//                 Avi Klaiman <https://github.com/aviklai>\n//                 Naoki Sekiguchi <https://github.com/seckie>\n//                 tu4mo <https://github.com/tu4mo>\n//                 Kerry Gougeon <https://github.com/kerry-g>\n//                 Shiftr Tech SAS <https://github.com/ShiftrTechSAS>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// Minimum TypeScript Version: 3.8\n\nimport * as React from 'react';\nimport * as Popper from '@popperjs/core';\nimport { Locale } from 'date-fns';\nimport { Modifier } from 'react-popper';\n\nexport function registerLocale(localeName: string, localeData: Locale): void;\nexport function setDefaultLocale(localeName: string): void;\nexport function getDefaultLocale(): string;\nexport function CalendarContainer(props: {\n    className?: string | undefined;\n    children?: React.ReactNode | undefined;\n    showPopperArrow?: boolean | undefined;\n    arrowProps?: { [propName: string]: any } | undefined;\n}): React.ReactElement;\n\ninterface HighlightDates {\n    [className: string]: Date[];\n}\n\nexport interface ReactDatePickerProps<Modifiers> {\n    adjustDateOnChange?: boolean | undefined;\n    allowSameDay?: boolean | undefined;\n    ariaDescribedBy?: string | undefined;\n    ariaInvalid?: string | undefined;\n    ariaLabelClose?: string | undefined;\n    ariaLabelledBy?: string | undefined;\n    ariaRequired?: string | undefined;\n    autoComplete?: string | undefined;\n    autoFocus?: boolean | undefined;\n    calendarClassName?: string | undefined;\n    calendarContainer?(props: { children: React.ReactNode[] }): React.ReactNode;\n    calendarStartDay?: number | undefined;\n    children?: React.ReactNode | undefined;\n    chooseDayAriaLabelPrefix?: string | undefined;\n    className?: string | undefined;\n    clearButtonClassName?: string | undefined;\n    clearButtonTitle?: string | undefined;\n    closeOnScroll?: boolean | ((e: Event) => boolean) | undefined;\n    customInput?: React.ReactNode | undefined;\n    customInputRef?: string | undefined;\n    customTimeInput?: React.ReactNode | undefined;\n    dateFormat?: string | string[] | undefined;\n    dateFormatCalendar?: string | undefined;\n    dayClassName?(date: Date): string | null;\n    weekDayClassName?(date: Date): string | null;\n    monthClassName?(date: Date): string | null;\n    timeClassName?(date: Date): string | null;\n    disabledDayAriaLabelPrefix?: string | undefined;\n    disabled?: boolean | undefined;\n    disabledKeyboardNavigation?: boolean | undefined;\n    dropdownMode?: 'scroll' | 'select' | undefined;\n    endDate?: Date | null | undefined;\n    excludeDates?: Date[] | undefined;\n    excludeTimes?: Date[] | undefined;\n    filterDate?(date: Date): boolean;\n    filterTime?(date: Date): boolean;\n    fixedHeight?: boolean | undefined;\n    forceShowMonthNavigation?: boolean | undefined;\n    formatWeekDay?(formattedDate: string): React.ReactNode;\n    formatWeekNumber?(date: Date): string | number;\n    highlightDates?: Array<HighlightDates | Date> | undefined;\n    id?: string | undefined;\n    includeDates?: Date[] | undefined;\n    includeTimes?: Date[] | undefined;\n    injectTimes?: Date[] | undefined;\n    inline?: boolean | undefined;\n    focusSelectedMonth?: boolean | undefined;\n    isClearable?: boolean | undefined;\n    locale?: string | Locale | undefined;\n    maxDate?: Date | null | undefined;\n    maxTime?: Date | undefined;\n    minDate?: Date | null | undefined;\n    minTime?: Date | undefined;\n    monthsShown?: number | undefined;\n    name?: string | undefined;\n    nextMonthButtonLabel?: string | React.ReactNode | undefined;\n    nextYearButtonLabel?: string | undefined;\n    onBlur?(event: React.FocusEvent<HTMLInputElement>): void;\n    onCalendarClose?(): void;\n    onCalendarOpen?(): void;\n    onChange(\n        date: Date | [Date | null, Date | null] | /* for selectsRange */ null,\n        event: React.SyntheticEvent<any> | undefined,\n    ): void;\n    onChangeRaw?(event: React.FocusEvent<HTMLInputElement>): void;\n    onClickOutside?(event: React.MouseEvent<HTMLDivElement>): void;\n    onDayMouseEnter?: ((date: Date) => void) | undefined;\n    onFocus?(event: React.FocusEvent<HTMLInputElement>): void;\n    onInputClick?(): void;\n    onInputError?(err: { code: number; msg: string }): void;\n    onKeyDown?(event: React.KeyboardEvent<HTMLDivElement>): void;\n    onMonthChange?(date: Date): void;\n    onMonthMouseLeave?: (() => void) | undefined;\n    onSelect?(date: Date, event: React.SyntheticEvent<any> | undefined): void;\n    onWeekSelect?(\n        firstDayOfWeek: Date,\n        weekNumber: string | number,\n        event: React.SyntheticEvent<any> | undefined,\n    ): void;\n    onYearChange?(date: Date): void;\n    open?: boolean | undefined;\n    openToDate?: Date | undefined;\n    peekNextMonth?: boolean | undefined;\n    placeholderText?: string | undefined;\n    popperClassName?: string | undefined;\n    popperContainer?(props: { children: React.ReactNode[] }): React.ReactNode;\n    popperModifiers?: ReadonlyArray<Modifier<Modifiers>> | undefined;\n    popperPlacement?: Popper.Placement | undefined;\n    popperProps?: {} | undefined;\n    preventOpenOnFocus?: boolean | undefined;\n    previousMonthButtonLabel?: string | React.ReactNode | undefined;\n    previousYearButtonLabel?: string | undefined;\n    readOnly?: boolean | undefined;\n    renderCustomHeader?(params: {\n        monthDate: Date;\n        date: Date;\n        changeYear(year: number): void;\n        changeMonth(month: number): void;\n        customHeaderCount: number;\n        decreaseMonth(): void;\n        increaseMonth(): void;\n        prevMonthButtonDisabled: boolean;\n        nextMonthButtonDisabled: boolean;\n        decreaseYear(): void;\n        increaseYear(): void;\n        prevYearButtonDisabled: boolean;\n        nextYearButtonDisabled: boolean;\n    }): React.ReactNode;\n    renderDayContents?(dayOfMonth: number, date?: Date): React.ReactNode;\n    required?: boolean | undefined;\n    scrollableMonthYearDropdown?: boolean | undefined;\n    scrollableYearDropdown?: boolean | undefined;\n    selected?: Date | null | undefined;\n    selectsEnd?: boolean | undefined;\n    selectsStart?: boolean | undefined;\n    selectsRange?: boolean | undefined;\n    shouldCloseOnSelect?: boolean | undefined;\n    showDisabledMonthNavigation?: boolean | undefined;\n    showFullMonthYearPicker?: boolean | undefined;\n    showMonthDropdown?: boolean | undefined;\n    showMonthYearDropdown?: boolean | undefined;\n    showMonthYearPicker?: boolean | undefined;\n    showPopperArrow?: boolean | undefined;\n    showPreviousMonths?: boolean | undefined;\n    showQuarterYearPicker?: boolean | undefined;\n    showTimeInput?: boolean | undefined;\n    showTimeSelect?: boolean | undefined;\n    showTimeSelectOnly?: boolean | undefined;\n    showTwoColumnMonthYearPicker?: boolean | undefined;\n    showFourColumnMonthYearPicker?: boolean | undefined;\n    showWeekNumbers?: boolean | undefined;\n    showYearDropdown?: boolean | undefined;\n    showYearPicker?: boolean | undefined;\n    startDate?: Date | null | undefined;\n    startOpen?: boolean | undefined;\n    strictParsing?: boolean | undefined;\n    tabIndex?: number | undefined;\n    timeCaption?: string | undefined;\n    timeFormat?: string | undefined;\n    timeInputLabel?: string | undefined;\n    timeIntervals?: number | undefined;\n    title?: string | undefined;\n    todayButton?: React.ReactNode | undefined;\n    useShortMonthInDropdown?: boolean | undefined;\n    useWeekdaysShort?: boolean | undefined;\n    weekAriaLabelPrefix?: string | undefined;\n    value?: string | undefined;\n    weekLabel?: string | undefined;\n    withPortal?: boolean | undefined;\n    portalId?: string | undefined;\n    wrapperClassName?: string | undefined;\n    yearDropdownItemNumber?: number | undefined;\n    excludeScrollbar?: boolean | undefined;\n    enableTabLoop?: boolean | undefined;\n    yearItemNumber?: number | undefined;\n}\n\ndeclare class ReactDatePicker<Modifiers> extends React.Component<ReactDatePickerProps<Modifiers>> {\n    readonly setBlur: () => void;\n    readonly setFocus: () => void;\n    readonly setOpen: (open: boolean, skipSetBlur?: boolean) => void;\n    readonly isCalendarOpen: () => boolean;\n}\n\nexport default ReactDatePicker;\n"
+}
diff --git a/src/_tests/fixtures/55512/_response.json b/src/_tests/fixtures/55512/_response.json
new file mode 100644
index 0000000..7b4d431
--- /dev/null
+++ b/src/_tests/fixtures/55512/_response.json
@@ -0,0 +1,238 @@
+{
+  "data": {
+    "repository": {
+      "id": "MDEwOlJlcG9zaXRvcnk2MDkzMzE2",
+      "pullRequest": {
+        "id": "MDExOlB1bGxSZXF1ZXN0NzIzNDc0ODMy",
+        "title": "fix(react-datepicker): fix registerLocale localData type",
+        "createdAt": "2021-08-31T15:14:41Z",
+        "author": {
+          "login": "philibea",
+          "__typename": "User"
+        },
+        "authorAssociation": "FIRST_TIME_CONTRIBUTOR",
+        "baseRef": {
+          "name": "master",
+          "__typename": "Ref"
+        },
+        "labels": {
+          "nodes": [
+            {
+              "name": "Popular package",
+              "__typename": "Label"
+            },
+            {
+              "name": "Owner Approved",
+              "__typename": "Label"
+            },
+            {
+              "name": "Untested Change",
+              "__typename": "Label"
+            }
+          ],
+          "__typename": "LabelConnection"
+        },
+        "isDraft": false,
+        "mergeable": "MERGEABLE",
+        "number": 55512,
+        "state": "OPEN",
+        "headRefOid": "e90d61bddfd00fa6db114993d0689cdb367be7e5",
+        "changedFiles": 1,
+        "timelineItems": {
+          "nodes": [
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2021-08-31T15:19:36Z",
+              "projectColumnName": "Needs Maintainer Review",
+              "__typename": "MovedColumnsInProjectEvent"
+            }
+          ],
+          "__typename": "PullRequestTimelineItemsConnection"
+        },
+        "reviews": {
+          "nodes": [
+            {
+              "author": {
+                "login": "Ky6uk",
+                "__typename": "User"
+              },
+              "commit": {
+                "oid": "e90d61bddfd00fa6db114993d0689cdb367be7e5",
+                "__typename": "Commit"
+              },
+              "comments": {
+                "nodes": [],
+                "__typename": "PullRequestReviewCommentConnection"
+              },
+              "authorAssociation": "CONTRIBUTOR",
+              "state": "APPROVED",
+              "submittedAt": "2021-08-31T18:33:55Z",
+              "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/pull/55512#pullrequestreview-743070006",
+              "__typename": "PullRequestReview"
+            }
+          ],
+          "__typename": "PullRequestReviewConnection"
+        },
+        "commits": {
+          "totalCount": 1,
+          "nodes": [
+            {
+              "commit": {
+                "checkSuites": {
+                  "nodes": [
+                    {
+                      "databaseId": 3643302080,
+                      "app": {
+                        "name": "GitHub Actions",
+                        "__typename": "App"
+                      },
+                      "conclusion": "SUCCESS",
+                      "resourcePath": "/DefinitelyTyped/DefinitelyTyped/commit/e90d61bddfd00fa6db114993d0689cdb367be7e5/checks?check_suite_id=3643302080",
+                      "status": "COMPLETED",
+                      "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/commit/e90d61bddfd00fa6db114993d0689cdb367be7e5/checks?check_suite_id=3643302080",
+                      "checkRuns": {
+                        "nodes": [
+                          {
+                            "title": null,
+                            "__typename": "CheckRun"
+                          }
+                        ],
+                        "__typename": "CheckRunConnection"
+                      },
+                      "__typename": "CheckSuite"
+                    },
+                    {
+                      "databaseId": 3643303283,
+                      "app": {
+                        "name": "Azure Pipelines",
+                        "__typename": "App"
+                      },
+                      "conclusion": "SUCCESS",
+                      "resourcePath": "/DefinitelyTyped/DefinitelyTyped/commit/e90d61bddfd00fa6db114993d0689cdb367be7e5/checks?check_suite_id=3643303283",
+                      "status": "COMPLETED",
+                      "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/commit/e90d61bddfd00fa6db114993d0689cdb367be7e5/checks?check_suite_id=3643303283",
+                      "checkRuns": {
+                        "nodes": [
+                          {
+                            "title": "Build #20210831.26 succeeded",
+                            "__typename": "CheckRun"
+                          }
+                        ],
+                        "__typename": "CheckRunConnection"
+                      },
+                      "__typename": "CheckSuite"
+                    }
+                  ],
+                  "__typename": "CheckSuiteConnection"
+                },
+                "status": null,
+                "authoredDate": "2021-08-31T15:13:13Z",
+                "committedDate": "2021-08-31T15:13:13Z",
+                "pushedDate": "2021-08-31T15:13:30Z",
+                "oid": "e90d61bddfd00fa6db114993d0689cdb367be7e5",
+                "__typename": "Commit"
+              },
+              "__typename": "PullRequestCommit"
+            }
+          ],
+          "__typename": "PullRequestCommitConnection"
+        },
+        "comments": {
+          "totalCount": 3,
+          "nodes": [
+            {
+              "id": "IC_kwDOAFz6BM42M0xH",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 909331527,
+              "body": "@philibea Thank you for submitting this PR! I see this is your first time submitting to DefinitelyTyped 👋 — I'm the local bot who will help you through the process of getting things through.\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `react-datepicker` — [on npm](https://www.npmjs.com/package/react-datepicker), [on unpkg](https://unpkg.com/browse/react-datepicker@latest/)\n  - owner-approval: @Ky6uk\n\n## Code Reviews\n\nThis PR can be merged once it's reviewed by a DT maintainer.\n\nYou can test the changes of this PR [in the Playground](https://www.typescriptlang.org/play/?dtPR=55512&install-plugin=playground-dt-review).\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Only a DT maintainer can approve changes [without tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package)\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->",
+              "createdAt": "2021-08-31T15:15:16Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42M0xo",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 909331560,
+              "body": "Hey @philibea,\n\n:unamused: Your PR doesn't modify any tests, so it's hard to know what's being fixed, and your changes might regress in the future. Please consider [adding tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package) to cover the change you're making. Including tests allows this PR to be merged by yourself and the owners of this module.\n\n***This can potentially save days of time for you!***\n<!--typescript_bot_suggest-testing-->",
+              "createdAt": "2021-08-31T15:15:18Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM42M0xz",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 909331571,
+              "body": "🔔 @radziksh @andrewBalekha @smrq @royxue @KoalaHuman @justingrant @jakeboone02 @Ky6uk @aviklai @seckie @tu4mo @kerry-g @ShiftrTechSAS — please [review this PR](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/55512/files) in the next few days. Be sure to explicitly select **`Approve`** or **`Request Changes`** in the GitHub UI so I know what's going on.\n<!--typescript_bot_pinging-reviewers-->",
+              "createdAt": "2021-08-31T15:15:18Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            }
+          ],
+          "__typename": "IssueCommentConnection"
+        },
+        "files": {
+          "totalCount": 1,
+          "nodes": [
+            {
+              "path": "types/react-datepicker/index.d.ts",
+              "additions": 1,
+              "deletions": 1,
+              "__typename": "PullRequestChangedFile"
+            }
+          ],
+          "pageInfo": {
+            "hasNextPage": false,
+            "endCursor": "MQ",
+            "__typename": "PageInfo"
+          },
+          "__typename": "PullRequestChangedFileConnection"
+        },
+        "projectCards": {
+          "nodes": [
+            {
+              "id": "PRC_lALOAFz6BM4AORWwzgQLi2w",
+              "project": {
+                "id": "MDc6UHJvamVjdDM3NDExMDQ=",
+                "number": 5,
+                "name": "New Pull Request Status Board",
+                "__typename": "Project"
+              },
+              "column": {
+                "id": "MDEzOlByb2plY3RDb2x1bW43NTUyOTIy",
+                "name": "Needs Maintainer Review",
+                "__typename": "ProjectColumn"
+              },
+              "__typename": "ProjectCard"
+            }
+          ],
+          "__typename": "ProjectCardConnection"
+        },
+        "__typename": "PullRequest"
+      },
+      "__typename": "Repository"
+    }
+  },
+  "loading": false,
+  "networkStatus": 7
+}
diff --git a/src/_tests/fixtures/55512/derived.json b/src/_tests/fixtures/55512/derived.json
new file mode 100644
index 0000000..471c03f
--- /dev/null
+++ b/src/_tests/fixtures/55512/derived.json
@@ -0,0 +1,53 @@
+{
+  "type": "info",
+  "now": "2021-09-06T20:42:33.690Z",
+  "pr_number": 55512,
+  "author": "philibea",
+  "headCommitOid": "e90d61bddfd00fa6db114993d0689cdb367be7e5",
+  "lastPushDate": "2021-08-31T15:13:30.000Z",
+  "lastActivityDate": "2021-08-31T18:33:55.000Z",
+  "hasMergeConflict": false,
+  "isFirstContribution": true,
+  "tooManyFiles": false,
+  "popularityLevel": "Popular",
+  "pkgInfo": [
+    {
+      "name": "react-datepicker",
+      "kind": "edit",
+      "files": [
+        {
+          "path": "types/react-datepicker/index.d.ts",
+          "kind": "definition"
+        }
+      ],
+      "owners": [
+        "radziksh",
+        "andrewBalekha",
+        "smrq",
+        "royxue",
+        "KoalaHuman",
+        "justingrant",
+        "jakeboone02",
+        "Ky6uk",
+        "aviklai",
+        "seckie",
+        "tu4mo",
+        "kerry-g",
+        "ShiftrTechSAS"
+      ],
+      "addedOwners": [],
+      "deletedOwners": [],
+      "popularityLevel": "Popular"
+    }
+  ],
+  "reviews": [
+    {
+      "type": "approved",
+      "reviewer": "Ky6uk",
+      "date": "2021-08-31T18:33:55.000Z",
+      "isMaintainer": false
+    }
+  ],
+  "mainBotCommentID": 909331527,
+  "ciResult": "pass"
+}
diff --git a/src/_tests/fixtures/55512/mutations.json b/src/_tests/fixtures/55512/mutations.json
new file mode 100644
index 0000000..0141b2b
--- /dev/null
+++ b/src/_tests/fixtures/55512/mutations.json
@@ -0,0 +1,20 @@
+[
+  {
+    "mutation": "mutation ($input: UpdateIssueCommentInput!) {\n  updateIssueComment(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "id": "IC_kwDOAFz6BM42M0xH",
+        "body": "@philibea Thank you for submitting this PR! I see this is your first time submitting to DefinitelyTyped 👋 — I'm the local bot who will help you through the process of getting things through.\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `react-datepicker` — [on npm](https://www.npmjs.com/package/react-datepicker), [on unpkg](https://unpkg.com/browse/react-datepicker@latest/)\n  - owner-approval: @Ky6uk\n\n## Code Reviews\n\nThis PR can be merged once it's reviewed by a DT maintainer.\n\nYou can test the changes of this PR [in the Playground](https://www.typescriptlang.org/play/?dtPR=55512&install-plugin=playground-dt-review).\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Only a DT maintainer can approve changes [without tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package)\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ...\n<!--typescript_bot_welcome-->"
+      }
+    }
+  },
+  {
+    "mutation": "mutation ($input: AddCommentInput!) {\n  addComment(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "subjectId": "MDExOlB1bGxSZXF1ZXN0NzIzNDc0ODMy",
+        "body": ":hourglass_flowing_sand: Hi @philibea,\n\nIt's been a few days since this PR was approved by Ky6uk and we're waiting on a DT maintainer to give a review.\n\nIf you would like to short-circuit this wait, you can edit some of the [test files](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-my-package-teststs) in the package which verify how the `.d.ts` files work. This would allow the PR to be merged by you or the DT module owners after a re-review.\n<!--typescript_bot_wait-for-merge-offer-e90d61b-->"
+      }
+    }
+  }
+]
diff --git a/src/_tests/fixtures/55512/result.json b/src/_tests/fixtures/55512/result.json
new file mode 100644
index 0000000..11e114d
--- /dev/null
+++ b/src/_tests/fixtures/55512/result.json
@@ -0,0 +1,25 @@
+{
+  "projectColumn": "Needs Maintainer Review",
+  "labels": [
+    "Popular package",
+    "Owner Approved",
+    "Untested Change"
+  ],
+  "responseComments": [
+    {
+      "tag": "suggest-testing",
+      "status": "Hey @philibea,\n\n:unamused: Your PR doesn't modify any tests, so it's hard to know what's being fixed, and your changes might regress in the future. Please consider [adding tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package) to cover the change you're making. Including tests allows this PR to be merged by yourself and the owners of this module.\n\n***This can potentially save days of time for you!***"
+    },
+    {
+      "tag": "welcome",
+      "status": "@philibea Thank you for submitting this PR! I see this is your first time submitting to DefinitelyTyped 👋 — I'm the local bot who will help you through the process of getting things through.\n\n***This is a live comment which I will keep updated.***\n\n## 1 package in this PR\n\n* `react-datepicker` — [on npm](https://www.npmjs.com/package/react-datepicker), [on unpkg](https://unpkg.com/browse/react-datepicker@latest/)\n  - owner-approval: @Ky6uk\n\n## Code Reviews\n\nThis PR can be merged once it's reviewed by a DT maintainer.\n\nYou can test the changes of this PR [in the Playground](https://www.typescriptlang.org/play/?dtPR=55512&install-plugin=playground-dt-review).\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Only a DT maintainer can approve changes [without tests](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-test-editing-an-existing-package)\n\nOnce every item on this list is checked, I'll ask you for permission to merge and publish the changes.\n\n----------------------\n... diagnostics scrubbed ..."
+    },
+    {
+      "tag": "wait-for-merge-offer-e90d61b",
+      "status": ":hourglass_flowing_sand: Hi @philibea,\n\nIt's been a few days since this PR was approved by Ky6uk and we're waiting on a DT maintainer to give a review.\n\nIf you would like to short-circuit this wait, you can edit some of the [test files](https://github.com/DefinitelyTyped/DefinitelyTyped#user-content-my-package-teststs) in the package which verify how the `.d.ts` files work. This would allow the PR to be merged by you or the DT module owners after a re-review."
+    }
+  ],
+  "shouldClose": false,
+  "shouldMerge": false,
+  "shouldUpdateLabels": true
+}