@grest-ts/testkit-runtime 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/dist/tsconfig.publish.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/index.ts +1 -1
- package/src/mockable.decorator.ts +193 -193
- package/src/testable.decorator.ts +80 -80
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 Grest Games OÜ
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Grest Games OÜ
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"fileNames":["../../../../node_modules/typescript/lib/lib.es5.d.ts","../../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../src/mockable.decorator.ts","../../../../packages/locator/src/gglocator.ts","../../../../packages/locator/src/gglocatorkey.ts","../../../../packages/locator/src/gglocatorscopedebug.ts","../../../../packages/locator/src/gglocatorscope.ts","../../../../packages/common/src/deepfreeze.ts","../../../../packages/common/src/deepclone.ts","../../../../packages/common/src/withtimeout.ts","../../../../packages/common/src/ggerror.ts","../../../../packages/common/src/unreachablecode.ts","../../../../packages/common/src/types.ts","../../../../packages/common/src/http.ts","../../../../packages/common/src/secret.ts","../../../../packages/common/src/sleep.ts","../../../../packages/common/src/environment.ts","../../../../packages/common/src/ggasyncstorage.ts","../../../../node_modules/@types/node/compatibility/disposable.d.ts","../../../../node_modules/@types/node/compatibility/indexable.d.ts","../../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../../node_modules/@types/node/compatibility/index.d.ts","../../../../node_modules/@types/node/globals.typedarray.d.ts","../../../../node_modules/@types/node/buffer.buffer.d.ts","../../../../node_modules/@types/node/globals.d.ts","../../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../../node_modules/@types/node/web-globals/events.d.ts","../../../../node_modules/buffer/index.d.ts","../../../../node_modules/undici-types/header.d.ts","../../../../node_modules/undici-types/readable.d.ts","../../../../node_modules/undici-types/file.d.ts","../../../../node_modules/undici-types/fetch.d.ts","../../../../node_modules/undici-types/formdata.d.ts","../../../../node_modules/undici-types/connector.d.ts","../../../../node_modules/undici-types/client.d.ts","../../../../node_modules/undici-types/errors.d.ts","../../../../node_modules/undici-types/dispatcher.d.ts","../../../../node_modules/undici-types/global-dispatcher.d.ts","../../../../node_modules/undici-types/global-origin.d.ts","../../../../node_modules/undici-types/pool-stats.d.ts","../../../../node_modules/undici-types/pool.d.ts","../../../../node_modules/undici-types/handlers.d.ts","../../../../node_modules/undici-types/balanced-pool.d.ts","../../../../node_modules/undici-types/agent.d.ts","../../../../node_modules/undici-types/mock-interceptor.d.ts","../../../../node_modules/undici-types/mock-agent.d.ts","../../../../node_modules/undici-types/mock-client.d.ts","../../../../node_modules/undici-types/mock-pool.d.ts","../../../../node_modules/undici-types/mock-errors.d.ts","../../../../node_modules/undici-types/proxy-agent.d.ts","../../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../../node_modules/undici-types/retry-handler.d.ts","../../../../node_modules/undici-types/retry-agent.d.ts","../../../../node_modules/undici-types/api.d.ts","../../../../node_modules/undici-types/interceptors.d.ts","../../../../node_modules/undici-types/util.d.ts","../../../../node_modules/undici-types/cookies.d.ts","../../../../node_modules/undici-types/patch.d.ts","../../../../node_modules/undici-types/websocket.d.ts","../../../../node_modules/undici-types/eventsource.d.ts","../../../../node_modules/undici-types/filereader.d.ts","../../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../../node_modules/undici-types/content-type.d.ts","../../../../node_modules/undici-types/cache.d.ts","../../../../node_modules/undici-types/index.d.ts","../../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../../node_modules/@types/node/web-globals/storage.d.ts","../../../../node_modules/@types/node/assert.d.ts","../../../../node_modules/@types/node/assert/strict.d.ts","../../../../node_modules/@types/node/async_hooks.d.ts","../../../../node_modules/@types/node/buffer.d.ts","../../../../node_modules/@types/node/child_process.d.ts","../../../../node_modules/@types/node/cluster.d.ts","../../../../node_modules/@types/node/console.d.ts","../../../../node_modules/@types/node/constants.d.ts","../../../../node_modules/@types/node/crypto.d.ts","../../../../node_modules/@types/node/dgram.d.ts","../../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../../node_modules/@types/node/dns.d.ts","../../../../node_modules/@types/node/dns/promises.d.ts","../../../../node_modules/@types/node/domain.d.ts","../../../../node_modules/@types/node/events.d.ts","../../../../node_modules/@types/node/fs.d.ts","../../../../node_modules/@types/node/fs/promises.d.ts","../../../../node_modules/@types/node/http.d.ts","../../../../node_modules/@types/node/http2.d.ts","../../../../node_modules/@types/node/https.d.ts","../../../../node_modules/@types/node/inspector.d.ts","../../../../node_modules/@types/node/inspector.generated.d.ts","../../../../node_modules/@types/node/module.d.ts","../../../../node_modules/@types/node/net.d.ts","../../../../node_modules/@types/node/os.d.ts","../../../../node_modules/@types/node/path.d.ts","../../../../node_modules/@types/node/perf_hooks.d.ts","../../../../node_modules/@types/node/process.d.ts","../../../../node_modules/@types/node/punycode.d.ts","../../../../node_modules/@types/node/querystring.d.ts","../../../../node_modules/@types/node/readline.d.ts","../../../../node_modules/@types/node/readline/promises.d.ts","../../../../node_modules/@types/node/repl.d.ts","../../../../node_modules/@types/node/sea.d.ts","../../../../node_modules/@types/node/sqlite.d.ts","../../../../node_modules/@types/node/stream.d.ts","../../../../node_modules/@types/node/stream/promises.d.ts","../../../../node_modules/@types/node/stream/consumers.d.ts","../../../../node_modules/@types/node/stream/web.d.ts","../../../../node_modules/@types/node/string_decoder.d.ts","../../../../node_modules/@types/node/test.d.ts","../../../../node_modules/@types/node/timers.d.ts","../../../../node_modules/@types/node/timers/promises.d.ts","../../../../node_modules/@types/node/tls.d.ts","../../../../node_modules/@types/node/trace_events.d.ts","../../../../node_modules/@types/node/tty.d.ts","../../../../node_modules/@types/node/url.d.ts","../../../../node_modules/@types/node/util.d.ts","../../../../node_modules/@types/node/v8.d.ts","../../../../node_modules/@types/node/vm.d.ts","../../../../node_modules/@types/node/wasi.d.ts","../../../../node_modules/@types/node/worker_threads.d.ts","../../../../node_modules/@types/node/zlib.d.ts","../../../../node_modules/@types/node/index.d.ts","../../../../node_modules/@nodelib/fs.stat/out/types/index.d.ts","../../../../node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts","../../../../node_modules/@nodelib/fs.stat/out/settings.d.ts","../../../../node_modules/@nodelib/fs.stat/out/providers/async.d.ts","../../../../node_modules/@nodelib/fs.stat/out/index.d.ts","../../../../node_modules/@nodelib/fs.scandir/out/types/index.d.ts","../../../../node_modules/@nodelib/fs.scandir/out/adapters/fs.d.ts","../../../../node_modules/@nodelib/fs.scandir/out/settings.d.ts","../../../../node_modules/@nodelib/fs.scandir/out/providers/async.d.ts","../../../../node_modules/@nodelib/fs.scandir/out/index.d.ts","../../../../node_modules/@nodelib/fs.walk/out/types/index.d.ts","../../../../node_modules/@nodelib/fs.walk/out/settings.d.ts","../../../../node_modules/@nodelib/fs.walk/out/readers/reader.d.ts","../../../../node_modules/@nodelib/fs.walk/out/readers/async.d.ts","../../../../node_modules/@nodelib/fs.walk/out/providers/async.d.ts","../../../../node_modules/@nodelib/fs.walk/out/index.d.ts","../../../../node_modules/fast-glob/out/types/index.d.ts","../../../../node_modules/fast-glob/out/settings.d.ts","../../../../node_modules/fast-glob/out/managers/tasks.d.ts","../../../../node_modules/fast-glob/out/index.d.ts","../../../../packages/common/src/ggextensiondiscovery.ts","../../../../packages/common/src/index-node.ts","../../../../packages/locator/src/gglocatorstorage.ts","../../../../packages/locator/src/index-node.ts","../src/testable.decorator.ts","../src/index.ts"],"fileIdsList":[[79,128,145,146,183,184],[79,128,145,146,184,185,186,187],[79,128,145,146,178,184,186],[79,128,145,146,183,185],[79,128,140,145,146,178],[79,128,140,145,146,178,179],[79,128,145,146,179,180,181,182],[79,128,145,146,179,181],[79,128,145,146,180],[79,128,145,146,160,178,188,189,190,193],[79,128,145,146,189,190,192],[79,128,139,145,146,178,188,189,190,191],[79,128,145,146,190],[79,128,145,146,188,189],[79,128,145,146,178,188],[79,125,126,128,145,146],[79,127,128,145,146],[128,145,146],[79,128,133,145,146,163],[79,128,129,134,139,145,146,148,160,171],[79,128,129,130,139,145,146,148],[79,128,145,146],[74,75,76,79,128,145,146],[79,128,131,145,146,172],[79,128,132,133,140,145,146,149],[79,128,133,145,146,160,168],[79,128,134,136,139,145,146,148],[79,127,128,135,145,146],[79,128,136,137,145,146],[79,128,138,139,145,146],[79,127,128,139,145,146],[79,128,139,140,141,145,146,160,171],[79,128,139,140,141,145,146,155,160,163],[79,121,128,136,139,142,145,146,148,160,171],[79,128,139,140,142,143,145,146,148,160,168,171],[79,128,142,144,145,146,160,168,171],[77,78,79,80,81,82,83,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177],[79,128,139,145,146],[79,128,145,146,147,171],[79,128,136,139,145,146,148,160],[79,128,145,146,149],[79,128,145,146,150],[79,127,128,145,146,151],[79,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177],[79,128,145,146,153],[79,128,145,146,154],[79,128,139,145,146,155,156],[79,128,145,146,155,157,172,174],[79,128,140,145,146],[79,128,139,145,146,160,161,163],[79,128,145,146,162,163],[79,128,145,146,160,161],[79,128,145,146,163],[79,128,145,146,164],[79,125,128,145,146,160,165,171],[79,128,139,145,146,166,167],[79,128,145,146,166,167],[79,128,133,145,146,148,160,168],[79,128,145,146,169],[79,128,145,146,148,170],[79,128,142,145,146,154,171],[79,128,133,145,146,172],[79,128,145,146,160,173],[79,128,145,146,147,174],[79,128,145,146,175],[79,121,128,145,146],[79,121,128,139,141,145,146,151,160,163,171,173,174,176],[79,128,145,146,160,177],[79,128,145,146,178,195,196,197],[79,128,145,146,195,196],[79,128,145,146,195],[79,128,145,146,178,194],[79,93,97,128,145,146,171],[79,93,128,145,146,160,171],[79,88,128,145,146],[79,90,93,128,145,146,168,171],[79,128,145,146,148,168],[79,128,145,146,178],[79,88,128,145,146,178],[79,90,93,128,145,146,148,171],[79,85,86,89,92,128,139,145,146,160,171],[79,93,100,128,145,146],[79,85,91,128,145,146],[79,93,114,115,128,145,146],[79,89,93,128,145,146,163,171,178],[79,114,128,145,146,178],[79,87,88,128,145,146,178],[79,93,128,145,146],[79,87,88,89,90,91,92,93,94,95,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,115,116,117,118,119,120,128,145,146],[79,93,108,128,145,146],[79,93,100,101,128,145,146],[79,91,93,101,102,128,145,146],[79,92,128,145,146],[79,85,88,93,128,145,146],[79,93,97,101,102,128,145,146],[79,97,128,145,146],[79,91,93,96,128,145,146,171],[79,85,90,93,100,128,145,146],[79,128,145,146,160],[79,88,93,114,128,145,146,176,178],[58,79,128,145,146,203],[79,128,145,146,202],[79,128,140,145,146,150,171,198],[63,64,65,66,67,68,69,70,71,72,73,79,128,145,146,199],[62,79,128,145,146,201],[59,79,128,145,146],[60,61,79,128,145,146,201],[62,79,128,145,146,200],[59,60,62,79,127,128,145,146,201]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"34c39644bc43c735750a55486ec121b40d90dfd828e3b76e613d241d1fa009c2","signature":"749f6ba167ea7162ca524ee698f3a4b82e0a7bb737d1cec4283824e68fdfc5e0"},"17be926233fbcdc26fafc190963670783b6fd0d6599514e6da7dafa36a9f303c","c6578a2cfbf3805f6fa3678a2c4ba87531de73b21b44ebf9b28363f7443ab9b7","6b2576b1abe55752930c6bd60816269ae86cc98926c40dd275cc92b5cc6cb144","f2d12830e127ca729fda42a8cf802501c76d1edf75034cefa1e3404c2d3d2d04","472816436c6db76434485c6257583dc150a2017733cd2e9aca9d91904584c040","fa5a1bbd7930a3aa8dbbd8ce19e89603df3daca14f080e1b7ad815d3f42408d3","e4542756b59d74ff2c036478942546e5937d35808eae08b6ae934164a7f2b97e","f369191ac0c4224b491791d2b711e0d8a29eaae730578a13c63016ee71feddb0","6fc71745fb086db4de247f9f62c7e1932d5c7c6f9d6a593feee7d76f0f2a5010","1f083bc5e8f2791b54ae5ebf69380dace5da834ecb9d37864dbe046aff3796cd","af392737db53a482cfda4c6ad3c013a62a806fe7be9e31c3b00ba3977ac39f75","565b2d44f499b7041ab79933ac8a041bdad5629dd4aec003bea4ba02a5ca1098","a527c423aeb061ecf2d971a6e3bf624880c0408bcf72a97dacf82013235e6731","ade68182d7a12c48e460596b96462aa18372bd505e8c21577445b0dc2343b6ee","04a4003ab34c3db124058179940c00f366f871d87ff1d318f13720c0b6269499",{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"f949f7f6c7802a338039cfc2156d1fe285cdd1e092c64437ebe15ae8edc854e0","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"46324183533e34fad2461b51174132e8e0e4b3ac1ceb5032e4952992739d1eab","impliedFormat":1},{"version":"d3fa0530dfb1df408f0abd76486de39def69ca47683d4a3529b2d22fce27c693","impliedFormat":1},{"version":"d9be977c415df16e4defe4995caeca96e637eeef9d216d0d90cdba6fc617e97e","impliedFormat":1},{"version":"98e0c2b48d855a844099123e8ec20fe383ecd1c5877f3895b048656befe268d0","impliedFormat":1},{"version":"ff53802a97b7d11ab3c4395aa052baa14cd12d2b1ed236b520a833fdd2a15003","impliedFormat":1},{"version":"fce9262f840a74118112caf685b725e1cc86cd2b0927311511113d90d87cc61e","impliedFormat":1},{"version":"d7a7cac49af2a3bfc208fe68831fbfa569864f74a7f31cc3a607f641e6c583fd","impliedFormat":1},{"version":"9a80e3322d08274f0e41b77923c91fe67b2c8a5134a5278c2cb60a330441554e","impliedFormat":1},{"version":"2460af41191009298d931c592fb6d4151beea320f1f25b73605e2211e53e4e88","impliedFormat":1},{"version":"2f87ea988d84d1c617afdeba9d151435473ab24cd5fc456510c8db26d8bd1581","impliedFormat":1},{"version":"b7336c1c536e3deaedbda956739c6250ac2d0dd171730c42cb57b10368f38a14","impliedFormat":1},{"version":"6fb67d664aaab2f1d1ad4613b58548aecb4b4703b9e4c5dba6b865b31bd14722","impliedFormat":1},{"version":"4414644199b1a047b4234965e07d189781a92b578707c79c3933918d67cd9d85","impliedFormat":1},{"version":"04a4b38c6a1682059eac00e7d0948d99c46642b57003d61d0fe9ccc9df442887","impliedFormat":1},{"version":"f12ea658b060da1752c65ae4f1e4c248587f6cd4cb4acabbf79a110b6b02ff75","impliedFormat":1},{"version":"011b2857871a878d5eae463bedc4b3dd14755dc3a67d5d10f8fbb7823d119294","impliedFormat":1},{"version":"d406b797d7b2aff9f8bd6c023acfaa5a5fc415bfbf01975e23d415d3f54857af","impliedFormat":1},{"version":"7d71b2d1a537fe41760a16441cd95d98fcb59ddf9c714aba2fecba961ab253b6","impliedFormat":1},{"version":"a9bd8a2bbd03a72054cbdf0cd2a77fabea4e3ae591dd02b8f58bda0c34e50c1c","impliedFormat":1},{"version":"386cc88a3bdee8bc651ead59f8afc9dc5729fc933549bbd217409eabad05ba3e","impliedFormat":1},"3db191719d15341432d04b4bec0767f2e52c3bf7a3b10c1869604b312ec167b3","1c558f5e6f4eeab86fff25eaa83643725ae793810f98aaf0513ed187e0157231","0f4ef1eb9f2d2e445dbc75bc2b48151006e0ece965e2443bf2da9416da5b4b2b","7d4e17170c6bcf5175fba2a917c55a7ef8c3c5ccb78edaefe65ccb679d46033c",{"version":"a32e7cb7274f61cb26ffebc5e2cf45a40a82f40648c1e25e95574df282a91ef1","signature":"4200a12dbbc5149a55239b93136e6d1442ad1964735641591ec2de092d5fe3de"},{"version":"f733274f3d5f610bed44ea1d3413f6865bb72a06c98d9c95b0d09c7668507965","signature":"709a6f551e29ba9f0cbdccdd144217cd1c235e4061f3312b63ae1834c600ca12"}],"root":[58,203,204],"options":{"allowJs":false,"checkJs":false,"composite":false,"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":99,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUnusedLocals":true,"noUnusedParameters":false,"outDir":"./","rootDir":"..","skipLibCheck":true,"sourceMap":true,"target":9},"referencedMap":[[185,1],[188,2],[187,3],[186,4],[184,5],[180,6],[183,7],[182,8],[181,9],[179,5],[194,10],[193,11],[192,12],[191,13],[190,14],[189,15],[125,16],[126,16],[127,17],[79,18],[128,19],[129,20],[130,21],[74,22],[77,23],[75,22],[76,22],[131,24],[132,25],[133,26],[134,27],[135,28],[136,29],[137,29],[138,30],[139,31],[140,32],[141,33],[80,22],[78,22],[142,34],[143,35],[144,36],[178,37],[145,38],[146,22],[147,39],[148,40],[149,41],[150,42],[151,43],[152,44],[153,45],[154,46],[155,47],[156,47],[157,48],[158,22],[159,49],[160,50],[162,51],[161,52],[163,53],[164,54],[165,55],[166,56],[167,57],[168,58],[169,59],[170,60],[171,61],[172,62],[173,63],[174,64],[175,65],[81,22],[82,22],[83,22],[122,66],[123,22],[124,22],[176,67],[177,68],[84,22],[198,69],[197,70],[196,71],[195,72],[56,22],[57,22],[11,22],[10,22],[2,22],[12,22],[13,22],[14,22],[15,22],[16,22],[17,22],[18,22],[19,22],[3,22],[20,22],[21,22],[4,22],[22,22],[26,22],[23,22],[24,22],[25,22],[27,22],[28,22],[29,22],[5,22],[30,22],[31,22],[32,22],[33,22],[6,22],[37,22],[34,22],[35,22],[36,22],[38,22],[7,22],[39,22],[44,22],[45,22],[40,22],[41,22],[42,22],[43,22],[8,22],[49,22],[46,22],[47,22],[48,22],[50,22],[9,22],[51,22],[52,22],[53,22],[55,22],[54,22],[1,22],[100,73],[110,74],[99,73],[120,75],[91,76],[90,77],[119,78],[113,79],[118,80],[93,81],[107,82],[92,83],[116,84],[88,85],[87,78],[117,86],[89,87],[94,88],[95,22],[98,88],[85,22],[121,89],[111,90],[102,91],[103,92],[105,93],[101,94],[104,95],[114,78],[96,96],[97,97],[106,98],[86,99],[109,90],[108,88],[112,22],[115,100],[204,101],[58,17],[203,102],[64,22],[63,22],[72,22],[73,22],[66,22],[199,103],[69,22],[200,104],[70,22],[71,22],[68,22],[67,22],[65,22],[59,105],[60,106],[62,107],[61,22],[201,108],[202,109]],"semanticDiagnosticsPerFile":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204],"checkPending":true,"version":"5.9.3"}
|
|
1
|
+
{"fileNames":["../../../../node_modules/typescript/lib/lib.es5.d.ts","../../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../src/mockable.decorator.ts","../../../../packages/locator/src/GGLocator.ts","../../../../packages/locator/src/GGLocatorKey.ts","../../../../packages/locator/src/GGLocatorScopeDebug.ts","../../../../packages/locator/src/GGLocatorScope.ts","../../../../packages/common/src/deepFreeze.ts","../../../../packages/common/src/deepClone.ts","../../../../packages/common/src/withTimeout.ts","../../../../packages/common/src/GGError.ts","../../../../packages/common/src/UnreachableCode.ts","../../../../packages/common/src/types.ts","../../../../packages/common/src/http.ts","../../../../packages/common/src/Secret.ts","../../../../packages/common/src/sleep.ts","../../../../packages/common/src/environment.ts","../../../../packages/common/src/GGAsyncStorage.ts","../../../../node_modules/@types/node/compatibility/disposable.d.ts","../../../../node_modules/@types/node/compatibility/indexable.d.ts","../../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../../node_modules/@types/node/compatibility/index.d.ts","../../../../node_modules/@types/node/globals.typedarray.d.ts","../../../../node_modules/@types/node/buffer.buffer.d.ts","../../../../node_modules/@types/node/globals.d.ts","../../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../../node_modules/@types/node/web-globals/events.d.ts","../../../../node_modules/buffer/index.d.ts","../../../../node_modules/undici-types/header.d.ts","../../../../node_modules/undici-types/readable.d.ts","../../../../node_modules/undici-types/file.d.ts","../../../../node_modules/undici-types/fetch.d.ts","../../../../node_modules/undici-types/formdata.d.ts","../../../../node_modules/undici-types/connector.d.ts","../../../../node_modules/undici-types/client.d.ts","../../../../node_modules/undici-types/errors.d.ts","../../../../node_modules/undici-types/dispatcher.d.ts","../../../../node_modules/undici-types/global-dispatcher.d.ts","../../../../node_modules/undici-types/global-origin.d.ts","../../../../node_modules/undici-types/pool-stats.d.ts","../../../../node_modules/undici-types/pool.d.ts","../../../../node_modules/undici-types/handlers.d.ts","../../../../node_modules/undici-types/balanced-pool.d.ts","../../../../node_modules/undici-types/agent.d.ts","../../../../node_modules/undici-types/mock-interceptor.d.ts","../../../../node_modules/undici-types/mock-agent.d.ts","../../../../node_modules/undici-types/mock-client.d.ts","../../../../node_modules/undici-types/mock-pool.d.ts","../../../../node_modules/undici-types/mock-errors.d.ts","../../../../node_modules/undici-types/proxy-agent.d.ts","../../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../../node_modules/undici-types/retry-handler.d.ts","../../../../node_modules/undici-types/retry-agent.d.ts","../../../../node_modules/undici-types/api.d.ts","../../../../node_modules/undici-types/interceptors.d.ts","../../../../node_modules/undici-types/util.d.ts","../../../../node_modules/undici-types/cookies.d.ts","../../../../node_modules/undici-types/patch.d.ts","../../../../node_modules/undici-types/websocket.d.ts","../../../../node_modules/undici-types/eventsource.d.ts","../../../../node_modules/undici-types/filereader.d.ts","../../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../../node_modules/undici-types/content-type.d.ts","../../../../node_modules/undici-types/cache.d.ts","../../../../node_modules/undici-types/index.d.ts","../../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../../node_modules/@types/node/web-globals/storage.d.ts","../../../../node_modules/@types/node/assert.d.ts","../../../../node_modules/@types/node/assert/strict.d.ts","../../../../node_modules/@types/node/async_hooks.d.ts","../../../../node_modules/@types/node/buffer.d.ts","../../../../node_modules/@types/node/child_process.d.ts","../../../../node_modules/@types/node/cluster.d.ts","../../../../node_modules/@types/node/console.d.ts","../../../../node_modules/@types/node/constants.d.ts","../../../../node_modules/@types/node/crypto.d.ts","../../../../node_modules/@types/node/dgram.d.ts","../../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../../node_modules/@types/node/dns.d.ts","../../../../node_modules/@types/node/dns/promises.d.ts","../../../../node_modules/@types/node/domain.d.ts","../../../../node_modules/@types/node/events.d.ts","../../../../node_modules/@types/node/fs.d.ts","../../../../node_modules/@types/node/fs/promises.d.ts","../../../../node_modules/@types/node/http.d.ts","../../../../node_modules/@types/node/http2.d.ts","../../../../node_modules/@types/node/https.d.ts","../../../../node_modules/@types/node/inspector.d.ts","../../../../node_modules/@types/node/inspector.generated.d.ts","../../../../node_modules/@types/node/module.d.ts","../../../../node_modules/@types/node/net.d.ts","../../../../node_modules/@types/node/os.d.ts","../../../../node_modules/@types/node/path.d.ts","../../../../node_modules/@types/node/perf_hooks.d.ts","../../../../node_modules/@types/node/process.d.ts","../../../../node_modules/@types/node/punycode.d.ts","../../../../node_modules/@types/node/querystring.d.ts","../../../../node_modules/@types/node/readline.d.ts","../../../../node_modules/@types/node/readline/promises.d.ts","../../../../node_modules/@types/node/repl.d.ts","../../../../node_modules/@types/node/sea.d.ts","../../../../node_modules/@types/node/sqlite.d.ts","../../../../node_modules/@types/node/stream.d.ts","../../../../node_modules/@types/node/stream/promises.d.ts","../../../../node_modules/@types/node/stream/consumers.d.ts","../../../../node_modules/@types/node/stream/web.d.ts","../../../../node_modules/@types/node/string_decoder.d.ts","../../../../node_modules/@types/node/test.d.ts","../../../../node_modules/@types/node/timers.d.ts","../../../../node_modules/@types/node/timers/promises.d.ts","../../../../node_modules/@types/node/tls.d.ts","../../../../node_modules/@types/node/trace_events.d.ts","../../../../node_modules/@types/node/tty.d.ts","../../../../node_modules/@types/node/url.d.ts","../../../../node_modules/@types/node/util.d.ts","../../../../node_modules/@types/node/v8.d.ts","../../../../node_modules/@types/node/vm.d.ts","../../../../node_modules/@types/node/wasi.d.ts","../../../../node_modules/@types/node/worker_threads.d.ts","../../../../node_modules/@types/node/zlib.d.ts","../../../../node_modules/@types/node/index.d.ts","../../../../node_modules/@nodelib/fs.stat/out/types/index.d.ts","../../../../node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts","../../../../node_modules/@nodelib/fs.stat/out/settings.d.ts","../../../../node_modules/@nodelib/fs.stat/out/providers/async.d.ts","../../../../node_modules/@nodelib/fs.stat/out/index.d.ts","../../../../node_modules/@nodelib/fs.scandir/out/types/index.d.ts","../../../../node_modules/@nodelib/fs.scandir/out/adapters/fs.d.ts","../../../../node_modules/@nodelib/fs.scandir/out/settings.d.ts","../../../../node_modules/@nodelib/fs.scandir/out/providers/async.d.ts","../../../../node_modules/@nodelib/fs.scandir/out/index.d.ts","../../../../node_modules/@nodelib/fs.walk/out/types/index.d.ts","../../../../node_modules/@nodelib/fs.walk/out/settings.d.ts","../../../../node_modules/@nodelib/fs.walk/out/readers/reader.d.ts","../../../../node_modules/@nodelib/fs.walk/out/readers/async.d.ts","../../../../node_modules/@nodelib/fs.walk/out/providers/async.d.ts","../../../../node_modules/@nodelib/fs.walk/out/index.d.ts","../../../../node_modules/fast-glob/out/types/index.d.ts","../../../../node_modules/fast-glob/out/settings.d.ts","../../../../node_modules/fast-glob/out/managers/tasks.d.ts","../../../../node_modules/fast-glob/out/index.d.ts","../../../../packages/common/src/GGExtensionDiscovery.ts","../../../../packages/common/src/index-node.ts","../../../../packages/locator/src/GGLocatorStorage.ts","../../../../packages/locator/src/index-node.ts","../src/testable.decorator.ts","../src/index.ts"],"fileIdsList":[[79,128,145,146,183,184],[79,128,145,146,184,185,186,187],[79,128,145,146,178,184,186],[79,128,145,146,183,185],[79,128,140,145,146,178],[79,128,140,145,146,178,179],[79,128,145,146,179,180,181,182],[79,128,145,146,179,181],[79,128,145,146,180],[79,128,145,146,160,178,188,189,190,193],[79,128,145,146,189,190,192],[79,128,139,145,146,178,188,189,190,191],[79,128,145,146,190],[79,128,145,146,188,189],[79,128,145,146,178,188],[79,125,126,128,145,146],[79,127,128,145,146],[128,145,146],[79,128,133,145,146,163],[79,128,129,134,139,145,146,148,160,171],[79,128,129,130,139,145,146,148],[79,128,145,146],[74,75,76,79,128,145,146],[79,128,131,145,146,172],[79,128,132,133,140,145,146,149],[79,128,133,145,146,160,168],[79,128,134,136,139,145,146,148],[79,127,128,135,145,146],[79,128,136,137,145,146],[79,128,138,139,145,146],[79,127,128,139,145,146],[79,128,139,140,141,145,146,160,171],[79,128,139,140,141,145,146,155,160,163],[79,121,128,136,139,142,145,146,148,160,171],[79,128,139,140,142,143,145,146,148,160,168,171],[79,128,142,144,145,146,160,168,171],[77,78,79,80,81,82,83,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177],[79,128,139,145,146],[79,128,145,146,147,171],[79,128,136,139,145,146,148,160],[79,128,145,146,149],[79,128,145,146,150],[79,127,128,145,146,151],[79,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177],[79,128,145,146,153],[79,128,145,146,154],[79,128,139,145,146,155,156],[79,128,145,146,155,157,172,174],[79,128,140,145,146],[79,128,139,145,146,160,161,163],[79,128,145,146,162,163],[79,128,145,146,160,161],[79,128,145,146,163],[79,128,145,146,164],[79,125,128,145,146,160,165,171],[79,128,139,145,146,166,167],[79,128,145,146,166,167],[79,128,133,145,146,148,160,168],[79,128,145,146,169],[79,128,145,146,148,170],[79,128,142,145,146,154,171],[79,128,133,145,146,172],[79,128,145,146,160,173],[79,128,145,146,147,174],[79,128,145,146,175],[79,121,128,145,146],[79,121,128,139,141,145,146,151,160,163,171,173,174,176],[79,128,145,146,160,177],[79,128,145,146,178,195,196,197],[79,128,145,146,195,196],[79,128,145,146,195],[79,128,145,146,178,194],[79,93,97,128,145,146,171],[79,93,128,145,146,160,171],[79,88,128,145,146],[79,90,93,128,145,146,168,171],[79,128,145,146,148,168],[79,128,145,146,178],[79,88,128,145,146,178],[79,90,93,128,145,146,148,171],[79,85,86,89,92,128,139,145,146,160,171],[79,93,100,128,145,146],[79,85,91,128,145,146],[79,93,114,115,128,145,146],[79,89,93,128,145,146,163,171,178],[79,114,128,145,146,178],[79,87,88,128,145,146,178],[79,93,128,145,146],[79,87,88,89,90,91,92,93,94,95,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,115,116,117,118,119,120,128,145,146],[79,93,108,128,145,146],[79,93,100,101,128,145,146],[79,91,93,101,102,128,145,146],[79,92,128,145,146],[79,85,88,93,128,145,146],[79,93,97,101,102,128,145,146],[79,97,128,145,146],[79,91,93,96,128,145,146,171],[79,85,90,93,100,128,145,146],[79,128,145,146,160],[79,88,93,114,128,145,146,176,178],[58,79,128,145,146,203],[79,128,145,146,202],[79,128,140,145,146,150,171,198],[63,64,65,66,67,68,69,70,71,72,73,79,128,145,146,199],[62,79,128,145,146,201],[59,79,128,145,146],[60,61,79,128,145,146,201],[62,79,128,145,146,200],[59,60,62,79,127,128,145,146,201]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"51a355954f49520ffe2759984b0701d731d2e954ebb5c08704d2c8e711aa7a20","signature":"749f6ba167ea7162ca524ee698f3a4b82e0a7bb737d1cec4283824e68fdfc5e0"},"4b9f50c91c30bab24c9aabe5698b451b642a63da83f0858bda1af4e1b4676573","bfa83a54b6e1aaacb3b9f74cde8acbc1799578a1294b70eee95f6a31790e5c02","26e6482c3c04b3c9697cca31fa74dfbc491391a8f84e92fae651817655e1c0ad","28b0d6267afd6d97b0b5ad26189a19585535a8ab5df3f134ba1793c14cc41585","ebc9e41e8b0f1877e108359607af3007654cbe6a68b010387d714e782c4c8e10","b30b7fd7a575d5984362bb0afa0688a532082c6dba312febe93590181ee27209","a4c0aba159373b9d4ae7b5fcc1df0452d355dae89caeb8a55c23a5ac51164bad","167c66181f0e1bec730481c9c424333ecfebcac4e85fd1531c1b2f51a17a18eb","b3c158342b9a5388e54e6334fb6b851a49f9a425e16f832d4136d93574dbe838","ae01f79f46a5bb60d1b60da0d9e6619a978bf24a3db7f37d26b42d85ba4726c8","ff9b51d173d382bd028ea76d69646fafed2cc558d771acb9aadcc5cb50ed2154","4ef871ffaee0c35955e2f2253d1c97872013510b5962f2a4a021df2a1c35f2e2","ddc8ff17b3cb2d7e45fd70f8cefa26d1c6b8db91c2b4e1d93c15f819a4a7106f","8c4b94857ca62dca9f2ce7e2ab0d933282905dac970541a91c6e07546f0b8ba1","1fb8e98536077b3d702e8343ecef42542710d8b8177ee051ee072284843d5f5e",{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"f949f7f6c7802a338039cfc2156d1fe285cdd1e092c64437ebe15ae8edc854e0","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"83e63d6ccf8ec004a3bb6d58b9bb0104f60e002754b1e968024b320730cc5311","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d2bc7425ef40526650d6db7e072c1ff4a51101c3ac2cc4b666623b19496a6e27","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"f27524f4bef4b6519c604bdb23bf4465bddcccbf3f003abb901acbd0d7404d99","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"6b039f55681caaf111d5eb84d292b9bee9e0131d0db1ad0871eef0964f533c73","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"0dba70b3fb0dcd713fda33c2df64fa6751fff6460e536971cee917260fb17882","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f663c2f91127ef7024e8ca4b3b4383ff2770e5f826696005de382282794b127","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1},{"version":"46324183533e34fad2461b51174132e8e0e4b3ac1ceb5032e4952992739d1eab","impliedFormat":1},{"version":"d3fa0530dfb1df408f0abd76486de39def69ca47683d4a3529b2d22fce27c693","impliedFormat":1},{"version":"d9be977c415df16e4defe4995caeca96e637eeef9d216d0d90cdba6fc617e97e","impliedFormat":1},{"version":"98e0c2b48d855a844099123e8ec20fe383ecd1c5877f3895b048656befe268d0","impliedFormat":1},{"version":"ff53802a97b7d11ab3c4395aa052baa14cd12d2b1ed236b520a833fdd2a15003","impliedFormat":1},{"version":"fce9262f840a74118112caf685b725e1cc86cd2b0927311511113d90d87cc61e","impliedFormat":1},{"version":"d7a7cac49af2a3bfc208fe68831fbfa569864f74a7f31cc3a607f641e6c583fd","impliedFormat":1},{"version":"9a80e3322d08274f0e41b77923c91fe67b2c8a5134a5278c2cb60a330441554e","impliedFormat":1},{"version":"2460af41191009298d931c592fb6d4151beea320f1f25b73605e2211e53e4e88","impliedFormat":1},{"version":"2f87ea988d84d1c617afdeba9d151435473ab24cd5fc456510c8db26d8bd1581","impliedFormat":1},{"version":"b7336c1c536e3deaedbda956739c6250ac2d0dd171730c42cb57b10368f38a14","impliedFormat":1},{"version":"6fb67d664aaab2f1d1ad4613b58548aecb4b4703b9e4c5dba6b865b31bd14722","impliedFormat":1},{"version":"4414644199b1a047b4234965e07d189781a92b578707c79c3933918d67cd9d85","impliedFormat":1},{"version":"04a4b38c6a1682059eac00e7d0948d99c46642b57003d61d0fe9ccc9df442887","impliedFormat":1},{"version":"f12ea658b060da1752c65ae4f1e4c248587f6cd4cb4acabbf79a110b6b02ff75","impliedFormat":1},{"version":"011b2857871a878d5eae463bedc4b3dd14755dc3a67d5d10f8fbb7823d119294","impliedFormat":1},{"version":"d406b797d7b2aff9f8bd6c023acfaa5a5fc415bfbf01975e23d415d3f54857af","impliedFormat":1},{"version":"7d71b2d1a537fe41760a16441cd95d98fcb59ddf9c714aba2fecba961ab253b6","impliedFormat":1},{"version":"a9bd8a2bbd03a72054cbdf0cd2a77fabea4e3ae591dd02b8f58bda0c34e50c1c","impliedFormat":1},{"version":"386cc88a3bdee8bc651ead59f8afc9dc5729fc933549bbd217409eabad05ba3e","impliedFormat":1},"12c3eebbf1564faa43bf1b21dc787de41f20bb9a932c9eb7cbf7c3c99916f331","37388852752cf98f5ef58d214de5277a709c273a4ae17ac1882b65671e70a169","f2fa43f90a965f7f5664cc7c6caee0e351bd3c7f8d6337808522e283c83abc66","307e671cc1485413dad2df60747a3629c8961fd6e26dbd553bd879da0b015937",{"version":"74a8d4f96326d3c4d509e0a868c071a00ee2a11e7eeef8ec1dbfe96aa3000a13","signature":"4200a12dbbc5149a55239b93136e6d1442ad1964735641591ec2de092d5fe3de"},{"version":"caf82d2a3b2e3708143c32219e544991d8f26910a045b69b2a573c2add80ffe1","signature":"709a6f551e29ba9f0cbdccdd144217cd1c235e4061f3312b63ae1834c600ca12"}],"root":[58,203,204],"options":{"allowJs":false,"checkJs":false,"composite":false,"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":99,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUnusedLocals":true,"noUnusedParameters":false,"outDir":"./","rootDir":"..","skipLibCheck":true,"sourceMap":true,"target":9},"referencedMap":[[185,1],[188,2],[187,3],[186,4],[184,5],[180,6],[183,7],[182,8],[181,9],[179,5],[194,10],[193,11],[192,12],[191,13],[190,14],[189,15],[125,16],[126,16],[127,17],[79,18],[128,19],[129,20],[130,21],[74,22],[77,23],[75,22],[76,22],[131,24],[132,25],[133,26],[134,27],[135,28],[136,29],[137,29],[138,30],[139,31],[140,32],[141,33],[80,22],[78,22],[142,34],[143,35],[144,36],[178,37],[145,38],[146,22],[147,39],[148,40],[149,41],[150,42],[151,43],[152,44],[153,45],[154,46],[155,47],[156,47],[157,48],[158,22],[159,49],[160,50],[162,51],[161,52],[163,53],[164,54],[165,55],[166,56],[167,57],[168,58],[169,59],[170,60],[171,61],[172,62],[173,63],[174,64],[175,65],[81,22],[82,22],[83,22],[122,66],[123,22],[124,22],[176,67],[177,68],[84,22],[198,69],[197,70],[196,71],[195,72],[56,22],[57,22],[11,22],[10,22],[2,22],[12,22],[13,22],[14,22],[15,22],[16,22],[17,22],[18,22],[19,22],[3,22],[20,22],[21,22],[4,22],[22,22],[26,22],[23,22],[24,22],[25,22],[27,22],[28,22],[29,22],[5,22],[30,22],[31,22],[32,22],[33,22],[6,22],[37,22],[34,22],[35,22],[36,22],[38,22],[7,22],[39,22],[44,22],[45,22],[40,22],[41,22],[42,22],[43,22],[8,22],[49,22],[46,22],[47,22],[48,22],[50,22],[9,22],[51,22],[52,22],[53,22],[55,22],[54,22],[1,22],[100,73],[110,74],[99,73],[120,75],[91,76],[90,77],[119,78],[113,79],[118,80],[93,81],[107,82],[92,83],[116,84],[88,85],[87,78],[117,86],[89,87],[94,88],[95,22],[98,88],[85,22],[121,89],[111,90],[102,91],[103,92],[105,93],[101,94],[104,95],[114,78],[96,96],[97,97],[106,98],[86,99],[109,90],[108,88],[112,22],[115,100],[204,101],[58,17],[203,102],[73,22],[66,22],[199,103],[70,22],[67,22],[64,22],[63,22],[72,22],[69,22],[200,104],[71,22],[68,22],[65,22],[59,105],[60,106],[62,107],[61,22],[201,108],[202,109]],"semanticDiagnosticsPerFile":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204],"checkPending":true,"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grest-ts/testkit-runtime",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Component testing library runtime code. ",
|
|
@@ -40,12 +40,12 @@
|
|
|
40
40
|
"testkit"
|
|
41
41
|
],
|
|
42
42
|
"engines": {
|
|
43
|
-
"node": ">=
|
|
43
|
+
"node": ">=25"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@grest-ts/locator": "0.0.
|
|
46
|
+
"@grest-ts/locator": "0.0.8"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@grest-ts/x-packager": "0.0.
|
|
49
|
+
"@grest-ts/x-packager": "0.0.8"
|
|
50
50
|
}
|
|
51
51
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./mockable.decorator"
|
|
1
|
+
export * from "./mockable.decorator"
|
|
2
2
|
export * from "./testable.decorator"
|
|
@@ -1,193 +1,193 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal runtime for @mockable decorator.
|
|
3
|
-
* This file has NO dependencies on testkit internals and is safe for production bundles.
|
|
4
|
-
*
|
|
5
|
-
* The decorator wraps methods but only activates mock/spy behavior when running in test mode.
|
|
6
|
-
* In production, methods are called directly with zero overhead beyond the wrapper.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import {AsyncLocalStorage} from "async_hooks";
|
|
10
|
-
|
|
11
|
-
// ============================================================================
|
|
12
|
-
// Test context interface - implemented by testkit's GGTestRuntimeWorker
|
|
13
|
-
// ============================================================================
|
|
14
|
-
|
|
15
|
-
export interface MockableTestContext {
|
|
16
|
-
/**
|
|
17
|
-
* Send a mockable call to the test runner.
|
|
18
|
-
* Returns mock data, or CALL_THROUGH symbol for spy mode.
|
|
19
|
-
*/
|
|
20
|
-
sendCall(className: string, methodName: string, callArgs: Record<string, any>): Promise<any>;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Report the result of a spy call back to the test runner.
|
|
24
|
-
*/
|
|
25
|
-
sendSpyResult(className: string, methodName: string, callResult: any): Promise<void>;
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Sentinel value indicating spy mode (call the real method).
|
|
29
|
-
*/
|
|
30
|
-
readonly CALL_THROUGH: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// ============================================================================
|
|
34
|
-
// Context storage - set by testkit when running tests
|
|
35
|
-
// ============================================================================
|
|
36
|
-
|
|
37
|
-
const mockableContextStorage = new AsyncLocalStorage<MockableTestContext>();
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Run code within a mockable test context.
|
|
41
|
-
* Called by testkit's GGTestRuntimeWorker to enable mock/spy behavior.
|
|
42
|
-
* @internal
|
|
43
|
-
*/
|
|
44
|
-
export function runWithMockableContext<T>(ctx: MockableTestContext, fn: () => T): T {
|
|
45
|
-
return mockableContextStorage.run(ctx, fn);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// ============================================================================
|
|
49
|
-
// Helper functions
|
|
50
|
-
// ============================================================================
|
|
51
|
-
|
|
52
|
-
const MOCKABLE_WRAPPED = Symbol('GGMockableWrapped');
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Extract parameter names from a function.
|
|
56
|
-
* Falls back to arg0, arg1, etc. if parsing fails.
|
|
57
|
-
*/
|
|
58
|
-
function getParamNames(fn: Function): string[] {
|
|
59
|
-
const fnStr = fn.toString();
|
|
60
|
-
// Match function parameters: function(a, b, c) or (a, b, c) =>
|
|
61
|
-
const match = fnStr.match(/(?:function\s*\w*\s*\(|\()\s*([^)]*)\)/);
|
|
62
|
-
if (!match || !match[1]) return [];
|
|
63
|
-
|
|
64
|
-
return match[1]
|
|
65
|
-
.split(',')
|
|
66
|
-
.map(p => p.trim())
|
|
67
|
-
.filter(p => p.length > 0)
|
|
68
|
-
.map(p => {
|
|
69
|
-
// Handle destructuring, default values, type annotations
|
|
70
|
-
// Take just the parameter name before : or =
|
|
71
|
-
const name = p.split(/[=:]/)[0].trim();
|
|
72
|
-
// Remove ... for rest params
|
|
73
|
-
return name.replace(/^\.\.\./, '');
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Convert positional arguments to a named object.
|
|
79
|
-
*/
|
|
80
|
-
function argsToObject(args: any[], paramNames: string[]): Record<string, any> {
|
|
81
|
-
const result: Record<string, any> = {};
|
|
82
|
-
for (let i = 0; i < args.length; i++) {
|
|
83
|
-
result[paramNames[i] || `arg${i}`] = args[i];
|
|
84
|
-
}
|
|
85
|
-
return result;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Check if a function is async (returns a Promise).
|
|
90
|
-
* @deprected - having this is bad, we should not check it like this!
|
|
91
|
-
* @TODO Existance of this is bad!
|
|
92
|
-
*/
|
|
93
|
-
function isAsyncFunction(fn: Function): boolean {
|
|
94
|
-
return fn.constructor.name === 'AsyncFunction' ||
|
|
95
|
-
fn.toString().includes('__awaiter') || // Compiled TypeScript async
|
|
96
|
-
fn.toString().trimStart().startsWith('async ');
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Wrap a method to intercept calls in test mode.
|
|
101
|
-
* Only wraps async methods - sync methods are not mockable to preserve calling semantics.
|
|
102
|
-
*/
|
|
103
|
-
function wrapMethod(cls: any, methodName: string): void {
|
|
104
|
-
// Skip if already wrapped
|
|
105
|
-
if (cls.prototype[methodName]?.[MOCKABLE_WRAPPED]) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const originalMethod = cls.prototype[methodName];
|
|
110
|
-
|
|
111
|
-
// Only wrap async methods - sync helper methods shouldn't be intercepted
|
|
112
|
-
// because making them async would break calling code that doesn't await them
|
|
113
|
-
// @TODO XXAsyncMethodIssue
|
|
114
|
-
// @TODO Having this is literally bad, we need to change how mock logic works.
|
|
115
|
-
// @TODO Right now mocks go back to test to see "whats up", but we should actually sync mocks info to the service before the call, so even for sync methods we can resolve the mock data.
|
|
116
|
-
// @TODO This has a drawback of losing "central brain" control though, as each mock is no instance bound.
|
|
117
|
-
// @TODO This whole idea needs thinking
|
|
118
|
-
if (!isAsyncFunction(originalMethod)) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const paramNames = getParamNames(originalMethod);
|
|
123
|
-
|
|
124
|
-
const wrappedMethod = async function (this: any, ...args: any[]) {
|
|
125
|
-
const ctx = mockableContextStorage.getStore();
|
|
126
|
-
|
|
127
|
-
// Not in test mode - call original method directly (zero overhead path)
|
|
128
|
-
if (!ctx) {
|
|
129
|
-
return originalMethod.apply(this, args);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// In test mode - go through mock/spy system
|
|
133
|
-
const callArgs = argsToObject(args, paramNames);
|
|
134
|
-
const result = await ctx.sendCall(cls.name, methodName, callArgs);
|
|
135
|
-
|
|
136
|
-
if (result === ctx.CALL_THROUGH) {
|
|
137
|
-
// Spy mode - call the real method
|
|
138
|
-
const realResult = await originalMethod.apply(this, args);
|
|
139
|
-
|
|
140
|
-
// Report result back for validation
|
|
141
|
-
await ctx.sendSpyResult(cls.name, methodName, realResult);
|
|
142
|
-
|
|
143
|
-
return realResult;
|
|
144
|
-
} else {
|
|
145
|
-
// Mock mode - return the mock data
|
|
146
|
-
return result;
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
// Mark as wrapped and assign to prototype
|
|
151
|
-
(wrappedMethod as any)[MOCKABLE_WRAPPED] = true;
|
|
152
|
-
cls.prototype[methodName] = wrappedMethod;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// ============================================================================
|
|
156
|
-
// The @mockable decorator
|
|
157
|
-
// ============================================================================
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Decorator to mark a class as mockable in tests.
|
|
161
|
-
* All public async methods will be interceptable via mockBy() or spyOn().
|
|
162
|
-
*
|
|
163
|
-
* In production (when not running tests), this decorator has minimal overhead -
|
|
164
|
-
* methods are wrapped but the wrapper immediately calls through to the original.
|
|
165
|
-
*
|
|
166
|
-
* @example
|
|
167
|
-
* ```typescript
|
|
168
|
-
* import {mockable} from "@grest-ts/testkit/mockable";
|
|
169
|
-
*
|
|
170
|
-
* @mockable
|
|
171
|
-
* export class AddressResolverService {
|
|
172
|
-
* async resolveAddress(address: string): Promise<LatLng> { ... }
|
|
173
|
-
* }
|
|
174
|
-
*
|
|
175
|
-
* // In tests:
|
|
176
|
-
* .with(mockBy(AddressResolverService).resolveAddress
|
|
177
|
-
* .toEqual({address: "123 Main St"})
|
|
178
|
-
* .andReturn({lat: 40.7, lng: -74.0}))
|
|
179
|
-
* ```
|
|
180
|
-
*/
|
|
181
|
-
export function mockable<T extends { new(...args: any[]): {} }>(target: T): T {
|
|
182
|
-
// Get all methods from prototype
|
|
183
|
-
for (const key of Object.getOwnPropertyNames(target.prototype)) {
|
|
184
|
-
if (key === 'constructor') continue;
|
|
185
|
-
|
|
186
|
-
const descriptor = Object.getOwnPropertyDescriptor(target.prototype, key);
|
|
187
|
-
if (descriptor && typeof descriptor.value === 'function') {
|
|
188
|
-
wrapMethod(target, key);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
return target;
|
|
193
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Minimal runtime for @mockable decorator.
|
|
3
|
+
* This file has NO dependencies on testkit internals and is safe for production bundles.
|
|
4
|
+
*
|
|
5
|
+
* The decorator wraps methods but only activates mock/spy behavior when running in test mode.
|
|
6
|
+
* In production, methods are called directly with zero overhead beyond the wrapper.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {AsyncLocalStorage} from "async_hooks";
|
|
10
|
+
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Test context interface - implemented by testkit's GGTestRuntimeWorker
|
|
13
|
+
// ============================================================================
|
|
14
|
+
|
|
15
|
+
export interface MockableTestContext {
|
|
16
|
+
/**
|
|
17
|
+
* Send a mockable call to the test runner.
|
|
18
|
+
* Returns mock data, or CALL_THROUGH symbol for spy mode.
|
|
19
|
+
*/
|
|
20
|
+
sendCall(className: string, methodName: string, callArgs: Record<string, any>): Promise<any>;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Report the result of a spy call back to the test runner.
|
|
24
|
+
*/
|
|
25
|
+
sendSpyResult(className: string, methodName: string, callResult: any): Promise<void>;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Sentinel value indicating spy mode (call the real method).
|
|
29
|
+
*/
|
|
30
|
+
readonly CALL_THROUGH: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Context storage - set by testkit when running tests
|
|
35
|
+
// ============================================================================
|
|
36
|
+
|
|
37
|
+
const mockableContextStorage = new AsyncLocalStorage<MockableTestContext>();
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Run code within a mockable test context.
|
|
41
|
+
* Called by testkit's GGTestRuntimeWorker to enable mock/spy behavior.
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
44
|
+
export function runWithMockableContext<T>(ctx: MockableTestContext, fn: () => T): T {
|
|
45
|
+
return mockableContextStorage.run(ctx, fn);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// ============================================================================
|
|
49
|
+
// Helper functions
|
|
50
|
+
// ============================================================================
|
|
51
|
+
|
|
52
|
+
const MOCKABLE_WRAPPED = Symbol('GGMockableWrapped');
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Extract parameter names from a function.
|
|
56
|
+
* Falls back to arg0, arg1, etc. if parsing fails.
|
|
57
|
+
*/
|
|
58
|
+
function getParamNames(fn: Function): string[] {
|
|
59
|
+
const fnStr = fn.toString();
|
|
60
|
+
// Match function parameters: function(a, b, c) or (a, b, c) =>
|
|
61
|
+
const match = fnStr.match(/(?:function\s*\w*\s*\(|\()\s*([^)]*)\)/);
|
|
62
|
+
if (!match || !match[1]) return [];
|
|
63
|
+
|
|
64
|
+
return match[1]
|
|
65
|
+
.split(',')
|
|
66
|
+
.map(p => p.trim())
|
|
67
|
+
.filter(p => p.length > 0)
|
|
68
|
+
.map(p => {
|
|
69
|
+
// Handle destructuring, default values, type annotations
|
|
70
|
+
// Take just the parameter name before : or =
|
|
71
|
+
const name = p.split(/[=:]/)[0].trim();
|
|
72
|
+
// Remove ... for rest params
|
|
73
|
+
return name.replace(/^\.\.\./, '');
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Convert positional arguments to a named object.
|
|
79
|
+
*/
|
|
80
|
+
function argsToObject(args: any[], paramNames: string[]): Record<string, any> {
|
|
81
|
+
const result: Record<string, any> = {};
|
|
82
|
+
for (let i = 0; i < args.length; i++) {
|
|
83
|
+
result[paramNames[i] || `arg${i}`] = args[i];
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Check if a function is async (returns a Promise).
|
|
90
|
+
* @deprected - having this is bad, we should not check it like this!
|
|
91
|
+
* @TODO Existance of this is bad!
|
|
92
|
+
*/
|
|
93
|
+
function isAsyncFunction(fn: Function): boolean {
|
|
94
|
+
return fn.constructor.name === 'AsyncFunction' ||
|
|
95
|
+
fn.toString().includes('__awaiter') || // Compiled TypeScript async
|
|
96
|
+
fn.toString().trimStart().startsWith('async ');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Wrap a method to intercept calls in test mode.
|
|
101
|
+
* Only wraps async methods - sync methods are not mockable to preserve calling semantics.
|
|
102
|
+
*/
|
|
103
|
+
function wrapMethod(cls: any, methodName: string): void {
|
|
104
|
+
// Skip if already wrapped
|
|
105
|
+
if (cls.prototype[methodName]?.[MOCKABLE_WRAPPED]) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const originalMethod = cls.prototype[methodName];
|
|
110
|
+
|
|
111
|
+
// Only wrap async methods - sync helper methods shouldn't be intercepted
|
|
112
|
+
// because making them async would break calling code that doesn't await them
|
|
113
|
+
// @TODO XXAsyncMethodIssue
|
|
114
|
+
// @TODO Having this is literally bad, we need to change how mock logic works.
|
|
115
|
+
// @TODO Right now mocks go back to test to see "whats up", but we should actually sync mocks info to the service before the call, so even for sync methods we can resolve the mock data.
|
|
116
|
+
// @TODO This has a drawback of losing "central brain" control though, as each mock is no instance bound.
|
|
117
|
+
// @TODO This whole idea needs thinking
|
|
118
|
+
if (!isAsyncFunction(originalMethod)) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const paramNames = getParamNames(originalMethod);
|
|
123
|
+
|
|
124
|
+
const wrappedMethod = async function (this: any, ...args: any[]) {
|
|
125
|
+
const ctx = mockableContextStorage.getStore();
|
|
126
|
+
|
|
127
|
+
// Not in test mode - call original method directly (zero overhead path)
|
|
128
|
+
if (!ctx) {
|
|
129
|
+
return originalMethod.apply(this, args);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// In test mode - go through mock/spy system
|
|
133
|
+
const callArgs = argsToObject(args, paramNames);
|
|
134
|
+
const result = await ctx.sendCall(cls.name, methodName, callArgs);
|
|
135
|
+
|
|
136
|
+
if (result === ctx.CALL_THROUGH) {
|
|
137
|
+
// Spy mode - call the real method
|
|
138
|
+
const realResult = await originalMethod.apply(this, args);
|
|
139
|
+
|
|
140
|
+
// Report result back for validation
|
|
141
|
+
await ctx.sendSpyResult(cls.name, methodName, realResult);
|
|
142
|
+
|
|
143
|
+
return realResult;
|
|
144
|
+
} else {
|
|
145
|
+
// Mock mode - return the mock data
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// Mark as wrapped and assign to prototype
|
|
151
|
+
(wrappedMethod as any)[MOCKABLE_WRAPPED] = true;
|
|
152
|
+
cls.prototype[methodName] = wrappedMethod;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// ============================================================================
|
|
156
|
+
// The @mockable decorator
|
|
157
|
+
// ============================================================================
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Decorator to mark a class as mockable in tests.
|
|
161
|
+
* All public async methods will be interceptable via mockBy() or spyOn().
|
|
162
|
+
*
|
|
163
|
+
* In production (when not running tests), this decorator has minimal overhead -
|
|
164
|
+
* methods are wrapped but the wrapper immediately calls through to the original.
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```typescript
|
|
168
|
+
* import {mockable} from "@grest-ts/testkit/mockable";
|
|
169
|
+
*
|
|
170
|
+
* @mockable
|
|
171
|
+
* export class AddressResolverService {
|
|
172
|
+
* async resolveAddress(address: string): Promise<LatLng> { ... }
|
|
173
|
+
* }
|
|
174
|
+
*
|
|
175
|
+
* // In tests:
|
|
176
|
+
* .with(mockBy(AddressResolverService).resolveAddress
|
|
177
|
+
* .toEqual({address: "123 Main St"})
|
|
178
|
+
* .andReturn({lat: 40.7, lng: -74.0}))
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
export function mockable<T extends { new(...args: any[]): {} }>(target: T): T {
|
|
182
|
+
// Get all methods from prototype
|
|
183
|
+
for (const key of Object.getOwnPropertyNames(target.prototype)) {
|
|
184
|
+
if (key === 'constructor') continue;
|
|
185
|
+
|
|
186
|
+
const descriptor = Object.getOwnPropertyDescriptor(target.prototype, key);
|
|
187
|
+
if (descriptor && typeof descriptor.value === 'function') {
|
|
188
|
+
wrapMethod(target, key);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return target;
|
|
193
|
+
}
|
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal runtime for @testable decorator.
|
|
3
|
-
* This file has NO dependencies on testkit internals and is safe for production bundles.
|
|
4
|
-
*
|
|
5
|
-
* The @testable decorator registers class instances in GGLocator, enabling
|
|
6
|
-
* direct method invocation from tests via the testable() function.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import {GGLocator, GGLocatorKey} from "@grest-ts/locator";
|
|
10
|
-
|
|
11
|
-
export const LOCATOR_KEY_PREFIX_FOR_TESTABLE = "@testable:";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Decorator to mark a class as testable - enabling direct method invocation from tests.
|
|
15
|
-
*
|
|
16
|
-
* When a @testable class is instantiated during runtime composition, the instance
|
|
17
|
-
* is automatically registered in GGLocator. Tests can then invoke methods directly
|
|
18
|
-
* on this instance via the testable() function.
|
|
19
|
-
*
|
|
20
|
-
* For single instances (the common case), just use the decorator:
|
|
21
|
-
* ```typescript
|
|
22
|
-
* @testable
|
|
23
|
-
* export class MyService { ... }
|
|
24
|
-
*
|
|
25
|
-
* // In tests:
|
|
26
|
-
* await testable(MyService).doSomething()
|
|
27
|
-
* ```
|
|
28
|
-
*
|
|
29
|
-
* For multiple instances, register with custom keys:
|
|
30
|
-
* ```typescript
|
|
31
|
-
* const primaryKey = new GGLocatorKey<MyService>("MyService:primary");
|
|
32
|
-
* const secondaryKey = new GGLocatorKey<MyService>("MyService:secondary");
|
|
33
|
-
*
|
|
34
|
-
* // In compose:
|
|
35
|
-
* primaryKey.set(new MyService(...));
|
|
36
|
-
* secondaryKey.set(new MyService(...));
|
|
37
|
-
*
|
|
38
|
-
* // In tests:
|
|
39
|
-
* await testable(primaryKey).doSomething()
|
|
40
|
-
* await testable(secondaryKey).doSomething()
|
|
41
|
-
* ```
|
|
42
|
-
*/
|
|
43
|
-
export function testable<T extends { new(...args: any[]): {} }>(target: T): T {
|
|
44
|
-
const key = new GGLocatorKey<InstanceType<T>>(LOCATOR_KEY_PREFIX_FOR_TESTABLE + target.name);
|
|
45
|
-
|
|
46
|
-
// Create a new class that extends the target and registers on construction
|
|
47
|
-
const wrappedClass = class extends (target as any) {
|
|
48
|
-
constructor(...args: any[]) {
|
|
49
|
-
super(...args);
|
|
50
|
-
const scope = GGLocator.tryGetScope();
|
|
51
|
-
if (scope) {
|
|
52
|
-
if (scope.has(key)) {
|
|
53
|
-
// First registration wins - log warning and skip
|
|
54
|
-
// Using console.warn as GGLog may not be available in all contexts
|
|
55
|
-
console.warn(
|
|
56
|
-
`[@testable] Instance already registered for '${key.name}'. ` +
|
|
57
|
-
`First registration wins. If you need multiple instances, register them manually with custom keys.`
|
|
58
|
-
);
|
|
59
|
-
} else {
|
|
60
|
-
scope.set(key, this as InstanceType<T>);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
// Preserve class name for debugging and key generation
|
|
67
|
-
Object.defineProperty(wrappedClass, 'name', {value: target.name});
|
|
68
|
-
|
|
69
|
-
// Copy static properties
|
|
70
|
-
for (const prop of Object.getOwnPropertyNames(target)) {
|
|
71
|
-
if (prop !== 'prototype' && prop !== 'name' && prop !== 'length') {
|
|
72
|
-
const descriptor = Object.getOwnPropertyDescriptor(target, prop);
|
|
73
|
-
if (descriptor) {
|
|
74
|
-
Object.defineProperty(wrappedClass, prop, descriptor);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return wrappedClass as T;
|
|
80
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Minimal runtime for @testable decorator.
|
|
3
|
+
* This file has NO dependencies on testkit internals and is safe for production bundles.
|
|
4
|
+
*
|
|
5
|
+
* The @testable decorator registers class instances in GGLocator, enabling
|
|
6
|
+
* direct method invocation from tests via the testable() function.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {GGLocator, GGLocatorKey} from "@grest-ts/locator";
|
|
10
|
+
|
|
11
|
+
export const LOCATOR_KEY_PREFIX_FOR_TESTABLE = "@testable:";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Decorator to mark a class as testable - enabling direct method invocation from tests.
|
|
15
|
+
*
|
|
16
|
+
* When a @testable class is instantiated during runtime composition, the instance
|
|
17
|
+
* is automatically registered in GGLocator. Tests can then invoke methods directly
|
|
18
|
+
* on this instance via the testable() function.
|
|
19
|
+
*
|
|
20
|
+
* For single instances (the common case), just use the decorator:
|
|
21
|
+
* ```typescript
|
|
22
|
+
* @testable
|
|
23
|
+
* export class MyService { ... }
|
|
24
|
+
*
|
|
25
|
+
* // In tests:
|
|
26
|
+
* await testable(MyService).doSomething()
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* For multiple instances, register with custom keys:
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const primaryKey = new GGLocatorKey<MyService>("MyService:primary");
|
|
32
|
+
* const secondaryKey = new GGLocatorKey<MyService>("MyService:secondary");
|
|
33
|
+
*
|
|
34
|
+
* // In compose:
|
|
35
|
+
* primaryKey.set(new MyService(...));
|
|
36
|
+
* secondaryKey.set(new MyService(...));
|
|
37
|
+
*
|
|
38
|
+
* // In tests:
|
|
39
|
+
* await testable(primaryKey).doSomething()
|
|
40
|
+
* await testable(secondaryKey).doSomething()
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export function testable<T extends { new(...args: any[]): {} }>(target: T): T {
|
|
44
|
+
const key = new GGLocatorKey<InstanceType<T>>(LOCATOR_KEY_PREFIX_FOR_TESTABLE + target.name);
|
|
45
|
+
|
|
46
|
+
// Create a new class that extends the target and registers on construction
|
|
47
|
+
const wrappedClass = class extends (target as any) {
|
|
48
|
+
constructor(...args: any[]) {
|
|
49
|
+
super(...args);
|
|
50
|
+
const scope = GGLocator.tryGetScope();
|
|
51
|
+
if (scope) {
|
|
52
|
+
if (scope.has(key)) {
|
|
53
|
+
// First registration wins - log warning and skip
|
|
54
|
+
// Using console.warn as GGLog may not be available in all contexts
|
|
55
|
+
console.warn(
|
|
56
|
+
`[@testable] Instance already registered for '${key.name}'. ` +
|
|
57
|
+
`First registration wins. If you need multiple instances, register them manually with custom keys.`
|
|
58
|
+
);
|
|
59
|
+
} else {
|
|
60
|
+
scope.set(key, this as InstanceType<T>);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// Preserve class name for debugging and key generation
|
|
67
|
+
Object.defineProperty(wrappedClass, 'name', {value: target.name});
|
|
68
|
+
|
|
69
|
+
// Copy static properties
|
|
70
|
+
for (const prop of Object.getOwnPropertyNames(target)) {
|
|
71
|
+
if (prop !== 'prototype' && prop !== 'name' && prop !== 'length') {
|
|
72
|
+
const descriptor = Object.getOwnPropertyDescriptor(target, prop);
|
|
73
|
+
if (descriptor) {
|
|
74
|
+
Object.defineProperty(wrappedClass, prop, descriptor);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return wrappedClass as T;
|
|
80
|
+
}
|