Repository: DefinitelyTyped/dt-mergebot
Pull request #494 (2024-05-13 17:21:13)

Ensure we don't ignore package.json only changes for calculating owners
Noticed that https://github.com/DefinitelyTyped/DefinitelyTyped/pull/69589 was somehow missing the `edits owners` label. Turns out we special cased looking at PRs without `index.d.ts` changes.

~A better fix would be to always do `await getOwnersOfPackage(name, headId, fetchFile);` since it knows when to look for package.json/index.d.ts, but we have old tests that don't have `index.d.ts` in their VFS since PRs that didn't modify that file never fetched it. So, we can just expand the special case.~ I just fixed the tests to do it right.


Patch:
diff --git a/src/pr-info.ts b/src/pr-info.ts
index c170c07..34e88d1 100644
--- a/src/pr-info.ts
+++ b/src/pr-info.ts
@@ -311,9 +311,7 @@ async function getPackageInfosEtc(
     for (const [name, files] of infos) {
         const oldOwners = !name ? null : await getOwnersOfPackage(name, baseId, fetchFile);
         if (oldOwners instanceof Error) return oldOwners;
-        const newOwners0 = !name ? null
-            : !paths.includes(`types/${name}/index.d.ts`) ? oldOwners
-            : await getOwnersOfPackage(name, headId, fetchFile);
+        const newOwners0 = !name ? null : await getOwnersOfPackage(name, headId, fetchFile);
         // A header error is still an add/edit whereas a missing file is
         // delete, hence newOwners0 here
         const kind = !name ? "edit" : !oldOwners ? "add" : !newOwners0 ? "delete" : "edit";


Test patch:
diff --git a/src/_tests/fixtures/44343-pending-travis/_files.json b/src/_tests/fixtures/44343-pending-travis/_files.json
index 0584a75..3954e49 100644
--- a/src/_tests/fixtures/44343-pending-travis/_files.json
+++ b/src/_tests/fixtures/44343-pending-travis/_files.json
@@ -1,3 +1,4 @@
 {
-  "master:types/amplify/index.d.ts": "// Type definitions for AmplifyJs 1.1\n// Project: http://amplifyjs.com/\n// Definitions by: Jonas Eriksson <https://github.com/joeriks>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n\n/// <reference types=\"jquery\" />\n\n"
+  "master:types/amplify/index.d.ts": "// Type definitions for AmplifyJs 1.1\n// Project: http://amplifyjs.com/\n// Definitions by: Jonas Eriksson <https://github.com/joeriks>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n\n/// <reference types=\"jquery\" />\n\n",
+  "abd65c3bbbf3463b41127be203c37fe64f717a7e:types/amplify/index.d.ts": "// Type definitions for AmplifyJs 1.1\n// Project: http://amplifyjs.com/\n// Definitions by: Jonas Eriksson <https://github.com/joeriks>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n\n/// <reference types=\"jquery\" />\n\n"
 }
diff --git a/src/_tests/fixtures/44343-pre-travis/_files.json b/src/_tests/fixtures/44343-pre-travis/_files.json
index 0584a75..3954e49 100644
--- a/src/_tests/fixtures/44343-pre-travis/_files.json
+++ b/src/_tests/fixtures/44343-pre-travis/_files.json
@@ -1,3 +1,4 @@
 {
-  "master:types/amplify/index.d.ts": "// Type definitions for AmplifyJs 1.1\n// Project: http://amplifyjs.com/\n// Definitions by: Jonas Eriksson <https://github.com/joeriks>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n\n/// <reference types=\"jquery\" />\n\n"
+  "master:types/amplify/index.d.ts": "// Type definitions for AmplifyJs 1.1\n// Project: http://amplifyjs.com/\n// Definitions by: Jonas Eriksson <https://github.com/joeriks>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n\n/// <reference types=\"jquery\" />\n\n",
+  "abd65c3bbbf3463b41127be203c37fe64f717a7e:types/amplify/index.d.ts": "// Type definitions for AmplifyJs 1.1\n// Project: http://amplifyjs.com/\n// Definitions by: Jonas Eriksson <https://github.com/joeriks>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n\n/// <reference types=\"jquery\" />\n\n"
 }
diff --git a/src/_tests/fixtures/44343/_files.json b/src/_tests/fixtures/44343/_files.json
index 0584a75..3954e49 100644
--- a/src/_tests/fixtures/44343/_files.json
+++ b/src/_tests/fixtures/44343/_files.json
@@ -1,3 +1,4 @@
 {
-  "master:types/amplify/index.d.ts": "// Type definitions for AmplifyJs 1.1\n// Project: http://amplifyjs.com/\n// Definitions by: Jonas Eriksson <https://github.com/joeriks>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n\n/// <reference types=\"jquery\" />\n\n"
+  "master:types/amplify/index.d.ts": "// Type definitions for AmplifyJs 1.1\n// Project: http://amplifyjs.com/\n// Definitions by: Jonas Eriksson <https://github.com/joeriks>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n\n/// <reference types=\"jquery\" />\n\n",
+  "abd65c3bbbf3463b41127be203c37fe64f717a7e:types/amplify/index.d.ts": "// Type definitions for AmplifyJs 1.1\n// Project: http://amplifyjs.com/\n// Definitions by: Jonas Eriksson <https://github.com/joeriks>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n\n/// <reference types=\"jquery\" />\n\n"
 }
diff --git a/src/_tests/fixtures/44857/_files.json b/src/_tests/fixtures/44857/_files.json
index 2a44b28..c1b4659 100644
--- a/src/_tests/fixtures/44857/_files.json
+++ b/src/_tests/fixtures/44857/_files.json
@@ -1,3 +1,4 @@
 {
-  "master:types/node/index.d.ts": "// Type definitions for non-npm package Node.js 14.6\n// Project: http://nodejs.org/\n// Definitions by: Microsoft TypeScript <https://github.com/Microsoft>\n//                 DefinitelyTyped <https://github.com/DefinitelyTyped>\n//                 Alberto Schiabel <https://github.com/jkomyno>\n//                 Alexander T. <https://github.com/a-tarasyuk>\n//                 Alvis HT Tang <https://github.com/alvis>\n//                 Andrew Makarov <https://github.com/r3nya>\n//                 Benjamin Toueg <https://github.com/btoueg>\n//                 Bruno Scheufler <https://github.com/brunoscheufler>\n//                 Chigozirim C. <https://github.com/smac89>\n//                 David Junger <https://github.com/touffy>\n//                 Deividas Bakanas <https://github.com/DeividasBakanas>\n//                 Eugene Y. Q. Shen <https://github.com/eyqs>\n//                 Flarna <https://github.com/Flarna>\n//                 Hannes Magnusson <https://github.com/Hannes-Magnusson-CK>\n//                 Hoàng Văn Khải <https://github.com/KSXGitHub>\n//                 Huw <https://github.com/hoo29>\n//                 Kelvin Jin <https://github.com/kjin>\n//                 Klaus Meinhardt <https://github.com/ajafff>\n//                 Lishude <https://github.com/islishude>\n//                 Mariusz Wiktorczyk <https://github.com/mwiktorczyk>\n//                 Mohsen Azimi <https://github.com/mohsen1>\n//                 Nicolas Even <https://github.com/n-e>\n//                 Nikita Galkin <https://github.com/galkin>\n//                 Parambir Singh <https://github.com/parambirs>\n//                 Sebastian Silbermann <https://github.com/eps1lon>\n//                 Simon Schick <https://github.com/SimonSchick>\n//                 Thomas den Hollander <https://github.com/ThomasdenH>\n//                 Wilco Bakker <https://github.com/WilcoBakker>\n//                 wwwy3y3 <https://github.com/wwwy3y3>\n//                 Samuel Ainsworth <https://github.com/samuela>\n//                 Kyle Uehlein <https://github.com/kuehlein>\n//                 Jordi Oliveras Rovira <https://github.com/j-oliveras>\n//                 Thanik Bhongbhibhat <https://github.com/bhongy>\n//                 Marcin Kopacz <https://github.com/chyzwar>\n//                 Trivikram Kamat <https://github.com/trivikr>\n//                 Minh Son Nguyen <https://github.com/nguymin4>\n//                 Junxiao Shi <https://github.com/yoursunny>\n//                 Ilia Baryshnikov <https://github.com/qwelias>\n//                 ExE Boss <https://github.com/ExE-Boss>\n//                 Surasak Chaisurin <https://github.com/Ryan-Willpower>\n//                 Piotr Błażejewicz <https://github.com/peterblazejewicz>\n//                 Anna Henningsen <https://github.com/addaleax>\n//                 Jason Kwok <https://github.com/JasonHK>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\n// NOTE: These definitions support NodeJS and TypeScript 3.5.\n\n// NOTE: TypeScript version-specific augmentations can be found in the following paths:\n//          - ~/base.d.ts         - Shared definitions common to all TypeScript versions\n//          - ~/index.d.ts        - Definitions specific to TypeScript 2.8\n//          - ~/ts3.5/index.d.ts  - Definitions specific to TypeScript 3.5\n\n// NOTE: Augmentations for TypeScript 3.5 and later should use individual files for overrides\n//       within the respective ~/ts3.5 (or later) folder. However, this is disallowed for versions\n//       prior to TypeScript 3.5, so the older definitions will be found here.\n\n// Base definitions for all NodeJS modules that are not specific to any version of TypeScript:\n/// <reference path=\"base.d.ts\" />\n\n// We can't include globals.global.d.ts in globals.d.ts, as it'll cause duplication errors in TypeScript 3.5+\n/// <reference path=\"globals.global.d.ts\" />\n\n// We can't include assert.d.ts in base.d.ts, as it'll cause duplication errors in TypeScript 3.7+\n/// <reference path=\"assert.d.ts\" />\n\n// Forward-declarations for needed types from es2015 and later (in case users are using `--lib es5`)\n// Empty interfaces are used here which merge fine with the real declarations in the lib XXX files\n// just to ensure the names are known and node typings can be used without importing these libs.\n// if someone really needs these types the libs need to be added via --lib or in tsconfig.json\ninterface AsyncIterable<T> { }\ninterface IterableIterator<T> { }\ninterface AsyncIterableIterator<T> {}\ninterface SymbolConstructor {\n    readonly asyncIterator: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\n// even this is just a forward declaration some properties are added otherwise\n// it would be allowed to pass anything to e.g. Buffer.from()\ninterface SharedArrayBuffer {\n    readonly byteLength: number;\n    slice(begin?: number, end?: number): SharedArrayBuffer;\n}\n\ndeclare module \"util\" {\n    namespace types {\n        function isBigInt64Array(value: any): boolean;\n        function isBigUint64Array(value: any): boolean;\n    }\n}\n"
+  "master:types/node/index.d.ts": "// Type definitions for non-npm package Node.js 14.6\n// Project: http://nodejs.org/\n// Definitions by: Microsoft TypeScript <https://github.com/Microsoft>\n//                 DefinitelyTyped <https://github.com/DefinitelyTyped>\n//                 Alberto Schiabel <https://github.com/jkomyno>\n//                 Alexander T. <https://github.com/a-tarasyuk>\n//                 Alvis HT Tang <https://github.com/alvis>\n//                 Andrew Makarov <https://github.com/r3nya>\n//                 Benjamin Toueg <https://github.com/btoueg>\n//                 Bruno Scheufler <https://github.com/brunoscheufler>\n//                 Chigozirim C. <https://github.com/smac89>\n//                 David Junger <https://github.com/touffy>\n//                 Deividas Bakanas <https://github.com/DeividasBakanas>\n//                 Eugene Y. Q. Shen <https://github.com/eyqs>\n//                 Flarna <https://github.com/Flarna>\n//                 Hannes Magnusson <https://github.com/Hannes-Magnusson-CK>\n//                 Hoàng Văn Khải <https://github.com/KSXGitHub>\n//                 Huw <https://github.com/hoo29>\n//                 Kelvin Jin <https://github.com/kjin>\n//                 Klaus Meinhardt <https://github.com/ajafff>\n//                 Lishude <https://github.com/islishude>\n//                 Mariusz Wiktorczyk <https://github.com/mwiktorczyk>\n//                 Mohsen Azimi <https://github.com/mohsen1>\n//                 Nicolas Even <https://github.com/n-e>\n//                 Nikita Galkin <https://github.com/galkin>\n//                 Parambir Singh <https://github.com/parambirs>\n//                 Sebastian Silbermann <https://github.com/eps1lon>\n//                 Simon Schick <https://github.com/SimonSchick>\n//                 Thomas den Hollander <https://github.com/ThomasdenH>\n//                 Wilco Bakker <https://github.com/WilcoBakker>\n//                 wwwy3y3 <https://github.com/wwwy3y3>\n//                 Samuel Ainsworth <https://github.com/samuela>\n//                 Kyle Uehlein <https://github.com/kuehlein>\n//                 Jordi Oliveras Rovira <https://github.com/j-oliveras>\n//                 Thanik Bhongbhibhat <https://github.com/bhongy>\n//                 Marcin Kopacz <https://github.com/chyzwar>\n//                 Trivikram Kamat <https://github.com/trivikr>\n//                 Minh Son Nguyen <https://github.com/nguymin4>\n//                 Junxiao Shi <https://github.com/yoursunny>\n//                 Ilia Baryshnikov <https://github.com/qwelias>\n//                 ExE Boss <https://github.com/ExE-Boss>\n//                 Surasak Chaisurin <https://github.com/Ryan-Willpower>\n//                 Piotr Błażejewicz <https://github.com/peterblazejewicz>\n//                 Anna Henningsen <https://github.com/addaleax>\n//                 Jason Kwok <https://github.com/JasonHK>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\n// NOTE: These definitions support NodeJS and TypeScript 3.5.\n\n// NOTE: TypeScript version-specific augmentations can be found in the following paths:\n//          - ~/base.d.ts         - Shared definitions common to all TypeScript versions\n//          - ~/index.d.ts        - Definitions specific to TypeScript 2.8\n//          - ~/ts3.5/index.d.ts  - Definitions specific to TypeScript 3.5\n\n// NOTE: Augmentations for TypeScript 3.5 and later should use individual files for overrides\n//       within the respective ~/ts3.5 (or later) folder. However, this is disallowed for versions\n//       prior to TypeScript 3.5, so the older definitions will be found here.\n\n// Base definitions for all NodeJS modules that are not specific to any version of TypeScript:\n/// <reference path=\"base.d.ts\" />\n\n// We can't include globals.global.d.ts in globals.d.ts, as it'll cause duplication errors in TypeScript 3.5+\n/// <reference path=\"globals.global.d.ts\" />\n\n// We can't include assert.d.ts in base.d.ts, as it'll cause duplication errors in TypeScript 3.7+\n/// <reference path=\"assert.d.ts\" />\n\n// Forward-declarations for needed types from es2015 and later (in case users are using `--lib es5`)\n// Empty interfaces are used here which merge fine with the real declarations in the lib XXX files\n// just to ensure the names are known and node typings can be used without importing these libs.\n// if someone really needs these types the libs need to be added via --lib or in tsconfig.json\ninterface AsyncIterable<T> { }\ninterface IterableIterator<T> { }\ninterface AsyncIterableIterator<T> {}\ninterface SymbolConstructor {\n    readonly asyncIterator: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\n// even this is just a forward declaration some properties are added otherwise\n// it would be allowed to pass anything to e.g. Buffer.from()\ninterface SharedArrayBuffer {\n    readonly byteLength: number;\n    slice(begin?: number, end?: number): SharedArrayBuffer;\n}\n\ndeclare module \"util\" {\n    namespace types {\n        function isBigInt64Array(value: any): boolean;\n        function isBigUint64Array(value: any): boolean;\n    }\n}\n",
+  "4aff18f9b99fdfc26209485631ba429f5d3d29ba:types/node/index.d.ts": "// Type definitions for non-npm package Node.js 14.6\n// Project: http://nodejs.org/\n// Definitions by: Microsoft TypeScript <https://github.com/Microsoft>\n//                 DefinitelyTyped <https://github.com/DefinitelyTyped>\n//                 Alberto Schiabel <https://github.com/jkomyno>\n//                 Alexander T. <https://github.com/a-tarasyuk>\n//                 Alvis HT Tang <https://github.com/alvis>\n//                 Andrew Makarov <https://github.com/r3nya>\n//                 Benjamin Toueg <https://github.com/btoueg>\n//                 Bruno Scheufler <https://github.com/brunoscheufler>\n//                 Chigozirim C. <https://github.com/smac89>\n//                 David Junger <https://github.com/touffy>\n//                 Deividas Bakanas <https://github.com/DeividasBakanas>\n//                 Eugene Y. Q. Shen <https://github.com/eyqs>\n//                 Flarna <https://github.com/Flarna>\n//                 Hannes Magnusson <https://github.com/Hannes-Magnusson-CK>\n//                 Hoàng Văn Khải <https://github.com/KSXGitHub>\n//                 Huw <https://github.com/hoo29>\n//                 Kelvin Jin <https://github.com/kjin>\n//                 Klaus Meinhardt <https://github.com/ajafff>\n//                 Lishude <https://github.com/islishude>\n//                 Mariusz Wiktorczyk <https://github.com/mwiktorczyk>\n//                 Mohsen Azimi <https://github.com/mohsen1>\n//                 Nicolas Even <https://github.com/n-e>\n//                 Nikita Galkin <https://github.com/galkin>\n//                 Parambir Singh <https://github.com/parambirs>\n//                 Sebastian Silbermann <https://github.com/eps1lon>\n//                 Simon Schick <https://github.com/SimonSchick>\n//                 Thomas den Hollander <https://github.com/ThomasdenH>\n//                 Wilco Bakker <https://github.com/WilcoBakker>\n//                 wwwy3y3 <https://github.com/wwwy3y3>\n//                 Samuel Ainsworth <https://github.com/samuela>\n//                 Kyle Uehlein <https://github.com/kuehlein>\n//                 Jordi Oliveras Rovira <https://github.com/j-oliveras>\n//                 Thanik Bhongbhibhat <https://github.com/bhongy>\n//                 Marcin Kopacz <https://github.com/chyzwar>\n//                 Trivikram Kamat <https://github.com/trivikr>\n//                 Minh Son Nguyen <https://github.com/nguymin4>\n//                 Junxiao Shi <https://github.com/yoursunny>\n//                 Ilia Baryshnikov <https://github.com/qwelias>\n//                 ExE Boss <https://github.com/ExE-Boss>\n//                 Surasak Chaisurin <https://github.com/Ryan-Willpower>\n//                 Piotr Błażejewicz <https://github.com/peterblazejewicz>\n//                 Anna Henningsen <https://github.com/addaleax>\n//                 Jason Kwok <https://github.com/JasonHK>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\n// NOTE: These definitions support NodeJS and TypeScript 3.5.\n\n// NOTE: TypeScript version-specific augmentations can be found in the following paths:\n//          - ~/base.d.ts         - Shared definitions common to all TypeScript versions\n//          - ~/index.d.ts        - Definitions specific to TypeScript 2.8\n//          - ~/ts3.5/index.d.ts  - Definitions specific to TypeScript 3.5\n\n// NOTE: Augmentations for TypeScript 3.5 and later should use individual files for overrides\n//       within the respective ~/ts3.5 (or later) folder. However, this is disallowed for versions\n//       prior to TypeScript 3.5, so the older definitions will be found here.\n\n// Base definitions for all NodeJS modules that are not specific to any version of TypeScript:\n/// <reference path=\"base.d.ts\" />\n\n// We can't include globals.global.d.ts in globals.d.ts, as it'll cause duplication errors in TypeScript 3.5+\n/// <reference path=\"globals.global.d.ts\" />\n\n// We can't include assert.d.ts in base.d.ts, as it'll cause duplication errors in TypeScript 3.7+\n/// <reference path=\"assert.d.ts\" />\n\n// Forward-declarations for needed types from es2015 and later (in case users are using `--lib es5`)\n// Empty interfaces are used here which merge fine with the real declarations in the lib XXX files\n// just to ensure the names are known and node typings can be used without importing these libs.\n// if someone really needs these types the libs need to be added via --lib or in tsconfig.json\ninterface AsyncIterable<T> { }\ninterface IterableIterator<T> { }\ninterface AsyncIterableIterator<T> {}\ninterface SymbolConstructor {\n    readonly asyncIterator: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\n// even this is just a forward declaration some properties are added otherwise\n// it would be allowed to pass anything to e.g. Buffer.from()\ninterface SharedArrayBuffer {\n    readonly byteLength: number;\n    slice(begin?: number, end?: number): SharedArrayBuffer;\n}\n\ndeclare module \"util\" {\n    namespace types {\n        function isBigInt64Array(value: any): boolean;\n        function isBigUint64Array(value: any): boolean;\n    }\n}\n"
 }
diff --git a/src/_tests/fixtures/46008/_files.json b/src/_tests/fixtures/46008/_files.json
index f5e2429..48cba7e 100644
--- a/src/_tests/fixtures/46008/_files.json
+++ b/src/_tests/fixtures/46008/_files.json
@@ -1,3 +1,4 @@
 {
-  "master:types/p5/index.d.ts": "// Type definitions for p5 0.9\n// Project: https://github.com/processing/p5.js\n// Definitions by: p5-types <https://github.com/p5-types>\n//                 Pierre Krafft <https://github.com/Zalastax>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.9\n\n// This file was auto-generated. Please do not edit it.\n\n/// <reference path=\"./lib/addons/p5.dom.d.ts\" />\n/// <reference path=\"./src/color/creating_reading.d.ts\" />\n/// <reference path=\"./src/color/setting.d.ts\" />\n/// <reference path=\"./src/core/shape/2d_primitives.d.ts\" />\n/// <reference path=\"./src/core/shape/attributes.d.ts\" />\n/// <reference path=\"./src/core/shape/curves.d.ts\" />\n/// <reference path=\"./src/core/shape/vertex.d.ts\" />\n/// <reference path=\"./src/core/constants.d.ts\" />\n/// <reference path=\"./src/core/environment.d.ts\" />\n/// <reference path=\"./src/core/rendering.d.ts\" />\n/// <reference path=\"./src/core/structure.d.ts\" />\n/// <reference path=\"./src/core/transform.d.ts\" />\n/// <reference path=\"./src/data/local_storage.d.ts\" />\n/// <reference path=\"./src/data/p5.TypedDict.d.ts\" />\n/// <reference path=\"./src/events/acceleration.d.ts\" />\n/// <reference path=\"./src/events/keyboard.d.ts\" />\n/// <reference path=\"./src/events/mouse.d.ts\" />\n/// <reference path=\"./src/events/touch.d.ts\" />\n/// <reference path=\"./src/image/image.d.ts\" />\n/// <reference path=\"./src/image/loading_displaying.d.ts\" />\n/// <reference path=\"./src/image/pixels.d.ts\" />\n/// <reference path=\"./src/io/files.d.ts\" />\n/// <reference path=\"./src/math/calculation.d.ts\" />\n/// <reference path=\"./src/math/math.d.ts\" />\n/// <reference path=\"./src/math/noise.d.ts\" />\n/// <reference path=\"./src/math/random.d.ts\" />\n/// <reference path=\"./src/math/trigonometry.d.ts\" />\n/// <reference path=\"./src/typography/attributes.d.ts\" />\n/// <reference path=\"./src/typography/loading_displaying.d.ts\" />\n/// <reference path=\"./src/utilities/array_functions.d.ts\" />\n/// <reference path=\"./src/utilities/conversion.d.ts\" />\n/// <reference path=\"./src/utilities/string_functions.d.ts\" />\n/// <reference path=\"./src/utilities/time_date.d.ts\" />\n/// <reference path=\"./src/webgl/3d_primitives.d.ts\" />\n/// <reference path=\"./src/webgl/interaction.d.ts\" />\n/// <reference path=\"./src/webgl/light.d.ts\" />\n/// <reference path=\"./src/webgl/loading.d.ts\" />\n/// <reference path=\"./src/webgl/material.d.ts\" />\n/// <reference path=\"./src/webgl/p5.Camera.d.ts\" />\n/// <reference path=\"./src/webgl/p5.RendererGL.d.ts\" />\n/// <reference path=\"./src/color/p5.Color.d.ts\" />\n/// <reference path=\"./src/core/p5.Element.d.ts\" />\n/// <reference path=\"./src/core/p5.Graphics.d.ts\" />\n/// <reference path=\"./src/image/p5.Image.d.ts\" />\n/// <reference path=\"./src/io/p5.Table.d.ts\" />\n/// <reference path=\"./src/io/p5.TableRow.d.ts\" />\n/// <reference path=\"./src/io/p5.XML.d.ts\" />\n/// <reference path=\"./src/math/p5.Vector.d.ts\" />\n/// <reference path=\"./src/typography/p5.Font.d.ts\" />\n/// <reference path=\"./src/webgl/p5.Geometry.d.ts\" />\n/// <reference path=\"./src/webgl/p5.Shader.d.ts\" />\n/// <reference path=\"./src/core/p5.Renderer.d.ts\" />\n/// <reference path=\"./literals.d.ts\" />\n/// <reference path=\"./constants.d.ts\" />\nexport = p5;\ndeclare class p5 {\n    /**\n     *   This is the p5 instance constructor. A p5 instance\n     *   holds all the properties and methods related to a\n     *   p5 sketch. It expects an incoming sketch closure\n     *   and it can also take an optional node parameter\n     *   for attaching the generated p5 canvas to a node.\n     *   The sketch closure takes the newly created p5\n     *   instance as its sole argument and may optionally\n     *   set preload(), setup(), and/or draw() properties\n     *   on it for running a sketch.\n     *\n     *   A p5 sketch can run in \"global\" or \"instance\"\n     *   mode: \"global\" - all properties and methods are\n     *   attached to the window \"instance\" - all properties\n     *   and methods are bound to this p5 object\n     *\n     *   @param sketch a closure that can set optional\n     *   preload(), setup(), and/or draw() properties on\n     *   the given p5 instance\n     *   @param [node] element to attach canvas to\n     *   @return a p5 instance\n     */\n    constructor(sketch: (...args: any[]) => any, node?: HTMLElement);\n\n    /**\n     *   Called directly before setup(), the preload()\n     *   function is used to handle asynchronous loading of\n     *   external files in a blocking way. If a preload\n     *   function is defined, setup() will wait until any\n     *   load calls within have finished. Nothing besides\n     *   load calls (loadImage, loadJSON, loadFont,\n     *   loadStrings, etc.) should be inside the preload\n     *   function. If asynchronous loading is preferred,\n     *   the load methods can instead be called in setup()\n     *   or anywhere else with the use of a callback\n     *   parameter.  By default the text \"loading...\" will\n     *   be displayed. To make your own loading page,\n     *   include an HTML element with id \"p5_loading\" in\n     *   your page. More information here.\n     */\n    preload(): void;\n\n    /**\n     *   The setup() function is called once when the\n     *   program starts. It's used to define initial\n     *   environment properties such as screen size and\n     *   background color and to load media such as images\n     *   and fonts as the program starts. There can only be\n     *   one setup() function for each program and it\n     *   shouldn't be called again after its initial\n     *   execution.  Note: Variables declared within\n     *   setup() are not accessible within other functions,\n     *   including draw().\n     */\n    setup(): void;\n\n    /**\n     *   Called directly after setup(), the draw() function\n     *   continuously executes the lines of code contained\n     *   inside its block until the program is stopped or\n     *   noLoop() is called. Note if noLoop() is called in\n     *   setup(), draw() will still be executed once before\n     *   stopping. draw() is called automatically and\n     *   should never be called explicitly.  It should\n     *   always be controlled with noLoop(), redraw() and\n     *   loop(). After noLoop() stops the code in draw()\n     *   from executing, redraw() causes the code inside\n     *   draw() to execute once, and loop() will cause the\n     *   code inside draw() to resume executing\n     *   continuously.\n     *\n     *\n     *   The number of times draw() executes in each second\n     *   may be controlled with the frameRate() function.\n     *\n     *\n     *   There can only be one draw() function for each\n     *   sketch, and draw() must exist if you want the code\n     *   to run continuously, or to process events such as\n     *   mousePressed(). Sometimes, you might have an empty\n     *   call to draw() in your program, as shown in the\n     *   above example.\n     *\n     *\n     *   It is important to note that the drawing\n     *   coordinate system will be reset at the beginning\n     *   of each draw() call. If any transformations are\n     *   performed within draw() (ex: scale, rotate,\n     *   translate), their effects will be undone at the\n     *   beginning of draw(), so transformations will not\n     *   accumulate over time. On the other hand, styling\n     *   applied (ex: fill, stroke, etc) will remain in\n     *   effect.\n     */\n    draw(): void;\n\n    /**\n     *   Removes the entire p5 sketch. This will remove the\n     *   canvas and any elements created by p5.js. It will\n     *   also stop the draw loop and unbind any properties\n     *   or methods from the window global scope. It will\n     *   leave a variable p5 in case you wanted to create a\n     *   new p5 sketch. If you like, you can set p5 = null\n     *   to erase it. While all functions and variables and\n     *   objects created by the p5 library will be removed,\n     *   any other global variables created by your code\n     *   will remain.\n     */\n    remove(): void;\n\n    /**\n     *   Allows for the friendly error system (FES) to be\n     *   turned off when creating a sketch, which can give\n     *   a significant boost to performance when needed.\n     *   See  disabling the friendly error system.\n     */\n    disableFriendlyErrors: boolean;\n}\n\n// tslint:disable-next-line:no-empty-interface\ninterface p5 extends p5.p5InstanceExtensions {}\n\ndeclare namespace p5 {\n    type UNKNOWN_P5_CONSTANT = any;\n    // tslint:disable-next-line:no-empty-interface\n    interface p5InstanceExtensions {}\n}\n"
+  "master:types/p5/index.d.ts": "// Type definitions for p5 0.9\n// Project: https://github.com/processing/p5.js\n// Definitions by: p5-types <https://github.com/p5-types>\n//                 Pierre Krafft <https://github.com/Zalastax>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.9\n\n// This file was auto-generated. Please do not edit it.\n\n/// <reference path=\"./lib/addons/p5.dom.d.ts\" />\n/// <reference path=\"./src/color/creating_reading.d.ts\" />\n/// <reference path=\"./src/color/setting.d.ts\" />\n/// <reference path=\"./src/core/shape/2d_primitives.d.ts\" />\n/// <reference path=\"./src/core/shape/attributes.d.ts\" />\n/// <reference path=\"./src/core/shape/curves.d.ts\" />\n/// <reference path=\"./src/core/shape/vertex.d.ts\" />\n/// <reference path=\"./src/core/constants.d.ts\" />\n/// <reference path=\"./src/core/environment.d.ts\" />\n/// <reference path=\"./src/core/rendering.d.ts\" />\n/// <reference path=\"./src/core/structure.d.ts\" />\n/// <reference path=\"./src/core/transform.d.ts\" />\n/// <reference path=\"./src/data/local_storage.d.ts\" />\n/// <reference path=\"./src/data/p5.TypedDict.d.ts\" />\n/// <reference path=\"./src/events/acceleration.d.ts\" />\n/// <reference path=\"./src/events/keyboard.d.ts\" />\n/// <reference path=\"./src/events/mouse.d.ts\" />\n/// <reference path=\"./src/events/touch.d.ts\" />\n/// <reference path=\"./src/image/image.d.ts\" />\n/// <reference path=\"./src/image/loading_displaying.d.ts\" />\n/// <reference path=\"./src/image/pixels.d.ts\" />\n/// <reference path=\"./src/io/files.d.ts\" />\n/// <reference path=\"./src/math/calculation.d.ts\" />\n/// <reference path=\"./src/math/math.d.ts\" />\n/// <reference path=\"./src/math/noise.d.ts\" />\n/// <reference path=\"./src/math/random.d.ts\" />\n/// <reference path=\"./src/math/trigonometry.d.ts\" />\n/// <reference path=\"./src/typography/attributes.d.ts\" />\n/// <reference path=\"./src/typography/loading_displaying.d.ts\" />\n/// <reference path=\"./src/utilities/array_functions.d.ts\" />\n/// <reference path=\"./src/utilities/conversion.d.ts\" />\n/// <reference path=\"./src/utilities/string_functions.d.ts\" />\n/// <reference path=\"./src/utilities/time_date.d.ts\" />\n/// <reference path=\"./src/webgl/3d_primitives.d.ts\" />\n/// <reference path=\"./src/webgl/interaction.d.ts\" />\n/// <reference path=\"./src/webgl/light.d.ts\" />\n/// <reference path=\"./src/webgl/loading.d.ts\" />\n/// <reference path=\"./src/webgl/material.d.ts\" />\n/// <reference path=\"./src/webgl/p5.Camera.d.ts\" />\n/// <reference path=\"./src/webgl/p5.RendererGL.d.ts\" />\n/// <reference path=\"./src/color/p5.Color.d.ts\" />\n/// <reference path=\"./src/core/p5.Element.d.ts\" />\n/// <reference path=\"./src/core/p5.Graphics.d.ts\" />\n/// <reference path=\"./src/image/p5.Image.d.ts\" />\n/// <reference path=\"./src/io/p5.Table.d.ts\" />\n/// <reference path=\"./src/io/p5.TableRow.d.ts\" />\n/// <reference path=\"./src/io/p5.XML.d.ts\" />\n/// <reference path=\"./src/math/p5.Vector.d.ts\" />\n/// <reference path=\"./src/typography/p5.Font.d.ts\" />\n/// <reference path=\"./src/webgl/p5.Geometry.d.ts\" />\n/// <reference path=\"./src/webgl/p5.Shader.d.ts\" />\n/// <reference path=\"./src/core/p5.Renderer.d.ts\" />\n/// <reference path=\"./literals.d.ts\" />\n/// <reference path=\"./constants.d.ts\" />\nexport = p5;\ndeclare class p5 {\n    /**\n     *   This is the p5 instance constructor. A p5 instance\n     *   holds all the properties and methods related to a\n     *   p5 sketch. It expects an incoming sketch closure\n     *   and it can also take an optional node parameter\n     *   for attaching the generated p5 canvas to a node.\n     *   The sketch closure takes the newly created p5\n     *   instance as its sole argument and may optionally\n     *   set preload(), setup(), and/or draw() properties\n     *   on it for running a sketch.\n     *\n     *   A p5 sketch can run in \"global\" or \"instance\"\n     *   mode: \"global\" - all properties and methods are\n     *   attached to the window \"instance\" - all properties\n     *   and methods are bound to this p5 object\n     *\n     *   @param sketch a closure that can set optional\n     *   preload(), setup(), and/or draw() properties on\n     *   the given p5 instance\n     *   @param [node] element to attach canvas to\n     *   @return a p5 instance\n     */\n    constructor(sketch: (...args: any[]) => any, node?: HTMLElement);\n\n    /**\n     *   Called directly before setup(), the preload()\n     *   function is used to handle asynchronous loading of\n     *   external files in a blocking way. If a preload\n     *   function is defined, setup() will wait until any\n     *   load calls within have finished. Nothing besides\n     *   load calls (loadImage, loadJSON, loadFont,\n     *   loadStrings, etc.) should be inside the preload\n     *   function. If asynchronous loading is preferred,\n     *   the load methods can instead be called in setup()\n     *   or anywhere else with the use of a callback\n     *   parameter.  By default the text \"loading...\" will\n     *   be displayed. To make your own loading page,\n     *   include an HTML element with id \"p5_loading\" in\n     *   your page. More information here.\n     */\n    preload(): void;\n\n    /**\n     *   The setup() function is called once when the\n     *   program starts. It's used to define initial\n     *   environment properties such as screen size and\n     *   background color and to load media such as images\n     *   and fonts as the program starts. There can only be\n     *   one setup() function for each program and it\n     *   shouldn't be called again after its initial\n     *   execution.  Note: Variables declared within\n     *   setup() are not accessible within other functions,\n     *   including draw().\n     */\n    setup(): void;\n\n    /**\n     *   Called directly after setup(), the draw() function\n     *   continuously executes the lines of code contained\n     *   inside its block until the program is stopped or\n     *   noLoop() is called. Note if noLoop() is called in\n     *   setup(), draw() will still be executed once before\n     *   stopping. draw() is called automatically and\n     *   should never be called explicitly.  It should\n     *   always be controlled with noLoop(), redraw() and\n     *   loop(). After noLoop() stops the code in draw()\n     *   from executing, redraw() causes the code inside\n     *   draw() to execute once, and loop() will cause the\n     *   code inside draw() to resume executing\n     *   continuously.\n     *\n     *\n     *   The number of times draw() executes in each second\n     *   may be controlled with the frameRate() function.\n     *\n     *\n     *   There can only be one draw() function for each\n     *   sketch, and draw() must exist if you want the code\n     *   to run continuously, or to process events such as\n     *   mousePressed(). Sometimes, you might have an empty\n     *   call to draw() in your program, as shown in the\n     *   above example.\n     *\n     *\n     *   It is important to note that the drawing\n     *   coordinate system will be reset at the beginning\n     *   of each draw() call. If any transformations are\n     *   performed within draw() (ex: scale, rotate,\n     *   translate), their effects will be undone at the\n     *   beginning of draw(), so transformations will not\n     *   accumulate over time. On the other hand, styling\n     *   applied (ex: fill, stroke, etc) will remain in\n     *   effect.\n     */\n    draw(): void;\n\n    /**\n     *   Removes the entire p5 sketch. This will remove the\n     *   canvas and any elements created by p5.js. It will\n     *   also stop the draw loop and unbind any properties\n     *   or methods from the window global scope. It will\n     *   leave a variable p5 in case you wanted to create a\n     *   new p5 sketch. If you like, you can set p5 = null\n     *   to erase it. While all functions and variables and\n     *   objects created by the p5 library will be removed,\n     *   any other global variables created by your code\n     *   will remain.\n     */\n    remove(): void;\n\n    /**\n     *   Allows for the friendly error system (FES) to be\n     *   turned off when creating a sketch, which can give\n     *   a significant boost to performance when needed.\n     *   See  disabling the friendly error system.\n     */\n    disableFriendlyErrors: boolean;\n}\n\n// tslint:disable-next-line:no-empty-interface\ninterface p5 extends p5.p5InstanceExtensions {}\n\ndeclare namespace p5 {\n    type UNKNOWN_P5_CONSTANT = any;\n    // tslint:disable-next-line:no-empty-interface\n    interface p5InstanceExtensions {}\n}\n",
+  "3e19cb9cae4689fb736fd6682f7f76d8efafcaa2:types/p5/index.d.ts": "// Type definitions for p5 0.9\n// Project: https://github.com/processing/p5.js\n// Definitions by: p5-types <https://github.com/p5-types>\n//                 Pierre Krafft <https://github.com/Zalastax>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.9\n\n// This file was auto-generated. Please do not edit it.\n\n/// <reference path=\"./lib/addons/p5.dom.d.ts\" />\n/// <reference path=\"./src/color/creating_reading.d.ts\" />\n/// <reference path=\"./src/color/setting.d.ts\" />\n/// <reference path=\"./src/core/shape/2d_primitives.d.ts\" />\n/// <reference path=\"./src/core/shape/attributes.d.ts\" />\n/// <reference path=\"./src/core/shape/curves.d.ts\" />\n/// <reference path=\"./src/core/shape/vertex.d.ts\" />\n/// <reference path=\"./src/core/constants.d.ts\" />\n/// <reference path=\"./src/core/environment.d.ts\" />\n/// <reference path=\"./src/core/rendering.d.ts\" />\n/// <reference path=\"./src/core/structure.d.ts\" />\n/// <reference path=\"./src/core/transform.d.ts\" />\n/// <reference path=\"./src/data/local_storage.d.ts\" />\n/// <reference path=\"./src/data/p5.TypedDict.d.ts\" />\n/// <reference path=\"./src/events/acceleration.d.ts\" />\n/// <reference path=\"./src/events/keyboard.d.ts\" />\n/// <reference path=\"./src/events/mouse.d.ts\" />\n/// <reference path=\"./src/events/touch.d.ts\" />\n/// <reference path=\"./src/image/image.d.ts\" />\n/// <reference path=\"./src/image/loading_displaying.d.ts\" />\n/// <reference path=\"./src/image/pixels.d.ts\" />\n/// <reference path=\"./src/io/files.d.ts\" />\n/// <reference path=\"./src/math/calculation.d.ts\" />\n/// <reference path=\"./src/math/math.d.ts\" />\n/// <reference path=\"./src/math/noise.d.ts\" />\n/// <reference path=\"./src/math/random.d.ts\" />\n/// <reference path=\"./src/math/trigonometry.d.ts\" />\n/// <reference path=\"./src/typography/attributes.d.ts\" />\n/// <reference path=\"./src/typography/loading_displaying.d.ts\" />\n/// <reference path=\"./src/utilities/array_functions.d.ts\" />\n/// <reference path=\"./src/utilities/conversion.d.ts\" />\n/// <reference path=\"./src/utilities/string_functions.d.ts\" />\n/// <reference path=\"./src/utilities/time_date.d.ts\" />\n/// <reference path=\"./src/webgl/3d_primitives.d.ts\" />\n/// <reference path=\"./src/webgl/interaction.d.ts\" />\n/// <reference path=\"./src/webgl/light.d.ts\" />\n/// <reference path=\"./src/webgl/loading.d.ts\" />\n/// <reference path=\"./src/webgl/material.d.ts\" />\n/// <reference path=\"./src/webgl/p5.Camera.d.ts\" />\n/// <reference path=\"./src/webgl/p5.RendererGL.d.ts\" />\n/// <reference path=\"./src/color/p5.Color.d.ts\" />\n/// <reference path=\"./src/core/p5.Element.d.ts\" />\n/// <reference path=\"./src/core/p5.Graphics.d.ts\" />\n/// <reference path=\"./src/image/p5.Image.d.ts\" />\n/// <reference path=\"./src/io/p5.Table.d.ts\" />\n/// <reference path=\"./src/io/p5.TableRow.d.ts\" />\n/// <reference path=\"./src/io/p5.XML.d.ts\" />\n/// <reference path=\"./src/math/p5.Vector.d.ts\" />\n/// <reference path=\"./src/typography/p5.Font.d.ts\" />\n/// <reference path=\"./src/webgl/p5.Geometry.d.ts\" />\n/// <reference path=\"./src/webgl/p5.Shader.d.ts\" />\n/// <reference path=\"./src/core/p5.Renderer.d.ts\" />\n/// <reference path=\"./literals.d.ts\" />\n/// <reference path=\"./constants.d.ts\" />\nexport = p5;\ndeclare class p5 {\n    /**\n     *   This is the p5 instance constructor. A p5 instance\n     *   holds all the properties and methods related to a\n     *   p5 sketch. It expects an incoming sketch closure\n     *   and it can also take an optional node parameter\n     *   for attaching the generated p5 canvas to a node.\n     *   The sketch closure takes the newly created p5\n     *   instance as its sole argument and may optionally\n     *   set preload(), setup(), and/or draw() properties\n     *   on it for running a sketch.\n     *\n     *   A p5 sketch can run in \"global\" or \"instance\"\n     *   mode: \"global\" - all properties and methods are\n     *   attached to the window \"instance\" - all properties\n     *   and methods are bound to this p5 object\n     *\n     *   @param sketch a closure that can set optional\n     *   preload(), setup(), and/or draw() properties on\n     *   the given p5 instance\n     *   @param [node] element to attach canvas to\n     *   @return a p5 instance\n     */\n    constructor(sketch: (...args: any[]) => any, node?: HTMLElement);\n\n    /**\n     *   Called directly before setup(), the preload()\n     *   function is used to handle asynchronous loading of\n     *   external files in a blocking way. If a preload\n     *   function is defined, setup() will wait until any\n     *   load calls within have finished. Nothing besides\n     *   load calls (loadImage, loadJSON, loadFont,\n     *   loadStrings, etc.) should be inside the preload\n     *   function. If asynchronous loading is preferred,\n     *   the load methods can instead be called in setup()\n     *   or anywhere else with the use of a callback\n     *   parameter.  By default the text \"loading...\" will\n     *   be displayed. To make your own loading page,\n     *   include an HTML element with id \"p5_loading\" in\n     *   your page. More information here.\n     */\n    preload(): void;\n\n    /**\n     *   The setup() function is called once when the\n     *   program starts. It's used to define initial\n     *   environment properties such as screen size and\n     *   background color and to load media such as images\n     *   and fonts as the program starts. There can only be\n     *   one setup() function for each program and it\n     *   shouldn't be called again after its initial\n     *   execution.  Note: Variables declared within\n     *   setup() are not accessible within other functions,\n     *   including draw().\n     */\n    setup(): void;\n\n    /**\n     *   Called directly after setup(), the draw() function\n     *   continuously executes the lines of code contained\n     *   inside its block until the program is stopped or\n     *   noLoop() is called. Note if noLoop() is called in\n     *   setup(), draw() will still be executed once before\n     *   stopping. draw() is called automatically and\n     *   should never be called explicitly.  It should\n     *   always be controlled with noLoop(), redraw() and\n     *   loop(). After noLoop() stops the code in draw()\n     *   from executing, redraw() causes the code inside\n     *   draw() to execute once, and loop() will cause the\n     *   code inside draw() to resume executing\n     *   continuously.\n     *\n     *\n     *   The number of times draw() executes in each second\n     *   may be controlled with the frameRate() function.\n     *\n     *\n     *   There can only be one draw() function for each\n     *   sketch, and draw() must exist if you want the code\n     *   to run continuously, or to process events such as\n     *   mousePressed(). Sometimes, you might have an empty\n     *   call to draw() in your program, as shown in the\n     *   above example.\n     *\n     *\n     *   It is important to note that the drawing\n     *   coordinate system will be reset at the beginning\n     *   of each draw() call. If any transformations are\n     *   performed within draw() (ex: scale, rotate,\n     *   translate), their effects will be undone at the\n     *   beginning of draw(), so transformations will not\n     *   accumulate over time. On the other hand, styling\n     *   applied (ex: fill, stroke, etc) will remain in\n     *   effect.\n     */\n    draw(): void;\n\n    /**\n     *   Removes the entire p5 sketch. This will remove the\n     *   canvas and any elements created by p5.js. It will\n     *   also stop the draw loop and unbind any properties\n     *   or methods from the window global scope. It will\n     *   leave a variable p5 in case you wanted to create a\n     *   new p5 sketch. If you like, you can set p5 = null\n     *   to erase it. While all functions and variables and\n     *   objects created by the p5 library will be removed,\n     *   any other global variables created by your code\n     *   will remain.\n     */\n    remove(): void;\n\n    /**\n     *   Allows for the friendly error system (FES) to be\n     *   turned off when creating a sketch, which can give\n     *   a significant boost to performance when needed.\n     *   See  disabling the friendly error system.\n     */\n    disableFriendlyErrors: boolean;\n}\n\n// tslint:disable-next-line:no-empty-interface\ninterface p5 extends p5.p5InstanceExtensions {}\n\ndeclare namespace p5 {\n    type UNKNOWN_P5_CONSTANT = any;\n    // tslint:disable-next-line:no-empty-interface\n    interface p5InstanceExtensions {}\n}\n"
 }
diff --git a/src/_tests/fixtures/48216/_files.json b/src/_tests/fixtures/48216/_files.json
index 99a97ce..800b2f8 100644
--- a/src/_tests/fixtures/48216/_files.json
+++ b/src/_tests/fixtures/48216/_files.json
@@ -1,5 +1,6 @@
 {
   "3f689bfb9d310612cdaf7c52c7ead41d1181b52f:types/apptimize__apptimize-web-sdk/tsconfig.json": "{\n    \"compilerOptions\": {\n        \"module\": \"commonjs\",\n        \"lib\": [\n            \"es6\"\n        ],\n        \"noImplicitAny\": true,\n        \"noImplicitThis\": true,\n        \"strictNullChecks\": true,\n        \"strictFunctionTypes\": true,\n        \"baseUrl\": \"../\",\n        \"typeRoots\": [\n            \"../\"\n        ],\n        \"types\": [],\n        \"noEmit\": true,\n        \"forceConsistentCasingInFileNames\": true,\n        \"paths\": {\n            \"@apptimize/*\": [\n                \"apptimize__*\"\n            ]\n        }\n    },\n    \"files\": [\n        \"index.d.ts\",\n        \"apptimize__apptimize-web-sdk-tests.ts\"\n    ]\n}\n",
   "master:types/apptimize__apptimize-web-sdk/tsconfig.json": "{\n    \"compilerOptions\": {\n        \"module\": \"commonjs\",\n        \"lib\": [\n            \"es6\"\n        ],\n        \"noImplicitAny\": true,\n        \"noImplicitThis\": true,\n        \"strictNullChecks\": true,\n        \"strictFunctionTypes\": true,\n        \"baseUrl\": \"../\",\n        \"typeRoots\": [\n            \"../\"\n        ],\n        \"types\": [],\n        \"noEmit\": true,\n        \"forceConsistentCasingInFileNames\": true\n    },\n    \"files\": [\n        \"index.d.ts\",\n        \"apptimize__apptimize-web-sdk-tests.ts\"\n    ]\n}\n",
-  "master:types/apptimize__apptimize-web-sdk/index.d.ts": "// Type definitions for @apptimize/apptimize-web-sdk 1.2\n// Project: https://www.npmjs.com/package/@apptimize/apptimize-web-sdk\n// Definitions by: Vivint Team Innovation <https://github.com/innovation-team>\n//                 Robert Baxter <https://github.com/rlbaxter>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n\ninterface Dictionary<T> {\n    [key: string]: T;\n}\n\n// Named export this interface for use in setup method parameter\nexport interface ConfigAttributes {\n    log_level?: 'LOG_LEVEL_VERBOSE' | 'LOG_LEVEL_DEBUG' | 'LOG_LEVEL_INFO' | 'LOG_LEVEL_WARN' | 'LOG_LEVEL_ERROR' | 'LOG_LEVEL_NONE';\n    result_post_delay_ms?: number;\n}\n\n// Named export this interface for use in callback methods\nexport interface VariantInfo {\n    getAnonymousUserId(): string;\n    getCurrentPhase(): number;\n    getCycle(): number;\n    getExperimentId(): number;\n    getExperimentName(): string;\n    getExperimentType(): number;\n    getExperimentTypeName(): string;\n    getParticipationPhase(): number;\n    getUserHasParticipated(): boolean;\n    getUserId(): string;\n    getVariantId(): number;\n    getVariantName(): string;\n}\n\ntype simpleData = string | number | boolean;\ntype callback = () => void;\ntype variantInfoCallback = (variantInfo: VariantInfo) => void;\ntype unenrollmentCallback = (variantInfo: VariantInfo, unenrollmentReason: string) => void;\n\ninterface Apptimize {\n    flushTracking(): void;\n    getApptimizeAnonUserId(): string;\n    getApptimizeSDKPlatform(): string;\n    getApptimizeSDKVersion(): string;\n    getBool(name: string, defaultValue: boolean): boolean;\n    getBoolArray(name: string, defaultValue: boolean[]): boolean[];\n    getBoolDictionary(name: string, defaultValue: Dictionary<boolean>): Dictionary<boolean>;\n    getCustomAttributes(): Dictionary<simpleData>;\n    getCustomerUserId(): string;\n    getDouble(name: string, defaultValue: number): number;\n    getDoubleArray(name: string, defaultValue: number[]): number[];\n    getDoubleDictionary(name: string, defaultValue: Dictionary<number>): Dictionary<number>;\n    getInt(name: string, defaultValue: number): number;\n    getIntArray(name: string, defaultValue: number[]): number[];\n    getIntDictionary(name: string, defaultValue: Dictionary<number>): Dictionary<number>;\n    getString(name: string, defaultValue: string): string;\n    getStringArray(name: string, defaultValue: string[]): string[];\n    getStringDictionary(name: string, defaultValue: Dictionary<string>): Dictionary<string>;\n    getVariantInfo(): VariantInfo[];\n    isFeatureFlagEnabled(name: string): boolean;\n    runCodeBlock(codeBlockVariableName: string, callback: Dictionary<callback>): void;\n    setAppName(name: string): void;\n    setAppVersion(version: string): void;\n    setCustomAttributes(attributes: Dictionary<simpleData>): void;\n    setCustomerUserId(id: string): void;\n    setOnApptimizeInitializedCallback(callback: callback): void;\n    setOnEnrolledInExperimentCallback(callback: variantInfoCallback): void;\n    setOnMetadataUpdatedCallback(callback: callback): void;\n    setOnParticipatedInExperimentCallback(callback: variantInfoCallback): void;\n    setOnUnenrolledInExperimentCallback(callback: unenrollmentCallback): void;\n    setPilotTargetingId(id: string): void;\n    setup(appKey: string, configAttributes?: ConfigAttributes): void;\n    track(eventName: string): void;\n    trackValue(eventName: string, value: number): void;\n    updateApptimizeMetadataOnce(): void;\n}\n\ndeclare const apptimize: Apptimize;\nexport default apptimize;\n"
+  "master:types/apptimize__apptimize-web-sdk/index.d.ts": "// Type definitions for @apptimize/apptimize-web-sdk 1.2\n// Project: https://www.npmjs.com/package/@apptimize/apptimize-web-sdk\n// Definitions by: Vivint Team Innovation <https://github.com/innovation-team>\n//                 Robert Baxter <https://github.com/rlbaxter>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n\ninterface Dictionary<T> {\n    [key: string]: T;\n}\n\n// Named export this interface for use in setup method parameter\nexport interface ConfigAttributes {\n    log_level?: 'LOG_LEVEL_VERBOSE' | 'LOG_LEVEL_DEBUG' | 'LOG_LEVEL_INFO' | 'LOG_LEVEL_WARN' | 'LOG_LEVEL_ERROR' | 'LOG_LEVEL_NONE';\n    result_post_delay_ms?: number;\n}\n\n// Named export this interface for use in callback methods\nexport interface VariantInfo {\n    getAnonymousUserId(): string;\n    getCurrentPhase(): number;\n    getCycle(): number;\n    getExperimentId(): number;\n    getExperimentName(): string;\n    getExperimentType(): number;\n    getExperimentTypeName(): string;\n    getParticipationPhase(): number;\n    getUserHasParticipated(): boolean;\n    getUserId(): string;\n    getVariantId(): number;\n    getVariantName(): string;\n}\n\ntype simpleData = string | number | boolean;\ntype callback = () => void;\ntype variantInfoCallback = (variantInfo: VariantInfo) => void;\ntype unenrollmentCallback = (variantInfo: VariantInfo, unenrollmentReason: string) => void;\n\ninterface Apptimize {\n    flushTracking(): void;\n    getApptimizeAnonUserId(): string;\n    getApptimizeSDKPlatform(): string;\n    getApptimizeSDKVersion(): string;\n    getBool(name: string, defaultValue: boolean): boolean;\n    getBoolArray(name: string, defaultValue: boolean[]): boolean[];\n    getBoolDictionary(name: string, defaultValue: Dictionary<boolean>): Dictionary<boolean>;\n    getCustomAttributes(): Dictionary<simpleData>;\n    getCustomerUserId(): string;\n    getDouble(name: string, defaultValue: number): number;\n    getDoubleArray(name: string, defaultValue: number[]): number[];\n    getDoubleDictionary(name: string, defaultValue: Dictionary<number>): Dictionary<number>;\n    getInt(name: string, defaultValue: number): number;\n    getIntArray(name: string, defaultValue: number[]): number[];\n    getIntDictionary(name: string, defaultValue: Dictionary<number>): Dictionary<number>;\n    getString(name: string, defaultValue: string): string;\n    getStringArray(name: string, defaultValue: string[]): string[];\n    getStringDictionary(name: string, defaultValue: Dictionary<string>): Dictionary<string>;\n    getVariantInfo(): VariantInfo[];\n    isFeatureFlagEnabled(name: string): boolean;\n    runCodeBlock(codeBlockVariableName: string, callback: Dictionary<callback>): void;\n    setAppName(name: string): void;\n    setAppVersion(version: string): void;\n    setCustomAttributes(attributes: Dictionary<simpleData>): void;\n    setCustomerUserId(id: string): void;\n    setOnApptimizeInitializedCallback(callback: callback): void;\n    setOnEnrolledInExperimentCallback(callback: variantInfoCallback): void;\n    setOnMetadataUpdatedCallback(callback: callback): void;\n    setOnParticipatedInExperimentCallback(callback: variantInfoCallback): void;\n    setOnUnenrolledInExperimentCallback(callback: unenrollmentCallback): void;\n    setPilotTargetingId(id: string): void;\n    setup(appKey: string, configAttributes?: ConfigAttributes): void;\n    track(eventName: string): void;\n    trackValue(eventName: string, value: number): void;\n    updateApptimizeMetadataOnce(): void;\n}\n\ndeclare const apptimize: Apptimize;\nexport default apptimize;\n",
+  "3f689bfb9d310612cdaf7c52c7ead41d1181b52f:types/apptimize__apptimize-web-sdk/index.d.ts": "// Type definitions for @apptimize/apptimize-web-sdk 1.2\n// Project: https://www.npmjs.com/package/@apptimize/apptimize-web-sdk\n// Definitions by: Vivint Team Innovation <https://github.com/innovation-team>\n//                 Robert Baxter <https://github.com/rlbaxter>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n\ninterface Dictionary<T> {\n    [key: string]: T;\n}\n\n// Named export this interface for use in setup method parameter\nexport interface ConfigAttributes {\n    log_level?: 'LOG_LEVEL_VERBOSE' | 'LOG_LEVEL_DEBUG' | 'LOG_LEVEL_INFO' | 'LOG_LEVEL_WARN' | 'LOG_LEVEL_ERROR' | 'LOG_LEVEL_NONE';\n    result_post_delay_ms?: number;\n}\n\n// Named export this interface for use in callback methods\nexport interface VariantInfo {\n    getAnonymousUserId(): string;\n    getCurrentPhase(): number;\n    getCycle(): number;\n    getExperimentId(): number;\n    getExperimentName(): string;\n    getExperimentType(): number;\n    getExperimentTypeName(): string;\n    getParticipationPhase(): number;\n    getUserHasParticipated(): boolean;\n    getUserId(): string;\n    getVariantId(): number;\n    getVariantName(): string;\n}\n\ntype simpleData = string | number | boolean;\ntype callback = () => void;\ntype variantInfoCallback = (variantInfo: VariantInfo) => void;\ntype unenrollmentCallback = (variantInfo: VariantInfo, unenrollmentReason: string) => void;\n\ninterface Apptimize {\n    flushTracking(): void;\n    getApptimizeAnonUserId(): string;\n    getApptimizeSDKPlatform(): string;\n    getApptimizeSDKVersion(): string;\n    getBool(name: string, defaultValue: boolean): boolean;\n    getBoolArray(name: string, defaultValue: boolean[]): boolean[];\n    getBoolDictionary(name: string, defaultValue: Dictionary<boolean>): Dictionary<boolean>;\n    getCustomAttributes(): Dictionary<simpleData>;\n    getCustomerUserId(): string;\n    getDouble(name: string, defaultValue: number): number;\n    getDoubleArray(name: string, defaultValue: number[]): number[];\n    getDoubleDictionary(name: string, defaultValue: Dictionary<number>): Dictionary<number>;\n    getInt(name: string, defaultValue: number): number;\n    getIntArray(name: string, defaultValue: number[]): number[];\n    getIntDictionary(name: string, defaultValue: Dictionary<number>): Dictionary<number>;\n    getString(name: string, defaultValue: string): string;\n    getStringArray(name: string, defaultValue: string[]): string[];\n    getStringDictionary(name: string, defaultValue: Dictionary<string>): Dictionary<string>;\n    getVariantInfo(): VariantInfo[];\n    isFeatureFlagEnabled(name: string): boolean;\n    runCodeBlock(codeBlockVariableName: string, callback: Dictionary<callback>): void;\n    setAppName(name: string): void;\n    setAppVersion(version: string): void;\n    setCustomAttributes(attributes: Dictionary<simpleData>): void;\n    setCustomerUserId(id: string): void;\n    setOnApptimizeInitializedCallback(callback: callback): void;\n    setOnEnrolledInExperimentCallback(callback: variantInfoCallback): void;\n    setOnMetadataUpdatedCallback(callback: callback): void;\n    setOnParticipatedInExperimentCallback(callback: variantInfoCallback): void;\n    setOnUnenrolledInExperimentCallback(callback: unenrollmentCallback): void;\n    setPilotTargetingId(id: string): void;\n    setup(appKey: string, configAttributes?: ConfigAttributes): void;\n    track(eventName: string): void;\n    trackValue(eventName: string, value: number): void;\n    updateApptimizeMetadataOnce(): void;\n}\n\ndeclare const apptimize: Apptimize;\nexport default apptimize;\n"
 }
diff --git a/src/_tests/fixtures/48236/_files.json b/src/_tests/fixtures/48236/_files.json
index 56fb2a1..5b4ee87 100644
--- a/src/_tests/fixtures/48236/_files.json
+++ b/src/_tests/fixtures/48236/_files.json
@@ -1,5 +1,6 @@
 {
   "b4d71f672f0f204a514002348ebc2025d18866ca:types/woocommerce__woocommerce-rest-api/tsconfig.json": "{\n    \"compilerOptions\": {\n        \"module\": \"commonjs\",\n        \"lib\": [\n            \"es6\"\n        ],\n        \"noImplicitAny\": true,\n        \"noImplicitThis\": true,\n        \"strictFunctionTypes\": true,\n        \"strictNullChecks\": true,\n        \"baseUrl\": \"../\",\n        \"typeRoots\": [\n            \"../\"\n        ],\n        \"types\": [],\n        \"noEmit\": true,\n        \"forceConsistentCasingInFileNames\": true,\n        \"paths\": {\n            \"@woocommerce/*\": [\n                \"woocommerce__*\"\n            ]\n        }\n    },\n    \"files\": [\n        \"index.d.ts\",\n        \"woocommerce__woocommerce-rest-api-tests.ts\"\n    ]\n}\n",
   "master:types/woocommerce__woocommerce-rest-api/tsconfig.json": "{\n    \"compilerOptions\": {\n        \"module\": \"commonjs\",\n        \"lib\": [\n            \"es6\"\n        ],\n        \"noImplicitAny\": true,\n        \"noImplicitThis\": true,\n        \"strictFunctionTypes\": true,\n        \"strictNullChecks\": true,\n        \"baseUrl\": \"../\",\n        \"typeRoots\": [\n            \"../\"\n        ],\n        \"types\": [],\n        \"noEmit\": true,\n        \"forceConsistentCasingInFileNames\": true\n    },\n    \"files\": [\n        \"index.d.ts\",\n        \"woocommerce__woocommerce-rest-api-tests.ts\"\n    ]\n}\n",
-  "master:types/woocommerce__woocommerce-rest-api/index.d.ts": "// Type definitions for @woocommerce/woocommerce-rest-api 1.0\n// Project: https://github.com/woocommerce/woocommerce-rest-api-js-lib\n// Definitions by: KaKa <https://github.com/climba03003>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\nexport type WooCommerceRestApiVersion = 'wc/v3' | 'wc/v2' | 'wc/v1' | 'wc-api/v3' | 'wc-api/v2' | 'wc-api/v1';\nexport type WooCommerceRestApiEncoding = 'utf-8' | 'ascii';\nexport type WooCommerceRestApiMethod = 'get' | 'post' | 'put' | 'delete' | 'options';\n\nexport interface WooCommerceRestApiOptions {\n    /* Your Store URL, example: http://woo.dev/ */\n    url: string;\n    /* Your API consumer key */\n    consumerKey: string;\n    /* Your API consumer secret */\n    consumerSecret: string;\n    /* Custom WP REST API URL prefix, used to support custom prefixes created with the `rest_url_prefix filter` */\n    wpAPIPrefix?: string;\n    /* API version, default is `v3` */\n    version?: WooCommerceRestApiVersion;\n    /* Encoding, default is 'utf-8' */\n    encoding?: WooCommerceRestApiEncoding;\n    /* When `true` and using under HTTPS force Basic Authentication as query string, default is `false` */\n    queryStringAuth?: boolean;\n    /* Provide support for URLs with ports, eg: `8080` */\n    port?: number;\n    /* Define the request timeout */\n    timeout?: number;\n    /* Define the custom Axios config, also override this library options */\n    axiosConfig?: any;\n}\n\nexport interface WooCommerceRestApiQuery {\n    [key: string]: string;\n}\n\n/**\n * WooCommerce REST API wrapper\n */\nexport default class WooCommerceRestApi {\n    classVersion: string;\n    url: string;\n    consumerKey: string;\n    consumerSecret: string;\n    wpAPIPrefix: string;\n    version: WooCommerceRestApiVersion;\n    encoding: WooCommerceRestApiEncoding;\n    queryStringAuth: boolean;\n    port: number;\n    timeout: number;\n    axiosConfig: any;\n\n    /**\n     * Class constructor.\n     */\n    constructor(opt: WooCommerceRestApiOptions | WooCommerceRestApi);\n\n    /**\n     * Set default options\n     */\n    _setDefaultsOptions(opt: WooCommerceRestApiOptions): void;\n\n    /**\n     * Parse params object.\n     */\n    _parseParamsObject(params: any, query: any): WooCommerceRestApiQuery;\n\n    /**\n     * Normalize query string for oAuth\n     */\n    _normalizeQueryString(url: string, params: any): string;\n\n    /**\n     * Get URL\n     */\n    _getUrl(endpoint: string, params: any): string;\n\n    /**\n     * Get OAuth\n     */\n    _getOAuth(): any;\n\n    /**\n     * Do requests\n     */\n    _request(method: WooCommerceRestApiMethod, endpoint: string, data: any, params: any): Promise<any>;\n\n    /**\n     * GET requests\n     */\n    get(endpoint: string, params?: any): Promise<any>;\n\n    /**\n     * POST requests\n     */\n    post(endpoint: string, data: any, params?: any): Promise<any>;\n\n    /**\n     * PUT requests\n     */\n    put(endpoint: string, data: any, params?: any): Promise<any>;\n\n    /**\n     * DELETE requests\n     */\n    delete(endpoint: string, params?: any): Promise<any>;\n\n    /**\n     * OPTIONS requests\n     */\n    options(endpoint: string, params?: any): Promise<any>;\n}\n\n/**\n * Options Exception.\n */\nexport class OptionsException {\n    name: 'Options Error';\n    message: string;\n\n    /**\n     * Constructor.\n     */\n    constructor(message: string);\n}\n"
+  "master:types/woocommerce__woocommerce-rest-api/index.d.ts": "// Type definitions for @woocommerce/woocommerce-rest-api 1.0\n// Project: https://github.com/woocommerce/woocommerce-rest-api-js-lib\n// Definitions by: KaKa <https://github.com/climba03003>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\nexport type WooCommerceRestApiVersion = 'wc/v3' | 'wc/v2' | 'wc/v1' | 'wc-api/v3' | 'wc-api/v2' | 'wc-api/v1';\nexport type WooCommerceRestApiEncoding = 'utf-8' | 'ascii';\nexport type WooCommerceRestApiMethod = 'get' | 'post' | 'put' | 'delete' | 'options';\n\nexport interface WooCommerceRestApiOptions {\n    /* Your Store URL, example: http://woo.dev/ */\n    url: string;\n    /* Your API consumer key */\n    consumerKey: string;\n    /* Your API consumer secret */\n    consumerSecret: string;\n    /* Custom WP REST API URL prefix, used to support custom prefixes created with the `rest_url_prefix filter` */\n    wpAPIPrefix?: string;\n    /* API version, default is `v3` */\n    version?: WooCommerceRestApiVersion;\n    /* Encoding, default is 'utf-8' */\n    encoding?: WooCommerceRestApiEncoding;\n    /* When `true` and using under HTTPS force Basic Authentication as query string, default is `false` */\n    queryStringAuth?: boolean;\n    /* Provide support for URLs with ports, eg: `8080` */\n    port?: number;\n    /* Define the request timeout */\n    timeout?: number;\n    /* Define the custom Axios config, also override this library options */\n    axiosConfig?: any;\n}\n\nexport interface WooCommerceRestApiQuery {\n    [key: string]: string;\n}\n\n/**\n * WooCommerce REST API wrapper\n */\nexport default class WooCommerceRestApi {\n    classVersion: string;\n    url: string;\n    consumerKey: string;\n    consumerSecret: string;\n    wpAPIPrefix: string;\n    version: WooCommerceRestApiVersion;\n    encoding: WooCommerceRestApiEncoding;\n    queryStringAuth: boolean;\n    port: number;\n    timeout: number;\n    axiosConfig: any;\n\n    /**\n     * Class constructor.\n     */\n    constructor(opt: WooCommerceRestApiOptions | WooCommerceRestApi);\n\n    /**\n     * Set default options\n     */\n    _setDefaultsOptions(opt: WooCommerceRestApiOptions): void;\n\n    /**\n     * Parse params object.\n     */\n    _parseParamsObject(params: any, query: any): WooCommerceRestApiQuery;\n\n    /**\n     * Normalize query string for oAuth\n     */\n    _normalizeQueryString(url: string, params: any): string;\n\n    /**\n     * Get URL\n     */\n    _getUrl(endpoint: string, params: any): string;\n\n    /**\n     * Get OAuth\n     */\n    _getOAuth(): any;\n\n    /**\n     * Do requests\n     */\n    _request(method: WooCommerceRestApiMethod, endpoint: string, data: any, params: any): Promise<any>;\n\n    /**\n     * GET requests\n     */\n    get(endpoint: string, params?: any): Promise<any>;\n\n    /**\n     * POST requests\n     */\n    post(endpoint: string, data: any, params?: any): Promise<any>;\n\n    /**\n     * PUT requests\n     */\n    put(endpoint: string, data: any, params?: any): Promise<any>;\n\n    /**\n     * DELETE requests\n     */\n    delete(endpoint: string, params?: any): Promise<any>;\n\n    /**\n     * OPTIONS requests\n     */\n    options(endpoint: string, params?: any): Promise<any>;\n}\n\n/**\n * Options Exception.\n */\nexport class OptionsException {\n    name: 'Options Error';\n    message: string;\n\n    /**\n     * Constructor.\n     */\n    constructor(message: string);\n}\n",
+  "b4d71f672f0f204a514002348ebc2025d18866ca:types/woocommerce__woocommerce-rest-api/index.d.ts": "// Type definitions for @woocommerce/woocommerce-rest-api 1.0\n// Project: https://github.com/woocommerce/woocommerce-rest-api-js-lib\n// Definitions by: KaKa <https://github.com/climba03003>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\nexport type WooCommerceRestApiVersion = 'wc/v3' | 'wc/v2' | 'wc/v1' | 'wc-api/v3' | 'wc-api/v2' | 'wc-api/v1';\nexport type WooCommerceRestApiEncoding = 'utf-8' | 'ascii';\nexport type WooCommerceRestApiMethod = 'get' | 'post' | 'put' | 'delete' | 'options';\n\nexport interface WooCommerceRestApiOptions {\n    /* Your Store URL, example: http://woo.dev/ */\n    url: string;\n    /* Your API consumer key */\n    consumerKey: string;\n    /* Your API consumer secret */\n    consumerSecret: string;\n    /* Custom WP REST API URL prefix, used to support custom prefixes created with the `rest_url_prefix filter` */\n    wpAPIPrefix?: string;\n    /* API version, default is `v3` */\n    version?: WooCommerceRestApiVersion;\n    /* Encoding, default is 'utf-8' */\n    encoding?: WooCommerceRestApiEncoding;\n    /* When `true` and using under HTTPS force Basic Authentication as query string, default is `false` */\n    queryStringAuth?: boolean;\n    /* Provide support for URLs with ports, eg: `8080` */\n    port?: number;\n    /* Define the request timeout */\n    timeout?: number;\n    /* Define the custom Axios config, also override this library options */\n    axiosConfig?: any;\n}\n\nexport interface WooCommerceRestApiQuery {\n    [key: string]: string;\n}\n\n/**\n * WooCommerce REST API wrapper\n */\nexport default class WooCommerceRestApi {\n    classVersion: string;\n    url: string;\n    consumerKey: string;\n    consumerSecret: string;\n    wpAPIPrefix: string;\n    version: WooCommerceRestApiVersion;\n    encoding: WooCommerceRestApiEncoding;\n    queryStringAuth: boolean;\n    port: number;\n    timeout: number;\n    axiosConfig: any;\n\n    /**\n     * Class constructor.\n     */\n    constructor(opt: WooCommerceRestApiOptions | WooCommerceRestApi);\n\n    /**\n     * Set default options\n     */\n    _setDefaultsOptions(opt: WooCommerceRestApiOptions): void;\n\n    /**\n     * Parse params object.\n     */\n    _parseParamsObject(params: any, query: any): WooCommerceRestApiQuery;\n\n    /**\n     * Normalize query string for oAuth\n     */\n    _normalizeQueryString(url: string, params: any): string;\n\n    /**\n     * Get URL\n     */\n    _getUrl(endpoint: string, params: any): string;\n\n    /**\n     * Get OAuth\n     */\n    _getOAuth(): any;\n\n    /**\n     * Do requests\n     */\n    _request(method: WooCommerceRestApiMethod, endpoint: string, data: any, params: any): Promise<any>;\n\n    /**\n     * GET requests\n     */\n    get(endpoint: string, params?: any): Promise<any>;\n\n    /**\n     * POST requests\n     */\n    post(endpoint: string, data: any, params?: any): Promise<any>;\n\n    /**\n     * PUT requests\n     */\n    put(endpoint: string, data: any, params?: any): Promise<any>;\n\n    /**\n     * DELETE requests\n     */\n    delete(endpoint: string, params?: any): Promise<any>;\n\n    /**\n     * OPTIONS requests\n     */\n    options(endpoint: string, params?: any): Promise<any>;\n}\n\n/**\n * Options Exception.\n */\nexport class OptionsException {\n    name: 'Options Error';\n    message: string;\n\n    /**\n     * Constructor.\n     */\n    constructor(message: string);\n}\n"
 }
diff --git a/src/_tests/fixtures/48708/_files.json b/src/_tests/fixtures/48708/_files.json
index 8c4c4f2..2a38b40 100644
--- a/src/_tests/fixtures/48708/_files.json
+++ b/src/_tests/fixtures/48708/_files.json
@@ -1,3 +1,4 @@
 {
-  "master:types/jquery/index.d.ts": "// Type definitions for jquery 3.5\n// Project: https://jquery.com\n// Definitions by: Leonard Thieu <https://github.com/leonard-thieu>\n//                 Boris Yankov <https://github.com/borisyankov>\n//                 Christian Hoffmeister <https://github.com/choffmeister>\n//                 Steve Fenton <https://github.com/Steve-Fenton>\n//                 Diullei Gomes <https://github.com/Diullei>\n//                 Tass Iliopoulos <https://github.com/tasoili>\n//                 Jason Swearingen <https://github.com/jasons-novaleaf>\n//                 Sean Hill <https://github.com/seanski>\n//                 Guus Goossens <https://github.com/Guuz>\n//                 Kelly Summerlin <https://github.com/ksummerlin>\n//                 Basarat Ali Syed <https://github.com/basarat>\n//                 Nicholas Wolverson <https://github.com/nwolverson>\n//                 Derek Cicerone <https://github.com/derekcicerone>\n//                 Andrew Gaspar <https://github.com/AndrewGaspar>\n//                 Seikichi Kondo <https://github.com/seikichi>\n//                 Benjamin Jackman <https://github.com/benjaminjackman>\n//                 Poul Sorensen <https://github.com/s093294>\n//                 Josh Strobl <https://github.com/JoshStrobl>\n//                 John Reilly <https://github.com/johnnyreilly>\n//                 Dick van den Brink <https://github.com/DickvdBrink>\n//                 Thomas Schulz <https://github.com/King2500>\n//                 Terry Mun <https://github.com/terrymun>\n//                 Martin Badin <https://github.com/martin-badin>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.7\n\n/// <reference types=\"sizzle\" />\n/// <reference path=\"JQueryStatic.d.ts\" />\n/// <reference path=\"JQuery.d.ts\" />\n/// <reference path=\"misc.d.ts\" />\n/// <reference path=\"legacy.d.ts\" />\n\nexport = jQuery;\n"
+  "master:types/jquery/index.d.ts": "// Type definitions for jquery 3.5\n// Project: https://jquery.com\n// Definitions by: Leonard Thieu <https://github.com/leonard-thieu>\n//                 Boris Yankov <https://github.com/borisyankov>\n//                 Christian Hoffmeister <https://github.com/choffmeister>\n//                 Steve Fenton <https://github.com/Steve-Fenton>\n//                 Diullei Gomes <https://github.com/Diullei>\n//                 Tass Iliopoulos <https://github.com/tasoili>\n//                 Jason Swearingen <https://github.com/jasons-novaleaf>\n//                 Sean Hill <https://github.com/seanski>\n//                 Guus Goossens <https://github.com/Guuz>\n//                 Kelly Summerlin <https://github.com/ksummerlin>\n//                 Basarat Ali Syed <https://github.com/basarat>\n//                 Nicholas Wolverson <https://github.com/nwolverson>\n//                 Derek Cicerone <https://github.com/derekcicerone>\n//                 Andrew Gaspar <https://github.com/AndrewGaspar>\n//                 Seikichi Kondo <https://github.com/seikichi>\n//                 Benjamin Jackman <https://github.com/benjaminjackman>\n//                 Poul Sorensen <https://github.com/s093294>\n//                 Josh Strobl <https://github.com/JoshStrobl>\n//                 John Reilly <https://github.com/johnnyreilly>\n//                 Dick van den Brink <https://github.com/DickvdBrink>\n//                 Thomas Schulz <https://github.com/King2500>\n//                 Terry Mun <https://github.com/terrymun>\n//                 Martin Badin <https://github.com/martin-badin>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.7\n\n/// <reference types=\"sizzle\" />\n/// <reference path=\"JQueryStatic.d.ts\" />\n/// <reference path=\"JQuery.d.ts\" />\n/// <reference path=\"misc.d.ts\" />\n/// <reference path=\"legacy.d.ts\" />\n\nexport = jQuery;\n",
+  "eb13547e342b1316aeea85df84983a534cfb092f:types/jquery/index.d.ts": "// Type definitions for jquery 3.5\n// Project: https://jquery.com\n// Definitions by: Leonard Thieu <https://github.com/leonard-thieu>\n//                 Boris Yankov <https://github.com/borisyankov>\n//                 Christian Hoffmeister <https://github.com/choffmeister>\n//                 Steve Fenton <https://github.com/Steve-Fenton>\n//                 Diullei Gomes <https://github.com/Diullei>\n//                 Tass Iliopoulos <https://github.com/tasoili>\n//                 Jason Swearingen <https://github.com/jasons-novaleaf>\n//                 Sean Hill <https://github.com/seanski>\n//                 Guus Goossens <https://github.com/Guuz>\n//                 Kelly Summerlin <https://github.com/ksummerlin>\n//                 Basarat Ali Syed <https://github.com/basarat>\n//                 Nicholas Wolverson <https://github.com/nwolverson>\n//                 Derek Cicerone <https://github.com/derekcicerone>\n//                 Andrew Gaspar <https://github.com/AndrewGaspar>\n//                 Seikichi Kondo <https://github.com/seikichi>\n//                 Benjamin Jackman <https://github.com/benjaminjackman>\n//                 Poul Sorensen <https://github.com/s093294>\n//                 Josh Strobl <https://github.com/JoshStrobl>\n//                 John Reilly <https://github.com/johnnyreilly>\n//                 Dick van den Brink <https://github.com/DickvdBrink>\n//                 Thomas Schulz <https://github.com/King2500>\n//                 Terry Mun <https://github.com/terrymun>\n//                 Martin Badin <https://github.com/martin-badin>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.7\n\n/// <reference types=\"sizzle\" />\n/// <reference path=\"JQueryStatic.d.ts\" />\n/// <reference path=\"JQuery.d.ts\" />\n/// <reference path=\"misc.d.ts\" />\n/// <reference path=\"legacy.d.ts\" />\n\nexport = jQuery;\n"
 }
diff --git a/src/_tests/fixtures/58764/_files.json b/src/_tests/fixtures/58764/_files.json
index 733ae21..5392244 100644
--- a/src/_tests/fixtures/58764/_files.json
+++ b/src/_tests/fixtures/58764/_files.json
@@ -1,5 +1,6 @@
 {
   "2cee47aedc9b4d321e378d7020984adf005fef64:types/bootstrap.v3.datetimepicker/index.d.ts": "// Type definitions for non-npm package Bootstrap 3 Datepicker 4.17\n// Project: http://eonasdan.github.io/bootstrap-datetimepicker\n// Definitions by: Katona Péter <https://github.com/katonap>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n// based on the previous version created by Jesica N. Fera <https://github.com/bayitajesi>\n\n/**\n * bootstrap-datetimepicker.js 4.17.45 Copyright (c) 2015 Jonathan Peterson\n * Available via the MIT license.\n * see: http://eonasdan.github.io/bootstrap-datetimepicker or https://github.com/Eonasdan/bootstrap-datetimepicker for details.\n */\n\n/// <reference types=\"jquery\"/>\n\nimport * as moment from \"moment\";\n\nexport as namespace BootstrapV3DatetimePicker;\n\nexport type InputParser = (input: string | Date | moment.Moment) => moment.Moment;\n\nexport interface Datetimepicker {\n    /** Clears the datepicker by setting the value to null */\n    clear(): void;\n    /** Returns the component's model current date, a moment object or null if not set. */\n    date(): moment.Moment;\n    /**\n     * Takes string, Date, moment, null parameter and sets the components model current moment to it.\n     * Passing a null value unsets the components model current moment.\n     * Parsing of the newDate parameter is made using moment library with the options.format and options.useStrict components configuration.\n     * Throws:\n     * - TypeError - in case the newDate cannot be parsed\n     *\n     * Emits:\n     * - dp.change - In case newDate is different from current moment\n     */\n    date(date: moment.Moment | Date | string | null): void;\n    /** Destroys the widget and removes all attached event listeners */\n    destroy(): void;\n    /**\n     * Disables the input element, the component is attached to, by adding a disabled=\"true\" attribute to it. If the widget was visible before that call it is hidden.\n     * Emits:\n     * - dp.hide - if the widget was visible before that call\n     */\n    disable(): void;\n    /** Enables the input element, the component is attached to, by removing disabled attribute from it. */\n    enable(): void;\n    /**\n     * Hides the widget\n     * Emits:\n     * - dp.hide - if the widget was visible before that call\n     */\n    hide(): void;\n    /**\n     * Returns the components current options object.\n     * Note that the changing the values of the returned object does not change the components actual configuration.\n     */\n    options(): DatetimepickerOptions;\n    /** Takes an object variable with option key:value properties and configures the component. Use this to update multiple options on the component. */\n    options(options: DatetimepickerOptions): void;\n    /**\n     * Shows the widget\n     * Emits:\n     * - dp.show - if the widget was hidden before that call\n     * - dp.change - if the widget is opened for the first time and the useCurrent is set to true or to a granularity value and the input element the component is attached to has an empty value\n     */\n    show(): void;\n    /**\n     * Shows or hides the widget\n     * Emits:\n     * - dp.hide - if the widget is hidden after the toggle call\n     * - dp.show - if the widget is show after the toggle call\n     * - dp.change - if the widget is opened for the first time and the input element is empty and options.useCurrent != false\n     */\n    toggle(): void;\n\n    ////////////////////////////////////////////////////////////////////////////////////////////////////\n    //// Below are the getters/setters for the properties of the 'options(): DatetimepickerOptions' ////\n    ////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    /** Returns the options.allowInputToggle option. */\n    allowInputToggle(): boolean;\n    /** If true, the picker will show on textbox focus and icon click when used in a button group */\n    allowInputToggle(value: boolean): void;\n    /** Returns the current options.calendarWeeks option configuration */\n    calendarWeeks(): boolean;\n    /** Set if the week numbers will appear to the left on the days view */\n    calendarWeeks(value: boolean): void;\n    /** Returns the options.collapse option configuration */\n    collapse(): boolean;\n    /** If set to false the picker will display similar to sideBySide except vertical. */\n    collapse(value: boolean): void;\n    /**\n     * Returns the options.daysOfWeekDisabled configuration\n     * IMPORTANT! Throws exception if not set explicitly https://github.com/Eonasdan/bootstrap-datetimepicker/issues/1459\n     */\n    daysOfWeekDisabled(): number[];\n    /**\n     * Takes an [ Number:0 to 6 ] and disallow the user to select weekdays that exist in this array.\n     * This has lower priority over the options.minDate, options.maxDate, options.disabledDates and options.enabledDates configuration settings.\n     * Emits:\n     * - dp.change - if the currently selected moment falls in the values passed on the daysOfWeek parameter.\n     * - dp.error - if the currently selected moment falls in the values passed on the daysOfWeek parameter.\n     */\n    daysOfWeekDisabled(days: number[]): void;\n    /** Returns the options.dayViewHeaderFormat option. */\n    dayViewHeaderFormat(): string;\n    /** Used to customize the header of the day view. */\n    dayViewHeaderFormat(value: string): void;\n    /** Returns a moment with the options.defaultDate option configuration or false if not set */\n    defaultDate(): moment.Moment | boolean;\n    /**\n     * Will set the picker's inital date.\n     * If a boolean:false value is passed the options.defaultDate parameter is cleared.\n     * Throws:\n     * - TypeError - if the provided date doesn't pass validation, including disabledDates, enabledDates, minDate, maxDate, and daysOfWeekDisabled\n     * - TypeError - if the provided date cannot be parsed by momentjs\n     */\n    defaultDate(date: string | Date | moment.Moment | boolean): void;\n    /**\n     * Returns the options.disabledDates option.\n     * NOTES: probably should be: disabledDates(): boolean | Array<moment.Moment>; see: DatetimepickerOptions\n     */\n    disabledDates(): boolean | any;\n    /**\n     * Takes an array of values and disallows the user to select those days.\n     * Setting this takes precedence over options.minDate, options.maxDate configuration.\n     * Also calling this function removes the configuration of options.enabledDates if such exist.\n     * Note: These values are matched with Day granularity.\n     */\n    disabledDates(dates: boolean | Array<string | Date | moment.Moment>): void;\n    /**\n     * Returns the options.disabledHours option.\n     * NOTES: probably should be: disabledHours(): boolean | number[]; see: DatetimepickerOptions\n     */\n    disabledHours(): boolean | any;\n    /**\n     * Must be in 24 hour format. Will disallow hour selections (much like disabledTimeIntervals) but will affect all days.\n     * Like en/disabledDates, the en/disabledHours options are mutually exclusive and will reset one of the options back to false.\n     */\n    disabledHours(value: boolean | number[]): void;\n    /**\n     * Returns the options.disabledTimeIntervals option, or... not exactly\n     * IMPORTANT! Creates an object from the options.disabledTimeIntervals with the keys being numbers, the values being the moment arrays.\n     * eg { \"0\": [<moment.Moment1>, <moment.Moment2>], \"1\": [...] }\n     * https://github.com/Eonasdan/bootstrap-datetimepicker/issues/1498\n     */\n    disabledTimeIntervals(): boolean | moment.Moment[][];\n    /**\n     * Disables time selection between the given moments\n     * eg: [[moment({ h: 0 }), moment({ h: 8 })], [moment({ h: 18 }), moment({ h: 24 })]]\n     */\n    disabledTimeIntervals(value: boolean | moment.Moment[][]): void;\n    /**\n     * Returns the options.enabledDates option\n     * NOTES: probably should be: enabledDates(): boolean | Array<moment.Moment>; see: DatetimepickerOptions\n     */\n    enabledDates(): boolean | any;\n    /**\n     * Takes an array of values and allows the user to select only from those days.\n     * Setting this takes precedence over options.minDate, options.maxDate configuration.\n     * Also calling this function removes the configuration of options.disabledDates if such exist.\n     * Note: These values are matched with Day granularity.\n     */\n    enabledDates(dates: boolean | Array<string | Date | moment.Moment>): void;\n    /**\n     * Returns the options.enabledHours option.\n     * NOTES: probably should be: enabledHours(): boolean | number[]; see: DatetimepickerOptions\n     */\n    enabledHours(): boolean | any;\n    /**\n     * Must be in 24 hour format. Will allow hour selections (much like enabledTimeIntervals) but will affect all days.\n     * Like en/disabledDates, the en/disabledHours options are mutually exclusive and will reset one of the options back to false.\n     */\n    enabledHours(value: boolean | number[]): void;\n    /** Returns a boolean or array with the options.extraFormats option configuration */\n    extraFormats(): boolean | Array<string | moment.MomentBuiltinFormat>;\n    /** Takes an array of valid input moment format options, or boolean:false */\n    extraFormats(formats: boolean | Array<string  | moment.MomentBuiltinFormat>): void;\n    /** Returns the options.focusOnShow option. */\n    focusOnShow(): boolean;\n    /** If false, the textbox will not be given focus when the picker is shown */\n    focusOnShow(value: boolean): void;\n    /** Returns the component's options.format string */\n    format(): boolean | string | moment.MomentBuiltinFormat;\n    /**\n     * Takes a moment.js format string and sets the components options.format.\n     * This is used for displaying and also for parsing input strings either from the input element the component is attached to or the date() function.\n     * The parameter can also be a boolean:false in which case the format is set to the locale's L LT.\n     * Note: this is also used to determine if the TimePicker sub component will display the hours in 12 or 24 format. (if \"a\" or \"h\" exists in the passed string then a 12 hour mode is set)\n     * Throws:\n     * - TypeError - if format is boolean:true\n     */\n    format(format: boolean | string | moment.MomentBuiltinFormat): void;\n    /** Returns options.icons */\n    icons(): Icons;\n    /*",
+  "9ba7dfc289e4ce1023a9d398b9e04a91ae3a9070:types/bootstrap.v3.datetimepicker/index.d.ts": "// Type definitions for non-npm package Bootstrap 3 Datepicker 4.17\n// Project: http://eonasdan.github.io/bootstrap-datetimepicker\n// Definitions by: Katona Péter <https://github.com/katonap>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 2.3\n// based on the previous version created by Jesica N. Fera <https://github.com/bayitajesi>\n\n/**\n * bootstrap-datetimepicker.js 4.17.45 Copyright (c) 2015 Jonathan Peterson\n * Available via the MIT license.\n * see: http://eonasdan.github.io/bootstrap-datetimepicker or https://github.com/Eonasdan/bootstrap-datetimepicker for details.\n */\n\n/// <reference types=\"jquery\"/>\n\nimport * as moment from \"moment\";\n\nexport as namespace BootstrapV3DatetimePicker;\n\nexport type InputParser = (input: string | Date | moment.Moment) => moment.Moment;\n\nexport interface Datetimepicker {\n    /** Clears the datepicker by setting the value to null */\n    clear(): void;\n    /** Returns the component's model current date, a moment object or null if not set. */\n    date(): moment.Moment;\n    /**\n     * Takes string, Date, moment, null parameter and sets the components model current moment to it.\n     * Passing a null value unsets the components model current moment.\n     * Parsing of the newDate parameter is made using moment library with the options.format and options.useStrict components configuration.\n     * Throws:\n     * - TypeError - in case the newDate cannot be parsed\n     *\n     * Emits:\n     * - dp.change - In case newDate is different from current moment\n     */\n    date(date: moment.Moment | Date | string | null): void;\n    /** Destroys the widget and removes all attached event listeners */\n    destroy(): void;\n    /**\n     * Disables the input element, the component is attached to, by adding a disabled=\"true\" attribute to it. If the widget was visible before that call it is hidden.\n     * Emits:\n     * - dp.hide - if the widget was visible before that call\n     */\n    disable(): void;\n    /** Enables the input element, the component is attached to, by removing disabled attribute from it. */\n    enable(): void;\n    /**\n     * Hides the widget\n     * Emits:\n     * - dp.hide - if the widget was visible before that call\n     */\n    hide(): void;\n    /**\n     * Returns the components current options object.\n     * Note that the changing the values of the returned object does not change the components actual configuration.\n     */\n    options(): DatetimepickerOptions;\n    /** Takes an object variable with option key:value properties and configures the component. Use this to update multiple options on the component. */\n    options(options: DatetimepickerOptions): void;\n    /**\n     * Shows the widget\n     * Emits:\n     * - dp.show - if the widget was hidden before that call\n     * - dp.change - if the widget is opened for the first time and the useCurrent is set to true or to a granularity value and the input element the component is attached to has an empty value\n     */\n    show(): void;\n    /**\n     * Shows or hides the widget\n     * Emits:\n     * - dp.hide - if the widget is hidden after the toggle call\n     * - dp.show - if the widget is show after the toggle call\n     * - dp.change - if the widget is opened for the first time and the input element is empty and options.useCurrent != false\n     */\n    toggle(): void;\n\n    ////////////////////////////////////////////////////////////////////////////////////////////////////\n    //// Below are the getters/setters for the properties of the 'options(): DatetimepickerOptions' ////\n    ////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    /** Returns the options.allowInputToggle option. */\n    allowInputToggle(): boolean;\n    /** If true, the picker will show on textbox focus and icon click when used in a button group */\n    allowInputToggle(value: boolean): void;\n    /** Returns the current options.calendarWeeks option configuration */\n    calendarWeeks(): boolean;\n    /** Set if the week numbers will appear to the left on the days view */\n    calendarWeeks(value: boolean): void;\n    /** Returns the options.collapse option configuration */\n    collapse(): boolean;\n    /** If set to false the picker will display similar to sideBySide except vertical. */\n    collapse(value: boolean): void;\n    /**\n     * Returns the options.daysOfWeekDisabled configuration\n     * IMPORTANT! Throws exception if not set explicitly https://github.com/Eonasdan/bootstrap-datetimepicker/issues/1459\n     */\n    daysOfWeekDisabled(): number[];\n    /**\n     * Takes an [ Number:0 to 6 ] and disallow the user to select weekdays that exist in this array.\n     * This has lower priority over the options.minDate, options.maxDate, options.disabledDates and options.enabledDates configuration settings.\n     * Emits:\n     * - dp.change - if the currently selected moment falls in the values passed on the daysOfWeek parameter.\n     * - dp.error - if the currently selected moment falls in the values passed on the daysOfWeek parameter.\n     */\n    daysOfWeekDisabled(days: number[]): void;\n    /** Returns the options.dayViewHeaderFormat option. */\n    dayViewHeaderFormat(): string;\n    /** Used to customize the header of the day view. */\n    dayViewHeaderFormat(value: string): void;\n    /** Returns a moment with the options.defaultDate option configuration or false if not set */\n    defaultDate(): moment.Moment | boolean;\n    /**\n     * Will set the picker's inital date.\n     * If a boolean:false value is passed the options.defaultDate parameter is cleared.\n     * Throws:\n     * - TypeError - if the provided date doesn't pass validation, including disabledDates, enabledDates, minDate, maxDate, and daysOfWeekDisabled\n     * - TypeError - if the provided date cannot be parsed by momentjs\n     */\n    defaultDate(date: string | Date | moment.Moment | boolean): void;\n    /**\n     * Returns the options.disabledDates option.\n     * NOTES: probably should be: disabledDates(): boolean | Array<moment.Moment>; see: DatetimepickerOptions\n     */\n    disabledDates(): boolean | any;\n    /**\n     * Takes an array of values and disallows the user to select those days.\n     * Setting this takes precedence over options.minDate, options.maxDate configuration.\n     * Also calling this function removes the configuration of options.enabledDates if such exist.\n     * Note: These values are matched with Day granularity.\n     */\n    disabledDates(dates: boolean | Array<string | Date | moment.Moment>): void;\n    /**\n     * Returns the options.disabledHours option.\n     * NOTES: probably should be: disabledHours(): boolean | number[]; see: DatetimepickerOptions\n     */\n    disabledHours(): boolean | any;\n    /**\n     * Must be in 24 hour format. Will disallow hour selections (much like disabledTimeIntervals) but will affect all days.\n     * Like en/disabledDates, the en/disabledHours options are mutually exclusive and will reset one of the options back to false.\n     */\n    disabledHours(value: boolean | number[]): void;\n    /**\n     * Returns the options.disabledTimeIntervals option, or... not exactly\n     * IMPORTANT! Creates an object from the options.disabledTimeIntervals with the keys being numbers, the values being the moment arrays.\n     * eg { \"0\": [<moment.Moment1>, <moment.Moment2>], \"1\": [...] }\n     * https://github.com/Eonasdan/bootstrap-datetimepicker/issues/1498\n     */\n    disabledTimeIntervals(): boolean | moment.Moment[][];\n    /**\n     * Disables time selection between the given moments\n     * eg: [[moment({ h: 0 }), moment({ h: 8 })], [moment({ h: 18 }), moment({ h: 24 })]]\n     */\n    disabledTimeIntervals(value: boolean | moment.Moment[][]): void;\n    /**\n     * Returns the options.enabledDates option\n     * NOTES: probably should be: enabledDates(): boolean | Array<moment.Moment>; see: DatetimepickerOptions\n     */\n    enabledDates(): boolean | any;\n    /**\n     * Takes an array of values and allows the user to select only from those days.\n     * Setting this takes precedence over options.minDate, options.maxDate configuration.\n     * Also calling this function removes the configuration of options.disabledDates if such exist.\n     * Note: These values are matched with Day granularity.\n     */\n    enabledDates(dates: boolean | Array<string | Date | moment.Moment>): void;\n    /**\n     * Returns the options.enabledHours option.\n     * NOTES: probably should be: enabledHours(): boolean | number[]; see: DatetimepickerOptions\n     */\n    enabledHours(): boolean | any;\n    /**\n     * Must be in 24 hour format. Will allow hour selections (much like enabledTimeIntervals) but will affect all days.\n     * Like en/disabledDates, the en/disabledHours options are mutually exclusive and will reset one of the options back to false.\n     */\n    enabledHours(value: boolean | number[]): void;\n    /** Returns a boolean or array with the options.extraFormats option configuration */\n    extraFormats(): boolean | Array<string | moment.MomentBuiltinFormat>;\n    /** Takes an array of valid input moment format options, or boolean:false */\n    extraFormats(formats: boolean | Array<string  | moment.MomentBuiltinFormat>): void;\n    /** Returns the options.focusOnShow option. */\n    focusOnShow(): boolean;\n    /** If false, the textbox will not be given focus when the picker is shown */\n    focusOnShow(value: boolean): void;\n    /** Returns the component's options.format string */\n    format(): boolean | string | moment.MomentBuiltinFormat;\n    /**\n     * Takes a moment.js format string and sets the components options.format.\n     * This is used for displaying and also for parsing input strings either from the input element the component is attached to or the date() function.\n     * The parameter can also be a boolean:false in which case the format is set to the locale's L LT.\n     * Note: this is also used to determine if the TimePicker sub component will display the hours in 12 or 24 format. (if \"a\" or \"h\" exists in the passed string then a 12 hour mode is set)\n     * Throws:\n     * - TypeError - if format is boolean:true\n     */\n    format(format: boolean | string | moment.MomentBuiltinFormat): void;\n    /** Returns options.icons */\n    icons(): Icons;\n    /*",
   "2cee47aedc9b4d321e378d7020984adf005fef64:types/mithril-global/index.d.ts": "// Type definitions for non-npm package Mithril 2.0\n// Project: https://mithril.js.org/\n// Definitions by: Mike Linkovich <https://github.com/spacejack>, Isiah Meadows <https://github.com/isiahmeadows>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 3.2\n\n// Global Mithril types\n\n/// <reference types=\"mithril\" />\n\nimport * as mithril from 'mithril';\nimport * as stream from 'mithril/stream';\n\ndeclare namespace MithrilGlobal {\n    export type CommonAttributes<A, S> = mithril.CommonAttributes<A, S>;\n    export type Hyperscript = mithril.Hyperscript;\n    export type RouteResolver<A = {}, S = {}> = mithril.RouteResolver<A, S>;\n    export type RouteDefs = mithril.RouteDefs;\n    export type RouteOptions = mithril.RouteOptions;\n    export type Route = mithril.Route;\n    export type RequestOptions<T> = mithril.RequestOptions<T>;\n    export type JsonpOptions = mithril.JsonpOptions;\n    export type Child = mithril.Child;\n    export type ChildArray = mithril.ChildArray;\n    export type Children = mithril.Children;\n    export type ChildArrayOrPrimitive = mithril.ChildArrayOrPrimitive;\n    export type Vnode<A = {}, S = {}> = mithril.Vnode<A, S>;\n    export type VnodeDOM<A = {}, S = {}> = mithril.VnodeDOM<A, S>;\n    export type CVnode<A = {}> = mithril.CVnode<A>;\n    export type CVnodeDOM<A = {}> = mithril.CVnodeDOM<A>;\n    export type Component<A = {}, S = {}> = mithril.Component<A, S>;\n    export type Comp<A = {}, S extends Partial<mithril.Component<A, S>> = {}> = mithril.Comp<A, S>;\n    export type ClassComponent<A = {}> = mithril.ClassComponent<A>;\n    export type FactoryComponent<A = {}> = mithril.FactoryComponent<A>;\n    export type ComponentTypes<A = {}, S extends Partial<mithril.Component<A, S>> = {}> = mithril.ComponentTypes<A, S>;\n    export type Attributes = mithril.Attributes;\n    export type Static = mithril.Static & { stream: typeof stream };\n    export type Stream<T> = stream<T>;\n}\n\ndeclare const MithrilGlobal: MithrilGlobal.Static;\nexport = MithrilGlobal;\nexport as namespace m;\n",
   "9ba7dfc289e4ce1023a9d398b9e04a91ae3a9070:types/mithril-global/index.d.ts": "// Type definitions for non-npm package Mithril 2.0\n// Project: https://mithril.js.org/\n// Definitions by: Mike Linkovich <https://github.com/spacejack>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 3.2\n\n// Global Mithril types\n\n/// <reference types=\"mithril\" />\n\nimport * as mithril from 'mithril';\nimport * as stream from 'mithril/stream';\n\ndeclare namespace MithrilGlobal {\n    export type CommonAttributes<A, S> = mithril.CommonAttributes<A, S>;\n    export type Hyperscript = mithril.Hyperscript;\n    export type RouteResolver<A = {}, S = {}> = mithril.RouteResolver<A, S>;\n    export type RouteDefs = mithril.RouteDefs;\n    export type RouteOptions = mithril.RouteOptions;\n    export type Route = mithril.Route;\n    export type RequestOptions<T> = mithril.RequestOptions<T>;\n    export type JsonpOptions = mithril.JsonpOptions;\n    export type Child = mithril.Child;\n    export type ChildArray = mithril.ChildArray;\n    export type Children = mithril.Children;\n    export type ChildArrayOrPrimitive = mithril.ChildArrayOrPrimitive;\n    export type Vnode<A = {}, S = {}> = mithril.Vnode<A, S>;\n    export type VnodeDOM<A = {}, S = {}> = mithril.VnodeDOM<A, S>;\n    export type CVnode<A = {}> = mithril.CVnode<A>;\n    export type CVnodeDOM<A = {}> = mithril.CVnodeDOM<A>;\n    export type Component<A = {}, S = {}> = mithril.Component<A, S>;\n    export type Comp<A = {}, S extends Partial<mithril.Component<A, S>> = {}> = mithril.Comp<A, S>;\n    export type ClassComponent<A = {}> = mithril.ClassComponent<A>;\n    export type FactoryComponent<A = {}> = mithril.FactoryComponent<A>;\n    export type ComponentTypes<A = {}, S extends Partial<mithril.Component<A, S>> = {}> = mithril.ComponentTypes<A, S>;\n    export type Attributes = mithril.Attributes;\n    export type Static = mithril.Static & { stream: typeof stream };\n    export type Stream<T> = stream<T>;\n}\n\ndeclare const MithrilGlobal: MithrilGlobal.Static;\nexport = MithrilGlobal;\nexport as namespace m;\n",
   "2cee47aedc9b4d321e378d7020984adf005fef64:types/mithril/index.d.ts": "// Type definitions for Mithril 2.0\n// Project: https://mithril.js.org/, https://github.com/mithriljs/mithril.js\n// Definitions by: Mike Linkovich <https://github.com/spacejack>, Isiah Meadows <https://github.com/isiahmeadows>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n// TypeScript Version: 3.2\n\n/** Renders a vnode structure into a DOM element. */\ndeclare function render(el: Element, vnodes: Mithril.Children): void;\n\n/** Mounts a component to a DOM element, enabling it to autoredraw on user events. */\ndeclare function mount(element: Element, component: Mithril.ComponentTypes<any, any>): void;\n/** Unmounts a component from a DOM element. */\ndeclare function mount(element: Element, component: null): void; // tslint:disable-line unified-signatures\n\n/** Makes an XHR request and returns a promise. */\ndeclare function request<T>(options: Mithril.RequestOptions<T> & { url: string }): Promise<T>;\n/** Makes an XHR request and returns a promise. */\ndeclare function request<T>(url: string, options?: Mithril.RequestOptions<T>): Promise<T>;\n\n/** Makes a JSON-P request and returns a promise. */\ndeclare function jsonp<T>(options: Mithril.JsonpOptions & { url: string }): Promise<T>; // tslint:disable-line:no-unnecessary-generics\n/** Makes a JSON-P request and returns a promise. */\ndeclare function jsonp<T>(url: string, options?: Mithril.JsonpOptions): Promise<T>; // tslint:disable-line:no-unnecessary-generics\n\ndeclare namespace Mithril {\n    interface CommonAttributes<Attrs, State> {\n        /** The oninit hook is called before a vnode is touched by the virtual DOM engine. */\n        oninit?(this: State, vnode: Vnode<Attrs, State>): any;\n        /** The oncreate hook is called after a DOM element is created and attached to the document. */\n        oncreate?(this: State, vnode: VnodeDOM<Attrs, State>): any;\n        /** The onbeforeremove hook is called before a DOM element is detached from the document. If a Promise is returned, Mithril only detaches the DOM element after the promise completes. */\n        onbeforeremove?(this: State, vnode: VnodeDOM<Attrs, State>): Promise<any> | void;\n        /** The onremove hook is called before a DOM element is removed from the document. */\n        onremove?(this: State, vnode: VnodeDOM<Attrs, State>): any;\n        /** The onbeforeupdate hook is called before a vnode is diffed in a update. */\n        onbeforeupdate?(this: State, vnode: Vnode<Attrs, State>, old: VnodeDOM<Attrs, State>): boolean | void;\n        /** The onupdate hook is called after a DOM element is updated, while attached to the document. */\n        onupdate?(this: State, vnode: VnodeDOM<Attrs, State>): any;\n        /** A key to optionally associate with this element. */\n        key?: string | number | undefined;\n    }\n\n    interface Hyperscript {\n        /** Creates a virtual element (Vnode). */\n        (selector: string, ...children: Children[]): Vnode<any, any>;\n        /** Creates a virtual element (Vnode). */\n        (selector: string, attributes: Attributes, ...children: Children[]): Vnode<any, any>;\n        /** Creates a virtual element (Vnode). */\n        <Attrs, State>(component: ComponentTypes<Attrs, State>, ...args: Children[]): Vnode<Attrs, State>;\n        /** Creates a virtual element (Vnode). */\n        <Attrs, State>(\n            component: ComponentTypes<Attrs, State>,\n            attributes: Attrs & CommonAttributes<Attrs, State>,\n            ...args: Children[]\n        ): Vnode<Attrs, State>;\n        /** Creates a fragment virtual element (Vnode). */\n        fragment(attrs: CommonAttributes<any, any> & { [key: string]: any }, children: ChildArrayOrPrimitive): Vnode<any, any>;\n        /** Turns an HTML string into a virtual element (Vnode). Do not use trust on unsanitized user input. */\n        trust(html: string): Vnode<any, any>;\n    }\n\n    interface RouteResolver<Attrs = {}, State = {}> {\n        /** The onmatch hook is called when the router needs to find a component to render. */\n        onmatch?(\n            this: this,\n            args: Attrs,\n            requestedPath: string,\n            route: string,\n        ): ComponentTypes<any, any> | Promise<any> | void;\n        /** The render method is called on every redraw for a matching route. */\n        render?(this: this, vnode: Vnode<Attrs, State>): Children;\n    }\n\n    /** This represents a key-value mapping linking routes to components. */\n    interface RouteDefs {\n        /** The key represents the route. The value represents the corresponding component. */\n        [url: string]: ComponentTypes<any, any> | RouteResolver<any, any>;\n    }\n\n    interface RouteOptions {\n        /** Routing parameters. If path has routing parameter slots, the properties of this object are interpolated into the path string. */\n        replace?: boolean | undefined;\n        /** The state object to pass to the underlying history.pushState / history.replaceState call. */\n        state?: any;\n        /** The title string to pass to the underlying history.pushState / history.replaceState call. */\n        title?: string | undefined;\n    }\n\n    interface RouteLinkAttrs extends Attributes {\n        href: string;\n        selector?: string | ComponentTypes<any> | undefined;\n        options?: RouteOptions | undefined;\n    }\n\n    interface Route {\n        /** Creates application routes and mounts Components and/or RouteResolvers to a DOM element. */\n        (element: Element, defaultRoute: string, routes: RouteDefs): void;\n        /** Returns the last fully resolved routing path, without the prefix. */\n        get(): string;\n        /** Redirects to a matching route or to the default route if no matching routes can be found. */\n        set(route: string, data?: any, options?: RouteOptions): void;\n        /** Defines a router prefix which is a fragment of the URL that dictates the underlying strategy used by the router. */\n        prefix: string;\n        /** This Component renders a link <a href> that will use the current routing strategy */\n        Link: Component<RouteLinkAttrs>;\n        /** Returns the named parameter value from the current route. */\n        param(name: string): string;\n        /** Gets all route parameters. */\n        param(): any;\n    }\n\n    interface RequestOptions<T> {\n        /** The HTTP method to use. */\n        method?: string | undefined;\n        /** The data to be interpolated into the URL and serialized into the querystring. */\n        params?: { [key: string]: any } | undefined;\n        /** The data to be serialized into the request body. */\n        body?: (XMLHttpRequest['send'] extends (x: infer R) => any ? R : never) | (object & { [id: string]: any }) | undefined;\n        /** Whether the request should be asynchronous. Defaults to true. */\n        async?: boolean | undefined;\n        /** A username for HTTP authorization. */\n        user?: string | undefined;\n        /** A password for HTTP authorization. */\n        password?: string | undefined;\n        /** Whether to send cookies to 3rd party domains. */\n        withCredentials?: boolean | undefined;\n        /** Exposes the underlying XMLHttpRequest object for low-level configuration. */\n        config?(xhr: XMLHttpRequest, options: this): XMLHttpRequest | void;\n        /** Headers to append to the request before sending it. */\n        headers?: { [key: string]: string } | undefined;\n        /** A constructor to be applied to each object in the response. */\n        type?: new (o: any) => any;\n        /** A serialization method to be applied to data. Defaults to JSON.stringify, or if options.data is an instance of FormData, defaults to the identity function. */\n        serialize?(data: any): any;\n        /** A deserialization method to be applied to the response. Defaults to a small wrapper around JSON.parse that returns null for empty responses. */\n        deserialize?(data: string): T;\n        /** A hook to specify how the XMLHttpRequest response should be read. Useful for reading response headers and cookies. Defaults to a function that returns xhr.responseText */\n        extract?(xhr: XMLHttpRequest, options: this): T;\n        /**\n         * Force the use of the HTTP body section for data in GET requests when set to true,\n         * or the use of querystring for other HTTP methods when set to false.\n         * Defaults to false for GET requests and true for other methods.\n         */\n        useBody?: boolean | undefined;\n        /** If false, redraws mounted components upon completion of the request. If true, it does not. */\n        background?: boolean | undefined;\n        /** Milliseconds a request can take before automatically being terminated. */\n        timeout?: number | undefined;\n        /** The expected type of the response, as a legal value of XMLHttpRequest.responseType. */\n        responseType?: '' | 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | undefined;\n    }\n\n    interface JsonpOptions {\n        /** The data to be interpolated into the URL and serialized into the querystring. */\n        params?: { [id: string]: any } | undefined;\n        /** The data to be serialized into the request body. */\n        body?: any;\n        /** A constructor to be applied to each object in the response. */\n        type?: new (o: any) => any;\n        /** The name of the function that will be called as the callback. */\n        callbackName?: string | undefined;\n        /** The name of the querystring parameter name that specifies the callback name. */\n        callbackKey?: string | undefined;\n        /** If false, redraws mounted components upon completion of the request. If true, it does not. */\n        background?: boolean | undefined;\n    }\n\n    interface Redraw {\n        /** Manually triggers an asynchronous redraw of mounted components. */\n        (): void;\n        /** Manually triggers a synchronous redraw of mounted components. */\n        sync(): void;\n    }\n\n    type Params = object & ParamsRec;\n\n    interface ParamsRec {\n        // Ideally, it'd be this:\n        // `[key: string | number]: Params | !symbol & !object`\n        [key: string]: string | number | boolean | null | undefined | Params;\n    }\n\n    interface Static extends Hyperscript {\n        route: Route;\n        mount: typeof mount;\n",
diff --git a/src/_tests/fixtures/66742/_files.json b/src/_tests/fixtures/66742/_files.json
index 946feb8..1bffd45 100644
--- a/src/_tests/fixtures/66742/_files.json
+++ b/src/_tests/fixtures/66742/_files.json
@@ -1,3 +1,4 @@
 {
-  "3090530f3f230f7cfb2920b28bf49a938cd8aa59:types/twine-sugarcube/index.d.ts": "// Type definitions for non-npm package sugarcube 2.36\n// Project: https://github.com/tmedwards/sugarcube-2\n// Definitions by: ezsh <https://github.com/ezsh>\n//                 Thomas M. Edwards <https://github.com/tmedwards>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\n// Minimum TypeScript Version: 3.9\n\n/// <reference types=\"jquery\"/>\n\nexport as namespace TwineSugarCube;\n\nexport * from \"./extensions\";\nexport * from \"./functions\";\nexport * from \"./globals\";\nexport * from \"./jquery\";\n\nexport * from \"./audio\";\nexport * from \"./config\";\nexport * from \"./engine\";\nexport * from \"./macro\";\nexport * from \"./passage\";\nexport * from \"./save\";\nexport * from \"./scripting\";\nexport * from \"./settings\";\nexport * from \"./state\";\nexport * from \"./story\";\nexport * from \"./sugarcube\";\nexport * from \"./template\";\nexport * from \"./ui\";\nexport * from \"./userdata\";\nexport * from \"./wiki\";\n"
+  "3090530f3f230f7cfb2920b28bf49a938cd8aa59:types/twine-sugarcube/index.d.ts": "// Type definitions for non-npm package sugarcube 2.36\n// Project: https://github.com/tmedwards/sugarcube-2\n// Definitions by: ezsh <https://github.com/ezsh>\n//                 Thomas M. Edwards <https://github.com/tmedwards>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\n// Minimum TypeScript Version: 3.9\n\n/// <reference types=\"jquery\"/>\n\nexport as namespace TwineSugarCube;\n\nexport * from \"./extensions\";\nexport * from \"./functions\";\nexport * from \"./globals\";\nexport * from \"./jquery\";\n\nexport * from \"./audio\";\nexport * from \"./config\";\nexport * from \"./engine\";\nexport * from \"./macro\";\nexport * from \"./passage\";\nexport * from \"./save\";\nexport * from \"./scripting\";\nexport * from \"./settings\";\nexport * from \"./state\";\nexport * from \"./story\";\nexport * from \"./sugarcube\";\nexport * from \"./template\";\nexport * from \"./ui\";\nexport * from \"./userdata\";\nexport * from \"./wiki\";\n",
+  "7a7f91980d3ac5f8c6b6916ca70a44aa08215698:types/twine-sugarcube/index.d.ts": "// Type definitions for non-npm package sugarcube 2.36\n// Project: https://github.com/tmedwards/sugarcube-2\n// Definitions by: ezsh <https://github.com/ezsh>\n//                 Thomas M. Edwards <https://github.com/tmedwards>\n// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n\n// Minimum TypeScript Version: 3.9\n\n/// <reference types=\"jquery\"/>\n\nexport as namespace TwineSugarCube;\n\nexport * from \"./extensions\";\nexport * from \"./functions\";\nexport * from \"./globals\";\nexport * from \"./jquery\";\n\nexport * from \"./audio\";\nexport * from \"./config\";\nexport * from \"./engine\";\nexport * from \"./macro\";\nexport * from \"./passage\";\nexport * from \"./save\";\nexport * from \"./scripting\";\nexport * from \"./settings\";\nexport * from \"./state\";\nexport * from \"./story\";\nexport * from \"./sugarcube\";\nexport * from \"./template\";\nexport * from \"./ui\";\nexport * from \"./userdata\";\nexport * from \"./wiki\";\n"
 }
diff --git a/src/_tests/fixtures/69589/_downloads.json b/src/_tests/fixtures/69589/_downloads.json
new file mode 100644
index 0000000..d716828
--- /dev/null
+++ b/src/_tests/fixtures/69589/_downloads.json
@@ -0,0 +1,3 @@
+{
+  "readable-stream": 5070527
+}
diff --git a/src/_tests/fixtures/69589/_files.json b/src/_tests/fixtures/69589/_files.json
new file mode 100644
index 0000000..a748ea7
--- /dev/null
+++ b/src/_tests/fixtures/69589/_files.json
@@ -0,0 +1,4 @@
+{
+  "73af686fc614750422389559ef5a752e6eae69a5:types/readable-stream/package.json": "{\n    \"private\": true,\n    \"name\": \"@types/readable-stream\",\n    \"version\": \"4.0.9999\",\n    \"projects\": [\n        \"https://github.com/nodejs/readable-stream\"\n    ],\n    \"dependencies\": {\n        \"@types/node\": \"*\",\n        \"safe-buffer\": \"~5.1.1\"\n    },\n    \"devDependencies\": {\n        \"@types/readable-stream\": \"workspace:.\"\n    },\n    \"owners\": [\n        {\n            \"name\": \"TeamworkGuy2\",\n            \"githubUsername\": \"TeamworkGuy2\"\n        },\n        {\n            \"name\": \"markdreyer\",\n            \"githubUsername\": \"markdreyer\"\n        },\n        {\n            \"name\": \"Matteo Collina\",\n            \"githubUsername\": \"mcollina\"\n        }\n    ]\n}\n",
+  "35ea3e696d3fb324ce0c779d20c2ab83f36d9181:types/readable-stream/package.json": "{\n    \"private\": true,\n    \"name\": \"@types/readable-stream\",\n    \"version\": \"4.0.9999\",\n    \"projects\": [\n        \"https://github.com/nodejs/readable-stream\"\n    ],\n    \"dependencies\": {\n        \"@types/node\": \"*\",\n        \"safe-buffer\": \"~5.1.1\"\n    },\n    \"devDependencies\": {\n        \"@types/readable-stream\": \"workspace:.\"\n    },\n    \"owners\": [\n        {\n            \"name\": \"TeamworkGuy2\",\n            \"githubUsername\": \"TeamworkGuy2\"\n        },\n        {\n            \"name\": \"markdreyer\",\n            \"githubUsername\": \"markdreyer\"\n        }\n    ]\n}\n"
+}
diff --git a/src/_tests/fixtures/69589/_response.json b/src/_tests/fixtures/69589/_response.json
new file mode 100644
index 0000000..d2a19de
--- /dev/null
+++ b/src/_tests/fixtures/69589/_response.json
@@ -0,0 +1,351 @@
+{
+  "data": {
+    "repository": {
+      "id": "MDEwOlJlcG9zaXRvcnk2MDkzMzE2",
+      "pullRequest": {
+        "id": "PR_kwDOAFz6BM5vQtx6",
+        "title": "Add mcollina to readable-stream",
+        "createdAt": "2024-05-13T13:38:31Z",
+        "author": {
+          "login": "mcollina",
+          "__typename": "User"
+        },
+        "authorAssociation": "CONTRIBUTOR",
+        "baseRef": {
+          "name": "master",
+          "__typename": "Ref"
+        },
+        "labels": {
+          "nodes": [
+            {
+              "name": "Critical package",
+              "__typename": "Label"
+            }
+          ],
+          "__typename": "LabelConnection"
+        },
+        "isDraft": false,
+        "mergeable": "MERGEABLE",
+        "number": 69589,
+        "state": "OPEN",
+        "headRefOid": "73af686fc614750422389559ef5a752e6eae69a5",
+        "changedFiles": 1,
+        "additions": 4,
+        "deletions": 0,
+        "commitIds": {
+          "nodes": [
+            {
+              "commit": {
+                "oid": "5fa92916327ed4db01384402d1c5da8e02af2aef",
+                "parents": {
+                  "nodes": [
+                    {
+                      "oid": "35ea3e696d3fb324ce0c779d20c2ab83f36d9181",
+                      "__typename": "Commit"
+                    }
+                  ],
+                  "__typename": "CommitConnection"
+                },
+                "__typename": "Commit"
+              },
+              "__typename": "PullRequestCommit"
+            },
+            {
+              "commit": {
+                "oid": "d00098faad24ab882a4de2719c43c1e10a6a7266",
+                "parents": {
+                  "nodes": [
+                    {
+                      "oid": "5fa92916327ed4db01384402d1c5da8e02af2aef",
+                      "__typename": "Commit"
+                    }
+                  ],
+                  "__typename": "CommitConnection"
+                },
+                "__typename": "Commit"
+              },
+              "__typename": "PullRequestCommit"
+            },
+            {
+              "commit": {
+                "oid": "73af686fc614750422389559ef5a752e6eae69a5",
+                "parents": {
+                  "nodes": [
+                    {
+                      "oid": "d00098faad24ab882a4de2719c43c1e10a6a7266",
+                      "__typename": "Commit"
+                    }
+                  ],
+                  "__typename": "CommitConnection"
+                },
+                "__typename": "Commit"
+              },
+              "__typename": "PullRequestCommit"
+            }
+          ],
+          "__typename": "PullRequestCommitConnection"
+        },
+        "timelineItems": {
+          "nodes": [
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2024-05-13T14:01:52Z",
+              "projectColumnName": "Waiting for Code Reviews",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2024-05-13T14:06:54Z",
+              "projectColumnName": "Needs Maintainer Review",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2024-05-13T16:11:58Z",
+              "projectColumnName": "Waiting for Code Reviews",
+              "__typename": "MovedColumnsInProjectEvent"
+            },
+            {
+              "actor": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "createdAt": "2024-05-13T16:16:32Z",
+              "projectColumnName": "Needs Maintainer Review",
+              "__typename": "MovedColumnsInProjectEvent"
+            }
+          ],
+          "__typename": "PullRequestTimelineItemsConnection"
+        },
+        "reviews": {
+          "nodes": [
+            {
+              "author": {
+                "login": "jakebailey",
+                "__typename": "User"
+              },
+              "commit": {
+                "oid": "5fa92916327ed4db01384402d1c5da8e02af2aef",
+                "__typename": "Commit"
+              },
+              "comments": {
+                "nodes": [
+                  {
+                    "author": {
+                      "login": "jakebailey",
+                      "__typename": "User"
+                    },
+                    "createdAt": "2024-05-13T14:55:10Z",
+                    "__typename": "PullRequestReviewComment"
+                  }
+                ],
+                "__typename": "PullRequestReviewCommentConnection"
+              },
+              "authorAssociation": "MEMBER",
+              "state": "COMMENTED",
+              "submittedAt": "2024-05-13T14:55:11Z",
+              "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/pull/69589#pullrequestreview-2052953609",
+              "__typename": "PullRequestReview"
+            },
+            {
+              "author": {
+                "login": "jakebailey",
+                "__typename": "User"
+              },
+              "commit": {
+                "oid": "5fa92916327ed4db01384402d1c5da8e02af2aef",
+                "__typename": "Commit"
+              },
+              "comments": {
+                "nodes": [
+                  {
+                    "author": {
+                      "login": "jakebailey",
+                      "__typename": "User"
+                    },
+                    "createdAt": "2024-05-13T14:56:16Z",
+                    "__typename": "PullRequestReviewComment"
+                  }
+                ],
+                "__typename": "PullRequestReviewCommentConnection"
+              },
+              "authorAssociation": "MEMBER",
+              "state": "COMMENTED",
+              "submittedAt": "2024-05-13T14:56:16Z",
+              "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/pull/69589#pullrequestreview-2052956341",
+              "__typename": "PullRequestReview"
+            }
+          ],
+          "__typename": "PullRequestReviewConnection"
+        },
+        "commits": {
+          "totalCount": 3,
+          "nodes": [
+            {
+              "commit": {
+                "checkSuites": {
+                  "nodes": [
+                    {
+                      "databaseId": 23729846998,
+                      "app": {
+                        "name": "GitHub Actions",
+                        "__typename": "App"
+                      },
+                      "conclusion": "SUCCESS",
+                      "resourcePath": "/DefinitelyTyped/DefinitelyTyped/commit/73af686fc614750422389559ef5a752e6eae69a5/checks?check_suite_id=23729846998",
+                      "status": "COMPLETED",
+                      "url": "https://github.com/DefinitelyTyped/DefinitelyTyped/commit/73af686fc614750422389559ef5a752e6eae69a5/checks?check_suite_id=23729846998",
+                      "checkRuns": {
+                        "nodes": [
+                          {
+                            "title": null,
+                            "__typename": "CheckRun"
+                          }
+                        ],
+                        "__typename": "CheckRunConnection"
+                      },
+                      "createdAt": "2024-05-13T16:11:36Z",
+                      "workflowRun": {
+                        "file": {
+                          "path": ".github/workflows/CI.yml",
+                          "__typename": "WorkflowRunFile"
+                        },
+                        "__typename": "WorkflowRun"
+                      },
+                      "__typename": "CheckSuite"
+                    }
+                  ],
+                  "__typename": "CheckSuiteConnection"
+                },
+                "status": null,
+                "authoredDate": "2024-05-13T16:11:31Z",
+                "committedDate": "2024-05-13T16:11:31Z",
+                "pushedDate": null,
+                "oid": "73af686fc614750422389559ef5a752e6eae69a5",
+                "__typename": "Commit"
+              },
+              "__typename": "PullRequestCommit"
+            }
+          ],
+          "__typename": "PullRequestCommitConnection"
+        },
+        "comments": {
+          "totalCount": 4,
+          "nodes": [
+            {
+              "id": "IC_kwDOAFz6BM59n4sP",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 2107607823,
+              "body": "@mcollina 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* `readable-stream` — [on npm](https://www.npmjs.com/package/readable-stream), [on unpkg](https://unpkg.com/browse/readable-stream@latest/)\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=69589&install-plugin=playground-dt-review).\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Most recent commit is approved by a DT maintainer\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": "2024-05-13T13:39:10Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM59n4vJ",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 2107608009,
+              "body": "🔔 @TeamworkGuy2 @markdreyer — please [review this PR](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/69589/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": "2024-05-13T13:39:13Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM59n4vf",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 2107608031,
+              "body": "@mcollina Unfortunately, this pull request currently has a merge conflict 😥. Please update your PR branch to be up-to-date with respect to master. Have a nice day!\n<!--typescript_bot_merge-complaint-2eb6bc3-->",
+              "createdAt": "2024-05-13T13:39:14Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            },
+            {
+              "id": "IC_kwDOAFz6BM59p4Dd",
+              "author": {
+                "login": "typescript-bot",
+                "__typename": "User"
+              },
+              "databaseId": 2108129501,
+              "body": "@jakebailey 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-b1d93c-5fa9291-->",
+              "createdAt": "2024-05-13T16:16:33Z",
+              "reactions": {
+                "nodes": [],
+                "__typename": "ReactionConnection"
+              },
+              "__typename": "IssueComment"
+            }
+          ],
+          "__typename": "IssueCommentConnection"
+        },
+        "files": {
+          "totalCount": 1,
+          "nodes": [
+            {
+              "path": "types/readable-stream/package.json",
+              "additions": 4,
+              "deletions": 0,
+              "__typename": "PullRequestChangedFile"
+            }
+          ],
+          "pageInfo": {
+            "hasNextPage": false,
+            "endCursor": "MQ",
+            "__typename": "PageInfo"
+          },
+          "__typename": "PullRequestChangedFileConnection"
+        },
+        "projectCards": {
+          "nodes": [
+            {
+              "id": "PRC_lALOAFz6BM4AORWwzgWEIiE",
+              "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/69589/derived.json b/src/_tests/fixtures/69589/derived.json
new file mode 100644
index 0000000..d929e2f
--- /dev/null
+++ b/src/_tests/fixtures/69589/derived.json
@@ -0,0 +1,46 @@
+{
+  "type": "info",
+  "now": "2024-05-13T16:27:07.093Z",
+  "pr_number": 69589,
+  "author": "mcollina",
+  "headCommitOid": "73af686fc614750422389559ef5a752e6eae69a5",
+  "mergeBaseOid": "35ea3e696d3fb324ce0c779d20c2ab83f36d9181",
+  "lastPushDate": "2024-05-13T13:38:31.000Z",
+  "lastActivityDate": "2024-05-13T14:56:16.000Z",
+  "hasMergeConflict": false,
+  "isFirstContribution": false,
+  "tooManyFiles": false,
+  "hugeChange": false,
+  "popularityLevel": "Critical",
+  "pkgInfo": [
+    {
+      "name": "readable-stream",
+      "kind": "edit",
+      "files": [
+        {
+          "path": "types/readable-stream/package.json",
+          "kind": "package-meta-ok"
+        }
+      ],
+      "owners": [
+        "TeamworkGuy2",
+        "markdreyer"
+      ],
+      "addedOwners": [
+        "mcollina"
+      ],
+      "deletedOwners": [],
+      "popularityLevel": "Critical"
+    }
+  ],
+  "reviews": [
+    {
+      "type": "stale",
+      "reviewer": "jakebailey",
+      "date": "2024-05-13T14:56:16.000Z",
+      "abbrOid": "5fa9291"
+    }
+  ],
+  "mainBotCommentID": 2107607823,
+  "ciResult": "pass"
+}
diff --git a/src/_tests/fixtures/69589/mutations.json b/src/_tests/fixtures/69589/mutations.json
new file mode 100644
index 0000000..33b8c33
--- /dev/null
+++ b/src/_tests/fixtures/69589/mutations.json
@@ -0,0 +1,22 @@
+[
+  {
+    "mutation": "mutation ($input: UpdateIssueCommentInput!) {\n  updateIssueComment(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "id": "IC_kwDOAFz6BM59n4sP",
+        "body": "@mcollina 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* `readable-stream` — [on npm](https://www.npmjs.com/package/readable-stream), [on unpkg](https://unpkg.com/browse/readable-stream@latest/)\n  - 1 added owner: ✎@mcollina\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=69589&install-plugin=playground-dt-review).\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Most recent commit is approved by a DT maintainer\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: AddLabelsToLabelableInput!) {\n  addLabelsToLabelable(input: $input) {\n    __typename\n  }\n}\n",
+    "variables": {
+      "input": {
+        "labelIds": [
+          "MDU6TGFiZWwyNDk1OTc2ODI5"
+        ],
+        "labelableId": "PR_kwDOAFz6BM5vQtx6"
+      }
+    }
+  }
+]
diff --git a/src/_tests/fixtures/69589/result.json b/src/_tests/fixtures/69589/result.json
new file mode 100644
index 0000000..361d75a
--- /dev/null
+++ b/src/_tests/fixtures/69589/result.json
@@ -0,0 +1,24 @@
+{
+  "projectColumn": "Needs Maintainer Review",
+  "labels": [
+    "Critical package",
+    "Edits Owners"
+  ],
+  "responseComments": [
+    {
+      "tag": "welcome",
+      "status": "@mcollina 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* `readable-stream` — [on npm](https://www.npmjs.com/package/readable-stream), [on unpkg](https://unpkg.com/browse/readable-stream@latest/)\n  - 1 added owner: ✎@mcollina\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=69589&install-plugin=playground-dt-review).\n\n## Status\n\n * ✅ No merge conflicts\n * ✅ Continuous integration tests have passed\n * 🕐 Most recent commit is approved by a DT maintainer\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": "pinging-reviewers",
+      "status": "🔔 @TeamworkGuy2 @markdreyer — please [review this PR](https://github.com/DefinitelyTyped/DefinitelyTyped/pull/69589/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."
+    },
+    {
+      "tag": "stale-ping-b1d93c-5fa9291",
+      "status": "@jakebailey 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?"
+    }
+  ],
+  "shouldClose": false,
+  "shouldMerge": false,
+  "shouldUpdateLabels": true
+}