@delance/runtime 2026.2.103 → 2026.2.105
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/install.mjs +5947 -4885
- package/install.mjs.map +4 -4
- package/main.mjs +3 -6
- package/package.json +5 -8
- package/dist/langserver.cjs +0 -3
- package/main.mjs.map +0 -7
package/install.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["https://jsr.io/@std/async/1.3.0/delay.ts", "https://jsr.io/@std/async/1.3.0/mux_async_iterator.ts", "https://jsr.io/@std/async/1.3.0/pool.ts", "https://jsr.io/@std/async/1.3.0/_util.ts", "https://jsr.io/@std/async/1.3.0/retry.ts", "https://jsr.io/@std/assert/1.0.19/assertion_error.ts", "https://jsr.io/@std/assert/1.0.19/equal.ts", "https://jsr.io/@std/internal/1.0.13/format.ts", "https://jsr.io/@std/internal/1.0.13/styles.ts", "https://jsr.io/@std/internal/1.0.13/build_message.ts", "https://jsr.io/@std/internal/1.0.13/diff.ts", "https://jsr.io/@std/internal/1.0.13/diff_str.ts", "https://jsr.io/@std/assert/1.0.19/equals.ts", "https://jsr.io/@std/assert/1.0.19/exists.ts", "https://jsr.io/@std/assert/1.0.19/instance_of.ts", "https://jsr.io/@std/assert/1.0.19/assert.ts", "https://jsr.io/@std/internal/1.0.13/_os.ts", "https://jsr.io/@std/internal/1.0.13/os.ts", "https://jsr.io/@std/path/1.1.4/_common/assert_path.ts", "https://jsr.io/@std/path/1.1.4/_common/from_file_url.ts", "https://jsr.io/@std/path/1.1.4/posix/from_file_url.ts", "https://jsr.io/@std/path/1.1.4/_common/strip_trailing_separators.ts", "https://jsr.io/@std/path/1.1.4/posix/_util.ts", "https://jsr.io/@std/path/1.1.4/windows/_util.ts", "https://jsr.io/@std/path/1.1.4/windows/from_file_url.ts", "https://jsr.io/@std/path/1.1.4/_common/dirname.ts", "https://jsr.io/@std/path/1.1.4/posix/dirname.ts", "https://jsr.io/@std/path/1.1.4/windows/dirname.ts", "https://jsr.io/@std/path/1.1.4/dirname.ts", "https://jsr.io/@std/path/1.1.4/_common/normalize.ts", "https://jsr.io/@std/path/1.1.4/_common/normalize_string.ts", "https://jsr.io/@std/path/1.1.4/posix/normalize.ts", "https://jsr.io/@std/path/1.1.4/windows/normalize.ts", "https://jsr.io/@std/path/1.1.4/normalize.ts", "https://jsr.io/@std/fs/1.0.23/_utils.ts", "https:https://jsr.io/@std/fs/1.0.23/unstable_errors.js", "https://jsr.io/@std/fs/1.0.23/_map_error.ts", "https://jsr.io/@std/fs/1.0.23/unstable_mkdir.ts", "https://jsr.io/@std/fs/1.0.23/_to_file_info.ts", "https://jsr.io/@std/fs/1.0.23/unstable_stat.ts", "https://jsr.io/@std/fs/1.0.23/_get_fs_flag.ts", "https://jsr.io/@std/fs/1.0.23/unstable_write_file.ts", "https://jsr.io/@std/fs/1.0.23/unstable_write_text_file.ts", "https://jsr.io/@codemod/utils/2.2.1/export/babel-generator.ts", "https://jsr.io/@codemod/utils/2.2.1/export/babel-traverse.ts", "https://jsr.io/@codemod/parser/2.1.0/mod.ts", "https://jsr.io/@codemod/parser/2.1.0/lib/options.ts", "https://jsr.io/@delance/builder/0.4.0/utils/ast.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/ast-utils/transform.ts", "https://jsr.io/@codemod/utils/2.2.1/export/babel-types.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anyExpression.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/Matcher.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/utils/distributeAcrossSlices.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anything.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/slice.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anyList.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anyNode.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anyStatement.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anyString.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/arrayOf.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/capture.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/containerOf.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/fromCapture.ts", "https://jsr.io/@codemod/utils/2.2.1/lib/builders.ts", "https://jsr.io/@codemod/utils/2.2.1/lib/js.ts", "https://jsr.io/@codemod/utils/2.2.1/lib/NodeTypes.ts", "https://jsr.io/@codemod/utils/2.2.1/lib/nodesEquivalent.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/function.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/tupleOf.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/generated.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/or.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/predicate.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/ast-utils/matcher.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/transpile/default-parameters.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/transpile/logical-assignments.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/transpile/nullish-coalescing-assignment.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/transpile/nullish-coalescing.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/transpile/optional-chaining.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/transpile/template-literals.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/transpile/mod.ts", "https://jsr.io/@codemod/utils/2.2.1/export/babel-template.ts", "https://jsr.io/@delance/builder/0.4.0/utils/matchers/chunk.ts", "https://jsr.io/@delance/builder/0.4.0/transform/delance/antifeature.ts", "https://jsr.io/@delance/builder/0.4.0/utils/crypto.ts", "https://jsr.io/@std/encoding/1.0.10/_validate_binary_like.ts", "https://jsr.io/@std/encoding/1.0.10/_common32.ts", "https://jsr.io/@std/encoding/1.0.10/_common_detach.ts", "https://jsr.io/@std/encoding/1.0.10/base32.ts", "https://jsr.io/@std/encoding/1.0.10/base58.ts", "https://jsr.io/@std/encoding/1.0.10/_common64.ts", "https://jsr.io/@std/encoding/1.0.10/base64.ts", "https://jsr.io/@std/encoding/1.0.10/base64url.ts", "https://jsr.io/@std/encoding/1.0.10/_common16.ts", "https://jsr.io/@std/encoding/1.0.10/hex.ts", "https://jsr.io/@std/encoding/1.0.10/varint.ts", "https://jsr.io/@delance/builder/0.4.0/transform/delance/stringaes.ts", "https://jsr.io/@delance/builder/0.4.0/transform/delance/mod.ts", "https://jsr.io/@delance/builder/0.4.0/transform/esmodule/indirect-call.ts", "https://jsr.io/@delance/builder/0.4.0/utils/matchers/createBinding.ts", "https://jsr.io/@delance/builder/0.4.0/utils/matchers/exportStar.ts", "https://jsr.io/@delance/builder/0.4.0/utils/matchers/importDefault.ts", "https://jsr.io/@delance/builder/0.4.0/utils/matchers/importStar.ts", "https://jsr.io/@delance/builder/0.4.0/utils/matchers/setModuleDefault.ts", "https://jsr.io/@delance/builder/0.4.0/transform/esmodule/module-helper.ts", "https://jsr.io/@delance/builder/0.4.0/transform/esmodule/mod.ts", "https://jsr.io/@delance/builder/0.4.0/transform/webcrack.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/mod.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/merge-strings.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/array-rotator.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/ast-utils/ast.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/ast-utils/inline.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/control-flow-object.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/control-flow-switch.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/ast-utils/generator.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/ast-utils/rename.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/dead-code.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/decoder.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/inline-decoded-strings.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/inline-decoder-wrappers.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/inline-object-props.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/string-array.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/vm.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/merge-object-assignments.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/self-defending.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/block-statements.ts", "https://jsr.io/@codemod/utils/2.2.1/export/babel-helper-validator-identifier.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/computed-properties.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/for-to-while.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/infinity.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/invert-boolean-logic.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/json-parse.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/logical-to-if.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/merge-else-if.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/number-expressions.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/raw-literals.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/remove-double-not.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/sequence.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/split-for-loop-vars.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/split-variable-declarations.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/string-literal-in-template.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/ternary-to-if.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/truncate-number-literal.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/typeof-undefined.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/unary-expressions.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/unminify-booleans.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/void-to-undefined.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/yoda.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/unminify/mod.ts", "https://jsr.io/@delance/builder/0.4.0/webcrack/deobfuscate/evaluate-globals.ts", "https://jsr.io/@delance/builder/0.4.0/transform/mod.ts", "https://jsr.io/@delance/builder/0.4.0/mod.ts", "../install.mts", "../utils.mts", "https://jsr.io/@std/fs/1.0.23/unstable_read_file.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/** Options for {@linkcode delay}. */\nexport interface DelayOptions {\n /** Signal used to abort the delay. */\n signal?: AbortSignal;\n /** Indicates whether the process should continue to run as long as the timer exists.\n *\n * @default {true}\n */\n persistent?: boolean;\n}\n\n// Make type available in browser environments; we catch the `ReferenceError` below\ndeclare const Deno: { unrefTimer(id: number): void };\n\n/**\n * Resolve a {@linkcode Promise} after a given amount of milliseconds.\n *\n * If the optional signal is aborted before the delay duration, the returned\n * promise rejects with the signal's reason. If no reason is provided to\n * `abort()`, the browser's default `DOMException` with name `\"AbortError\"` is used.\n *\n * @param ms Duration in milliseconds for how long the delay should last.\n * @param options Additional options.\n *\n * @example Basic usage\n * ```ts no-assert\n * import { delay } from \"@std/async/delay\";\n *\n * // ...\n * const delayedPromise = delay(100);\n * const result = await delayedPromise;\n * // ...\n * ```\n *\n * @example Disable persistence\n *\n * Setting `persistent` to `false` will allow the process to continue to run as\n * long as the timer exists.\n *\n * ```ts no-assert ignore\n * import { delay } from \"@std/async/delay\";\n *\n * // ...\n * await delay(100, { persistent: false });\n * // ...\n * ```\n */\nexport function delay(ms: number, options: DelayOptions = {}): Promise<void> {\n const { signal, persistent = true } = options;\n if (signal?.aborted) return Promise.reject(signal.reason);\n return new Promise((resolve, reject) => {\n const abort = () => {\n clearTimeout(+i);\n reject(signal?.reason);\n };\n const done = () => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n };\n const i = setArbitraryLengthTimeout(done, ms);\n signal?.addEventListener(\"abort\", abort, { once: true });\n if (persistent === false) {\n try {\n Deno.unrefTimer(+i);\n } catch (error) {\n if (!(error instanceof ReferenceError)) {\n clearTimeout(+i);\n throw error;\n }\n // deno-lint-ignore no-console\n console.error(\"`persistent` option is only available in Deno\");\n }\n }\n });\n}\n\nconst I32_MAX = 2 ** 31 - 1;\n\nfunction setArbitraryLengthTimeout(\n callback: () => void,\n delay: number,\n): { valueOf(): number } {\n // ensure non-negative integer (but > I32_MAX is OK, even if Infinity)\n delay = Math.trunc(Math.max(delay, 0) || 0);\n\n if (delay <= I32_MAX) {\n const id = Number(setTimeout(callback, delay));\n return { valueOf: () => id };\n }\n\n const start = Date.now();\n let timeoutId: number;\n\n const queueTimeout = () => {\n const currentDelay = delay - (Date.now() - start);\n timeoutId = currentDelay > I32_MAX\n ? Number(setTimeout(queueTimeout, I32_MAX))\n : Number(setTimeout(callback, currentDelay));\n };\n\n queueTimeout();\n\n return { valueOf: () => timeoutId };\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\ninterface TaggedYieldedValue<T> {\n iterator: AsyncIterator<T>;\n value: T;\n}\n\n/**\n * Multiplexes multiple async iterators into a single stream. It currently\n * makes an assumption that the final result (the value returned and not\n * yielded from the iterator) does not matter; if there is any result, it is\n * discarded.\n *\n * @example Usage\n * ```ts\n * import { MuxAsyncIterator } from \"@std/async/mux-async-iterator\";\n * import { assertEquals } from \"@std/assert\";\n *\n * async function* gen123(): AsyncIterableIterator<number> {\n * yield 1;\n * yield 2;\n * yield 3;\n * }\n *\n * async function* gen456(): AsyncIterableIterator<number> {\n * yield 4;\n * yield 5;\n * yield 6;\n * }\n *\n * const mux = new MuxAsyncIterator<number>();\n * mux.add(gen123());\n * mux.add(gen456());\n *\n * const result = await Array.fromAsync(mux);\n *\n * assertEquals(result, [1, 4, 2, 5, 3, 6]);\n * ```\n *\n * @typeParam T The type of the provided async iterables and generated async iterable.\n */\nexport class MuxAsyncIterator<T> implements AsyncIterable<T> {\n #iteratorCount = 0;\n #yields: Array<TaggedYieldedValue<T>> = [];\n // deno-lint-ignore no-explicit-any\n #throws: any[] = [];\n #signal = Promise.withResolvers<void>();\n\n /**\n * Add an async iterable to the stream.\n *\n * @param iterable The async iterable to add.\n *\n * @example Usage\n * ```ts\n * import { MuxAsyncIterator } from \"@std/async/mux-async-iterator\";\n * import { assertEquals } from \"@std/assert\";\n *\n * async function* gen123(): AsyncIterableIterator<number> {\n * yield 1;\n * yield 2;\n * yield 3;\n * }\n *\n * const mux = new MuxAsyncIterator<number>();\n * mux.add(gen123());\n *\n * const result = await Array.fromAsync(mux.iterate());\n *\n * assertEquals(result, [1, 2, 3]);\n * ```\n */\n add(iterable: AsyncIterable<T>) {\n ++this.#iteratorCount;\n this.#callIteratorNext(iterable[Symbol.asyncIterator]());\n }\n\n async #callIteratorNext(\n iterator: AsyncIterator<T>,\n ) {\n try {\n const { value, done } = await iterator.next();\n if (done) {\n --this.#iteratorCount;\n } else {\n this.#yields.push({ iterator, value });\n }\n } catch (e) {\n this.#throws.push(e);\n }\n this.#signal.resolve();\n }\n\n /**\n * Returns an async iterator of the stream.\n * @returns the async iterator for all the added async iterables.\n *\n * @example Usage\n * ```ts\n * import { MuxAsyncIterator } from \"@std/async/mux-async-iterator\";\n * import { assertEquals } from \"@std/assert\";\n *\n * async function* gen123(): AsyncIterableIterator<number> {\n * yield 1;\n * yield 2;\n * yield 3;\n * }\n *\n * const mux = new MuxAsyncIterator<number>();\n * mux.add(gen123());\n *\n * const result = await Array.fromAsync(mux.iterate());\n *\n * assertEquals(result, [1, 2, 3]);\n * ```\n */\n async *iterate(): AsyncIterableIterator<T> {\n while (this.#iteratorCount > 0) {\n // Sleep until any of the wrapped iterators yields.\n await this.#signal.promise;\n\n // Note that while we're looping over `yields`, new items may be added.\n for (const { iterator, value } of this.#yields) {\n yield value;\n this.#callIteratorNext(iterator);\n }\n\n if (this.#throws.length) {\n for (const e of this.#throws) {\n throw e;\n }\n }\n // Clear the `yields` list and reset the `signal` promise.\n this.#yields.length = 0;\n this.#signal = Promise.withResolvers<void>();\n }\n }\n\n /**\n * Implements an async iterator for the stream.\n * @returns the async iterator for all the added async iterables.\n *\n * @example Usage\n * ```ts\n * import { MuxAsyncIterator } from \"@std/async/mux-async-iterator\";\n * import { assertEquals } from \"@std/assert\";\n *\n * async function* gen123(): AsyncIterableIterator<number> {\n * yield 1;\n * yield 2;\n * yield 3;\n * }\n *\n * const mux = new MuxAsyncIterator<number>();\n * mux.add(gen123());\n *\n * const result = await Array.fromAsync(mux);\n *\n * assertEquals(result, [1, 2, 3]);\n * ```\n */\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return this.iterate();\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/** Error message emitted from the thrown error while mapping. */\nconst ERROR_WHILE_MAPPING_MESSAGE =\n \"Cannot complete the mapping as an error was thrown from an item\";\n\n/**\n * pooledMap transforms values from an (async) iterable into another async\n * iterable. The transforms are done concurrently, with a max concurrency\n * defined by the poolLimit.\n *\n * If an error is thrown from `iterableFn`, no new transformations will begin.\n * All currently executing transformations are allowed to finish and still\n * yielded on success. After that, the rejections among them are gathered and\n * thrown by the iterator in an `AggregateError`.\n *\n * @example Usage\n * ```ts\n * import { pooledMap } from \"@std/async/pool\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const results = pooledMap(\n * 2,\n * [1, 2, 3],\n * (i) => new Promise((r) => setTimeout(() => r(i), 1000)),\n * );\n *\n * assertEquals(await Array.fromAsync(results), [1, 2, 3]);\n * ```\n *\n * @typeParam T the input type.\n * @typeParam R the output type.\n * @param poolLimit The maximum count of items being processed concurrently.\n * Must be a positive integer.\n * @param array The input array for mapping.\n * @param iteratorFn The function to call for every item of the array.\n * @returns The async iterator with the transformed values.\n * @throws {RangeError} If `poolLimit` is not a positive integer.\n */\nexport function pooledMap<T, R>(\n poolLimit: number,\n array: Iterable<T> | AsyncIterable<T>,\n iteratorFn: (data: T) => Promise<R>,\n): AsyncIterableIterator<R> {\n if (!Number.isInteger(poolLimit) || poolLimit < 1) {\n throw new RangeError(\"'poolLimit' must be a positive integer\");\n }\n\n const res = new TransformStream<Promise<R>, R>({\n async transform(\n p: Promise<R>,\n controller: TransformStreamDefaultController<R>,\n ) {\n try {\n const s = await p;\n controller.enqueue(s);\n } catch (e) {\n if (\n e instanceof AggregateError &&\n e.message === ERROR_WHILE_MAPPING_MESSAGE\n ) {\n controller.error(e as unknown);\n }\n }\n },\n });\n // Start processing items from the iterator\n (async () => {\n const writer = res.writable.getWriter();\n const executing: Array<Promise<unknown>> = [];\n try {\n for await (const item of array) {\n const p = Promise.resolve().then(() => iteratorFn(item));\n // Only write on success. If we `writer.write()` a rejected promise,\n // that will end the iteration. We don't want that yet. Instead let it\n // fail the race, taking us to the catch block where all currently\n // executing jobs are allowed to finish and all rejections among them\n // can be reported together.\n writer.write(p);\n const e: Promise<unknown> = p.then(() =>\n executing.splice(executing.indexOf(e), 1)\n );\n executing.push(e);\n if (executing.length >= poolLimit) {\n await Promise.race(executing);\n }\n }\n // Wait until all ongoing events have processed, then close the writer.\n await Promise.all(executing);\n writer.close();\n } catch {\n const errors = [];\n for (const result of await Promise.allSettled(executing)) {\n if (result.status === \"rejected\") {\n errors.push(result.reason);\n }\n }\n writer.write(Promise.reject(\n new AggregateError(errors, ERROR_WHILE_MAPPING_MESSAGE),\n )).catch(() => {});\n }\n })();\n // Feature test until browser coverage is adequate\n return Symbol.asyncIterator in res.readable &&\n typeof res.readable[Symbol.asyncIterator] === \"function\"\n ? (res.readable[Symbol.asyncIterator] as () => AsyncIterableIterator<R>)()\n : (async function* () {\n const reader = res.readable.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield value;\n }\n reader.releaseLock();\n })();\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nexport function exponentialBackoffWithJitter(\n cap: number,\n base: number,\n attempt: number,\n multiplier: number,\n jitter: number,\n) {\n const exp = Math.min(cap, base * multiplier ** attempt);\n return (1 - jitter * Math.random()) * exp;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { delay } from \"./delay.ts\";\nimport { exponentialBackoffWithJitter } from \"./_util.ts\";\n\n/**\n * Error thrown in {@linkcode retry} once the maximum number of failed attempts\n * has been reached.\n *\n * @example Usage\n * ```ts no-assert ignore\n * import { RetryError } from \"@std/async/retry\";\n *\n * throw new RetryError({ foo: \"bar\" }, 3);\n * ```\n */\nexport class RetryError extends Error {\n /**\n * Constructs a new {@linkcode RetryError} instance.\n *\n * @param cause the cause for this error.\n * @param attempts the number of retry attempts made.\n */\n constructor(cause: unknown, attempts: number) {\n super(`Retrying exceeded the maxAttempts (${attempts}).`);\n this.name = \"RetryError\";\n this.cause = cause;\n }\n}\n\n/** Options for {@linkcode retry}. */\nexport interface RetryOptions {\n /**\n * How much to backoff after each retry.\n *\n * @default {2}\n */\n multiplier?: number;\n /**\n * The maximum milliseconds between attempts.\n *\n * @default {60000}\n */\n maxTimeout?: number;\n /**\n * The maximum amount of attempts until failure.\n *\n * @default {5}\n */\n maxAttempts?: number;\n /**\n * The initial and minimum amount of milliseconds between attempts.\n *\n * @default {1000}\n */\n minTimeout?: number;\n /**\n * Amount of jitter to introduce to the time between attempts. This is `1`\n * for full jitter by default.\n *\n * @default {1}\n */\n jitter?: number;\n /**\n * Callback to determine if an error or other thrown value is retriable.\n *\n * @default {() => true}\n *\n * @param err The thrown error or other value.\n * @returns `true` if the error is retriable, `false` otherwise.\n */\n isRetriable?: (err: unknown) => boolean;\n /**\n * An AbortSignal to cancel the retry operation.\n *\n * If the signal is aborted, the retry will stop and reject with the signal's\n * reason. The signal is checked before each attempt and during the delay\n * between attempts.\n *\n * @default {undefined}\n */\n signal?: AbortSignal;\n}\n\n/**\n * Calls the given (possibly asynchronous) function up to `maxAttempts` times.\n * Retries as long as the given function throws. If the attempts are exhausted,\n * throws a {@linkcode RetryError} with `cause` set to the inner exception.\n *\n * The backoff is calculated by multiplying `minTimeout` with `multiplier` to the power of the current attempt counter (starting at 0 up to `maxAttempts - 1`). It is capped at `maxTimeout` however.\n * How long the actual delay is, depends on `jitter`.\n *\n * When `jitter` is the default value of `1`, waits between two attempts for a\n * randomized amount between 0 and the backoff time. With the default options\n * the maximal delay will be `15s = 1s + 2s + 4s + 8s`. If all five attempts\n * are exhausted the mean delay will be `9.5s = ½(4s + 15s)`.\n *\n * When `jitter` is `0`, waits the full backoff time.\n *\n * @example Example configuration 1\n * ```ts no-assert\n * import { retry } from \"@std/async/retry\";\n * const req = async () => {\n * // some function that throws sometimes\n * };\n *\n * // Below resolves to the first non-error result of `req`\n * const retryPromise = await retry(req, {\n * multiplier: 2,\n * maxTimeout: 60000,\n * maxAttempts: 5,\n * minTimeout: 100,\n * jitter: 1,\n * });\n * ```\n *\n * @example Example configuration 2\n * ```ts no-assert\n * import { retry } from \"@std/async/retry\";\n * const req = async () => {\n * // some function that throws sometimes\n * };\n *\n * // Make sure we wait at least 1 minute, but at most 2 minutes\n * const retryPromise = await retry(req, {\n * multiplier: 2.34,\n * maxTimeout: 80000,\n * maxAttempts: 7,\n * minTimeout: 1000,\n * jitter: 0.5,\n * });\n * ```\n *\n * @example Only retry on specific error types\n * ```ts no-assert\n * import { retry } from \"@std/async/retry\";\n *\n * class HttpError extends Error {\n * status: number;\n * constructor(status: number) {\n * super(`HTTP ${status}`);\n * this.status = status;\n * }\n * }\n *\n * const req = async () => {\n * // some function that throws HttpError\n * };\n *\n * // Only retry on 429 (rate limit) or 5xx (server) errors\n * const retryPromise = await retry(req, {\n * isRetriable: (err) =>\n * err instanceof HttpError && (err.status === 429 || err.status >= 500),\n * });\n * ```\n *\n * @typeParam T The return type of the function to retry and returned promise.\n * @param fn The function to retry.\n * @param options Additional options.\n * @returns The promise that resolves with the value returned by the function to retry.\n * @throws {RetryError} If the function fails after `maxAttempts` attempts.\n * @throws If the `signal` is aborted, throws the signal's reason.\n * @throws If `isRetriable` returns `false` for an error, throws that error immediately.\n */\nexport async function retry<T>(\n fn: (() => Promise<T>) | (() => T),\n options?: RetryOptions,\n): Promise<T> {\n const {\n multiplier = 2,\n maxTimeout = 60000,\n maxAttempts = 5,\n minTimeout = 1000,\n jitter = 1,\n isRetriable = () => true,\n signal,\n } = options ?? {};\n\n if (!Number.isInteger(maxAttempts) || maxAttempts < 1) {\n throw new RangeError(\n `Cannot retry as 'maxAttempts' must be a positive integer: current value is ${maxAttempts}`,\n );\n }\n if (!Number.isFinite(multiplier) || multiplier < 1) {\n throw new RangeError(\n `Cannot retry as 'multiplier' must be a finite number >= 1: current value is ${multiplier}`,\n );\n }\n if (Number.isNaN(maxTimeout) || maxTimeout <= 0) {\n throw new RangeError(\n `Cannot retry as 'maxTimeout' must be a positive number: current value is ${maxTimeout}`,\n );\n }\n if (Number.isNaN(minTimeout) || minTimeout < 0) {\n throw new RangeError(\n `Cannot retry as 'minTimeout' must be >= 0: current value is ${minTimeout}`,\n );\n }\n if (minTimeout > maxTimeout) {\n throw new RangeError(\n `Cannot retry as 'minTimeout' must be <= 'maxTimeout': current values 'minTimeout=${minTimeout}', 'maxTimeout=${maxTimeout}'`,\n );\n }\n if (Number.isNaN(jitter) || jitter < 0 || jitter > 1) {\n throw new RangeError(\n `Cannot retry as 'jitter' must be between 0 and 1: current value is ${jitter}`,\n );\n }\n\n let attempt = 0;\n while (true) {\n signal?.throwIfAborted();\n\n try {\n return await fn();\n } catch (error) {\n if (!isRetriable(error)) {\n throw error;\n }\n\n if (attempt + 1 >= maxAttempts) {\n throw new RetryError(error, maxAttempts);\n }\n\n const timeout = exponentialBackoffWithJitter(\n maxTimeout,\n minTimeout,\n attempt,\n multiplier,\n jitter,\n );\n await delay(timeout, signal ? { signal } : undefined);\n }\n attempt++;\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/**\n * Error thrown when an assertion fails.\n *\n * @example Usage\n * ```ts ignore\n * import { AssertionError } from \"@std/assert\";\n *\n * try {\n * throw new AssertionError(\"foo\", { cause: \"bar\" });\n * } catch (error) {\n * if (error instanceof AssertionError) {\n * error.message === \"foo\"; // true\n * error.cause === \"bar\"; // true\n * }\n * }\n * ```\n */\nexport class AssertionError extends Error {\n /** Constructs a new instance.\n *\n * @param message The error message.\n * @param options Additional options. This argument is still unstable. It may change in the future release.\n */\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"AssertionError\";\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\ntype KeyedCollection = Set<unknown> | Map<unknown, unknown>;\nfunction isKeyedCollection(x: unknown): x is KeyedCollection {\n return x instanceof Set || x instanceof Map;\n}\n\nfunction prototypesEqual(a: object, b: object) {\n const pa = Object.getPrototypeOf(a);\n const pb = Object.getPrototypeOf(b);\n return pa === pb ||\n pa === Object.prototype && pb === null ||\n pa === null && pb === Object.prototype;\n}\n\nfunction isBasicObjectOrArray(obj: object) {\n const proto = Object.getPrototypeOf(obj);\n return proto === null || proto === Object.prototype ||\n proto === Array.prototype;\n}\n\n// Slightly faster than Reflect.ownKeys in V8 as of 12.9.202.13-rusty (2024-10-28)\nfunction ownKeys(obj: object) {\n return [\n ...Object.getOwnPropertyNames(obj),\n ...Object.getOwnPropertySymbols(obj),\n ];\n}\n\nfunction getKeysDeep(obj: object) {\n const keys = new Set<string | symbol>();\n\n while (obj !== Object.prototype && obj !== Array.prototype && obj != null) {\n for (const key of ownKeys(obj)) {\n keys.add(key);\n }\n obj = Object.getPrototypeOf(obj);\n }\n\n return keys;\n}\n\n// deno-lint-ignore no-explicit-any\nconst Temporal = (globalThis as any).Temporal ?? Object.create(null);\n\n/** A non-exhaustive list of prototypes that can be accurately fast-path compared with `String(instance)` */\nconst stringComparablePrototypes = new Set<unknown>(\n [\n Intl.Locale,\n RegExp,\n Temporal.Duration,\n Temporal.Instant,\n Temporal.PlainDate,\n Temporal.PlainDateTime,\n Temporal.PlainTime,\n Temporal.PlainYearMonth,\n Temporal.PlainMonthDay,\n Temporal.ZonedDateTime,\n URL,\n URLSearchParams,\n ].filter((x) => x != null).map((x) => x.prototype),\n);\n\nfunction isPrimitive(x: unknown) {\n return typeof x === \"string\" ||\n typeof x === \"number\" ||\n typeof x === \"boolean\" ||\n typeof x === \"bigint\" ||\n typeof x === \"symbol\" ||\n x == null;\n}\n\ntype TypedArray = Pick<Uint8Array | BigUint64Array, \"length\" | number>;\nconst TypedArray = Object.getPrototypeOf(Uint8Array);\nfunction compareTypedArrays(a: TypedArray, b: TypedArray) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < b.length; i++) {\n if (!sameValueZero(a[i], b[i])) return false;\n }\n return true;\n}\n\n/** Check both strict equality (`0 == -0`) and `Object.is` (`NaN == NaN`) */\nfunction sameValueZero(a: unknown, b: unknown) {\n return a === b || Object.is(a, b);\n}\n\n/**\n * Deep equality comparison used in assertions.\n *\n * This function is based on value equality, but for some cases (such as data\n * that can only be read asynchronously or function properties) value equality\n * is not possible to determine. In such cases, reference equality is used\n * instead, which may cause false negatives for objects such as `Blob`s or\n * `Request`s.\n *\n * @param a The actual value\n * @param b The expected value\n * @returns `true` if the values are deeply equal, `false` otherwise\n *\n * @throws {TypeError} If either value is a `WeakMap` or `WeakSet`.\n *\n * @example Usage\n * ```ts\n * import { equal } from \"@std/assert/equal\";\n *\n * equal({ foo: \"bar\" }, { foo: \"bar\" }); // Returns `true`\n * equal({ foo: \"bar\" }, { foo: \"baz\" }); // Returns `false`\n * ```\n */\nexport function equal(a: unknown, b: unknown): boolean {\n const seen = new Map<unknown, unknown>();\n return (function compare(a: unknown, b: unknown): boolean {\n if (sameValueZero(a, b)) return true;\n if (isPrimitive(a) || isPrimitive(b)) return false;\n\n if (a instanceof Date && b instanceof Date) {\n return Object.is(a.getTime(), b.getTime());\n }\n if (a && typeof a === \"object\" && b && typeof b === \"object\") {\n if (!prototypesEqual(a, b)) {\n return false;\n }\n if (a instanceof TypedArray) {\n return compareTypedArrays(a as TypedArray, b as TypedArray);\n }\n if (\n a instanceof ArrayBuffer ||\n (globalThis.SharedArrayBuffer && a instanceof SharedArrayBuffer)\n ) {\n return compareTypedArrays(\n new Uint8Array(a),\n new Uint8Array(b as ArrayBuffer | SharedArrayBuffer),\n );\n }\n if (a instanceof WeakMap) {\n throw new TypeError(\"Cannot compare WeakMap instances\");\n }\n if (a instanceof WeakSet) {\n throw new TypeError(\"Cannot compare WeakSet instances\");\n }\n if (a instanceof WeakRef) {\n return compare(a.deref(), (b as WeakRef<WeakKey>).deref());\n }\n if (seen.get(a) === b) {\n return true;\n }\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n seen.set(a, b);\n if (isKeyedCollection(a) && isKeyedCollection(b)) {\n if (a.size !== b.size) {\n return false;\n }\n\n const aKeys = [...a.keys()];\n const primitiveKeysFastPath = aKeys.every(isPrimitive);\n if (primitiveKeysFastPath) {\n if (a instanceof Set) {\n return a.symmetricDifference(b).size === 0;\n }\n\n for (const key of aKeys) {\n if (\n !b.has(key) ||\n !compare(a.get(key), (b as Map<unknown, unknown>).get(key))\n ) {\n return false;\n }\n }\n return true;\n }\n\n let unmatchedEntries = a.size;\n\n for (const [aKey, aValue] of a.entries()) {\n for (const [bKey, bValue] of b.entries()) {\n /* Given that Map keys can be references, we need\n * to ensure that they are also deeply equal */\n\n if (!compare(aKey, bKey)) continue;\n\n if (\n (aKey === aValue && bKey === bValue) ||\n (compare(aValue, bValue))\n ) {\n unmatchedEntries--;\n break;\n }\n }\n }\n\n return unmatchedEntries === 0;\n }\n\n let keys: Iterable<string | symbol>;\n\n if (isBasicObjectOrArray(a)) {\n // fast path\n keys = ownKeys({ ...a, ...b });\n } else if (stringComparablePrototypes.has(Object.getPrototypeOf(a))) {\n // medium path\n return String(a) === String(b);\n } else {\n // slow path\n keys = getKeysDeep(a).union(getKeysDeep(b));\n }\n\n for (const key of keys) {\n type Key = keyof typeof a;\n if (!compare(a[key as Key], b[key as Key])) {\n return false;\n }\n if (((key in a) && (!(key in b))) || ((key in b) && (!(key in a)))) {\n return false;\n }\n }\n return true;\n }\n return false;\n })(a, b);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/** An inspect function conforming to the shape of `Deno.inspect` and `node:util`'s `inspect` */\nexport type InspectFn = (\n v: unknown,\n options: {\n depth: number;\n sorted: boolean;\n trailingComma: boolean;\n compact: boolean;\n iterableLimit: number;\n getters: boolean;\n strAbbreviateSize: number;\n },\n) => string;\n\n/**\n * Converts the input into a string. Objects, Sets and Maps are sorted so as to\n * make tests less flaky.\n *\n * @param v Value to be formatted\n *\n * @returns The formatted string\n *\n * @example Usage\n * ```ts\n * import { format } from \"@std/internal/format\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(format({ a: 1, b: 2 }), \"{\\n a: 1,\\n b: 2,\\n}\");\n * assertEquals(format(new Set([1, 2])), \"Set(2) {\\n 1,\\n 2,\\n}\");\n * assertEquals(format(new Map([[1, 2]])), \"Map(1) {\\n 1 => 2,\\n}\");\n * ```\n */\nexport function format(v: unknown): string {\n // deno-lint-ignore no-explicit-any\n const { Deno, process } = globalThis as any;\n\n const inspect: InspectFn | undefined = Deno?.inspect ??\n process?.getBuiltinModule?.(\"node:util\")?.inspect;\n\n return typeof inspect === \"function\"\n ? inspect(v, {\n depth: Infinity,\n sorted: true,\n trailingComma: true,\n compact: false,\n iterableLimit: Infinity,\n // getters should be true in assertEquals.\n getters: true,\n strAbbreviateSize: Infinity,\n })\n : basicInspect(v);\n}\n\nconst formatters: ((v: unknown) => string | undefined)[] = [\n (v) => {\n if (typeof v === \"undefined\") return \"undefined\";\n if (typeof v === \"bigint\") return `${v}n`;\n\n if (\n typeof v === \"string\" ||\n typeof v === \"number\" ||\n typeof v === \"boolean\" ||\n v === null ||\n Array.isArray(v) ||\n [null, Object.prototype].includes(Object.getPrototypeOf(v))\n ) {\n return JSON.stringify(v, null, 2);\n }\n },\n (v) => String(v),\n (v) => Object.prototype.toString.call(v),\n];\n\n// for environments lacking both `Deno.inspect` and `process.inspect`\nfunction basicInspect(v: unknown): string {\n for (const fmt of formatters) {\n try {\n const result = fmt(v);\n if (typeof result === \"string\") return result;\n } catch { /* try the next one */ }\n }\n\n return \"[[Unable to format value]]\";\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n// A module to print ANSI terminal colors. Inspired by chalk, kleur, and colors\n// on npm.\n\n// This code is vendored from `fmt/colors.ts`.\n\n// deno-lint-ignore no-explicit-any\nconst { Deno } = globalThis as any;\nconst noColor = typeof Deno?.noColor === \"boolean\"\n ? Deno.noColor as boolean\n : false;\n\ninterface Code {\n open: string;\n close: string;\n regexp: RegExp;\n}\n\nconst enabled = !noColor;\n\nfunction code(open: number[], close: number): Code {\n return {\n open: `\\x1b[${open.join(\";\")}m`,\n close: `\\x1b[${close}m`,\n regexp: new RegExp(`\\\\x1b\\\\[${close}m`, \"g\"),\n };\n}\n\nfunction run(str: string, code: Code): string {\n return enabled\n ? `${code.open}${str.replace(code.regexp, code.open)}${code.close}`\n : str;\n}\n\n/**\n * Sets the style of text to be printed to bold.\n *\n * Disable by setting the `NO_COLOR` environmental variable.\n *\n * @param str Text to make bold\n *\n * @returns Bold text for printing\n *\n * @example Usage\n * ```ts no-assert\n * import { bold } from \"@std/internal/styles\";\n *\n * console.log(bold(\"Hello, world!\")); // Prints \"Hello, world!\" in bold\n * ```\n */\nexport function bold(str: string): string {\n return run(str, code([1], 22));\n}\n\n/**\n * Sets the color of text to be printed to red.\n *\n * Disable by setting the `NO_COLOR` environmental variable.\n *\n * @param str Text to make red\n *\n * @returns Red text for printing\n *\n * @example Usage\n * ```ts no-assert\n * import { red } from \"@std/internal/styles\";\n *\n * console.log(red(\"Hello, world!\")); // Prints \"Hello, world!\" in red\n * ```\n */\nexport function red(str: string): string {\n return run(str, code([31], 39));\n}\n\n/**\n * Sets the color of text to be printed to green.\n *\n * Disable by setting the `NO_COLOR` environmental variable.\n *\n * @param str Text to make green\n *\n * @returns Green text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { green } from \"@std/internal/styles\";\n *\n * console.log(green(\"Hello, world!\")); // Prints \"Hello, world!\" in green\n * ```\n */\nexport function green(str: string): string {\n return run(str, code([32], 39));\n}\n\n/**\n * Sets the color of text to be printed to yellow.\n *\n * Disable by setting the `NO_COLOR` environmental variable.\n *\n * @param str Text to make yellow\n *\n * @returns Yellow text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { yellow } from \"@std/internal/styles\";\n *\n * console.log(yellow(\"Hello, world!\")); // Prints \"Hello, world!\" in yellow\n * ```\n */\nexport function yellow(str: string): string {\n return run(str, code([33], 39));\n}\n\n/**\n * Sets the color of text to be printed to white.\n *\n * @param str Text to make white\n *\n * @returns White text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { white } from \"@std/internal/styles\";\n *\n * console.log(white(\"Hello, world!\")); // Prints \"Hello, world!\" in white\n * ```\n */\nexport function white(str: string): string {\n return run(str, code([37], 39));\n}\n\n/**\n * Sets the color of text to be printed to gray.\n *\n * @param str Text to make gray\n *\n * @returns Gray text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { gray } from \"@std/internal/styles\";\n *\n * console.log(gray(\"Hello, world!\")); // Prints \"Hello, world!\" in gray\n * ```\n */\nexport function gray(str: string): string {\n return brightBlack(str);\n}\n\n/**\n * Sets the color of text to be printed to bright-black.\n *\n * @param str Text to make bright-black\n *\n * @returns Bright-black text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { brightBlack } from \"@std/internal/styles\";\n *\n * console.log(brightBlack(\"Hello, world!\")); // Prints \"Hello, world!\" in bright-black\n * ```\n */\nexport function brightBlack(str: string): string {\n return run(str, code([90], 39));\n}\n\n/**\n * Sets the background color of text to be printed to red.\n *\n * @param str Text to make its background red\n *\n * @returns Red background text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { bgRed } from \"@std/internal/styles\";\n *\n * console.log(bgRed(\"Hello, world!\")); // Prints \"Hello, world!\" with red background\n * ```\n */\nexport function bgRed(str: string): string {\n return run(str, code([41], 49));\n}\n\n/**\n * Sets the background color of text to be printed to green.\n *\n * @param str Text to make its background green\n *\n * @returns Green background text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { bgGreen } from \"@std/internal/styles\";\n *\n * console.log(bgGreen(\"Hello, world!\")); // Prints \"Hello, world!\" with green background\n * ```\n */\nexport function bgGreen(str: string): string {\n return run(str, code([42], 49));\n}\n\n// https://github.com/chalk/ansi-regex/blob/02fa893d619d3da85411acc8fd4e2eea0e95a9d9/index.js\nconst ANSI_REGEXP = new RegExp(\n [\n \"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)\",\n \"(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TXZcf-nq-uy=><~]))\",\n ].join(\"|\"),\n \"g\",\n);\n\n/**\n * Remove ANSI escape codes from the string.\n *\n * @param string Text to remove ANSI escape codes from\n *\n * @returns Text without ANSI escape codes\n *\n * @example Usage\n * ```ts no-assert\n * import { red, stripAnsiCode } from \"@std/internal/styles\";\n *\n * console.log(stripAnsiCode(red(\"Hello, world!\"))); // Prints \"Hello, world!\"\n * ```\n */\nexport function stripAnsiCode(string: string): string {\n return string.replace(ANSI_REGEXP, \"\");\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { bgGreen, bgRed, bold, gray, green, red, white } from \"./styles.ts\";\nimport type { DiffResult, DiffType } from \"./types.ts\";\n\n/**\n * Colors the output of assertion diffs.\n *\n * @param diffType Difference type, either added or removed.\n * @param background If true, colors the background instead of the text.\n *\n * @returns A function that colors the input string.\n *\n * @example Usage\n * ```ts\n * import { createColor } from \"@std/internal\";\n * import { assertEquals } from \"@std/assert\";\n * import { bold, green, red, white } from \"@std/fmt/colors\";\n *\n * assertEquals(createColor(\"added\")(\"foo\"), green(bold(\"foo\")));\n * assertEquals(createColor(\"removed\")(\"foo\"), red(bold(\"foo\")));\n * assertEquals(createColor(\"common\")(\"foo\"), white(\"foo\"));\n * ```\n */\nexport function createColor(\n diffType: DiffType,\n /**\n * TODO(@littledivy): Remove this when we can detect true color terminals. See\n * https://github.com/denoland/std/issues/2575.\n */\n background = false,\n): (s: string) => string {\n switch (diffType) {\n case \"added\":\n return (s) => background ? bgGreen(white(s)) : green(bold(s));\n case \"removed\":\n return (s) => background ? bgRed(white(s)) : red(bold(s));\n case \"truncation\":\n return gray;\n default:\n return white;\n }\n}\n\n/**\n * Prefixes `+` or `-` in diff output.\n *\n * @param diffType Difference type, either added or removed\n *\n * @returns A string representing the sign.\n *\n * @example Usage\n * ```ts\n * import { createSign } from \"@std/internal\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(createSign(\"added\"), \"+ \");\n * assertEquals(createSign(\"removed\"), \"- \");\n * assertEquals(createSign(\"common\"), \" \");\n * ```\n */\nexport function createSign(diffType: DiffType): string {\n switch (diffType) {\n case \"added\":\n return \"+ \";\n case \"removed\":\n return \"- \";\n default:\n return \" \";\n }\n}\n\n/** Options for {@linkcode buildMessage}. */\nexport interface BuildMessageOptions {\n /**\n * Whether to output the diff as a single string.\n * @default {false}\n */\n stringDiff?: boolean;\n}\n\n/**\n * Builds a message based on the provided diff result.\n *\n * @param diffResult The diff result array.\n * @param options Optional parameters for customizing the message.\n * @param truncateDiff Function to truncate the diff (default is no truncation).\n *\n * @returns An array of strings representing the built message.\n *\n * @example Usage\n * ```ts no-assert\n * import { diffStr, buildMessage } from \"@std/internal\";\n *\n * diffStr(\"Hello, world!\", \"Hello, world\");\n * // [\n * // \"\",\n * // \"\",\n * // \" [Diff] Actual / Expected\",\n * // \"\",\n * // \"\",\n * // \"- Hello, world!\",\n * // \"+ Hello, world\",\n * // \"\",\n * // ]\n * ```\n */\nexport function buildMessage(\n diffResult: ReadonlyArray<DiffResult<string>>,\n options: BuildMessageOptions = {},\n truncateDiff?: (\n diffResult: ReadonlyArray<DiffResult<string>>,\n stringDiff: boolean,\n contextLength?: number | null,\n ) => ReadonlyArray<DiffResult<string>>,\n): string[] {\n if (truncateDiff != null) {\n diffResult = truncateDiff(diffResult, options.stringDiff ?? false);\n }\n\n const { stringDiff = false } = options;\n const messages = [\n \"\",\n \"\",\n ` ${gray(bold(\"[Diff]\"))} ${red(bold(\"Actual\"))} / ${\n green(bold(\"Expected\"))\n }`,\n \"\",\n \"\",\n ];\n const diffMessages = diffResult.map((result) => {\n const color = createColor(result.type);\n\n const line = result.type === \"added\" || result.type === \"removed\"\n ? result.details?.map((detail) =>\n detail.type !== \"common\"\n ? createColor(detail.type, true)(detail.value)\n : detail.value\n ).join(\"\") ?? result.value\n : result.value;\n\n return color(`${createSign(result.type)}${line}`);\n });\n messages.push(...(stringDiff ? [diffMessages.join(\"\")] : diffMessages), \"\");\n return messages;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport type { DiffResult, DiffType } from \"./types.ts\";\n\n/** Represents the farthest point in the diff algorithm. */\nexport interface FarthestPoint {\n /** The y-coordinate of the point. */\n y: number;\n /** The id of the point. */\n id: number;\n}\n\nconst REMOVED = 1;\nconst COMMON = 2;\nconst ADDED = 3;\n\n/**\n * Creates an array of common elements between two arrays.\n *\n * @typeParam T The type of elements in the arrays.\n *\n * @param A The first array.\n * @param B The second array.\n *\n * @returns An array containing the common elements between the two arrays.\n *\n * @example Usage\n * ```ts\n * import { createCommon } from \"@std/internal/diff\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const a = [1, 2, 3];\n * const b = [1, 2, 4];\n *\n * assertEquals(createCommon(a, b), [1, 2]);\n * ```\n */\nexport function createCommon<T>(A: T[], B: T[]): T[] {\n const common: T[] = [];\n if (A.length === 0 || B.length === 0) return [];\n for (let i = 0; i < Math.min(A.length, B.length); i += 1) {\n const a = A[i];\n const b = B[i];\n if (a !== undefined && a === b) {\n common.push(a);\n } else {\n return common;\n }\n }\n return common;\n}\n\n/**\n * Asserts that the value is a {@linkcode FarthestPoint}.\n * If not, an error is thrown.\n *\n * @param value The value to check.\n *\n * @returns A void value that returns once the assertion completes.\n *\n * @example Usage\n * ```ts\n * import { assertFp } from \"@std/internal/diff\";\n * import { assertThrows } from \"@std/assert\";\n *\n * assertFp({ y: 0, id: 0 });\n * assertThrows(() => assertFp({ id: 0 }));\n * assertThrows(() => assertFp({ y: 0 }));\n * assertThrows(() => assertFp(undefined));\n * ```\n */\nexport function assertFp(value: unknown): asserts value is FarthestPoint {\n if (\n value == null ||\n typeof value !== \"object\" ||\n typeof (value as FarthestPoint)?.y !== \"number\" ||\n typeof (value as FarthestPoint)?.id !== \"number\"\n ) {\n throw new Error(\n `Unexpected value, expected 'FarthestPoint': received ${typeof value}`,\n );\n }\n}\n\n/**\n * Creates an array of backtraced differences.\n *\n * @typeParam T The type of elements in the arrays.\n *\n * @param A The first array.\n * @param B The second array.\n * @param current The current {@linkcode FarthestPoint}.\n * @param swapped Boolean indicating if the arrays are swapped.\n * @param routes The routes array.\n * @param diffTypesPtrOffset The offset of the diff types in the routes array.\n *\n * @returns An array of backtraced differences.\n *\n * @example Usage\n * ```ts\n * import { backTrace } from \"@std/internal/diff\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * backTrace([], [], { y: 0, id: 0 }, false, new Uint32Array(0), 0),\n * [],\n * );\n * ```\n */\nexport function backTrace<T>(\n A: T[],\n B: T[],\n current: FarthestPoint,\n swapped: boolean,\n routes: Uint32Array,\n diffTypesPtrOffset: number,\n): Array<{\n type: DiffType;\n value: T;\n}> {\n const M = A.length;\n const N = B.length;\n const result: { type: DiffType; value: T }[] = [];\n let a = M - 1;\n let b = N - 1;\n let j = routes[current.id];\n let type = routes[current.id + diffTypesPtrOffset];\n while (true) {\n if (!j && !type) break;\n const prev = j!;\n if (type === REMOVED) {\n result.unshift({\n type: swapped ? \"removed\" : \"added\",\n value: B[b]!,\n });\n b -= 1;\n } else if (type === ADDED) {\n result.unshift({\n type: swapped ? \"added\" : \"removed\",\n value: A[a]!,\n });\n a -= 1;\n } else {\n result.unshift({ type: \"common\", value: A[a]! });\n a -= 1;\n b -= 1;\n }\n j = routes[prev];\n type = routes[prev + diffTypesPtrOffset];\n }\n return result;\n}\n\n/**\n * Creates a {@linkcode FarthestPoint}.\n *\n * @param k The current index.\n * @param M The length of the first array.\n * @param routes The routes array.\n * @param diffTypesPtrOffset The offset of the diff types in the routes array.\n * @param ptr The current pointer.\n * @param slide The slide {@linkcode FarthestPoint}.\n * @param down The down {@linkcode FarthestPoint}.\n *\n * @returns A {@linkcode FarthestPoint}.\n *\n * @example Usage\n * ```ts\n * import { createFp } from \"@std/internal/diff\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * createFp(\n * 0,\n * 0,\n * new Uint32Array(0),\n * 0,\n * 0,\n * { y: -1, id: 0 },\n * { y: 0, id: 0 },\n * ),\n * { y: -1, id: 1 },\n * );\n * ```\n */\nexport function createFp(\n k: number,\n M: number,\n routes: Uint32Array,\n diffTypesPtrOffset: number,\n ptr: number,\n slide?: FarthestPoint,\n down?: FarthestPoint,\n): FarthestPoint {\n if (slide && slide.y === -1 && down && down.y === -1) {\n return { y: 0, id: 0 };\n }\n const isAdding = (down?.y === -1) ||\n k === M ||\n (slide?.y ?? 0) > (down?.y ?? 0) + 1;\n if (slide && isAdding) {\n const prev = slide.id;\n ptr++;\n routes[ptr] = prev;\n routes[ptr + diffTypesPtrOffset] = ADDED;\n return { y: slide.y, id: ptr };\n }\n if (down && !isAdding) {\n const prev = down.id;\n ptr++;\n routes[ptr] = prev;\n routes[ptr + diffTypesPtrOffset] = REMOVED;\n return { y: down.y + 1, id: ptr };\n }\n throw new Error(\"Unexpected missing FarthestPoint\");\n}\n\n/**\n * Renders the differences between the actual and expected values.\n *\n * @typeParam T The type of elements in the arrays.\n *\n * @param A Actual value\n * @param B Expected value\n *\n * @returns An array of differences between the actual and expected values.\n *\n * @example Usage\n * ```ts\n * import { diff } from \"@std/internal/diff\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const a = [1, 2, 3];\n * const b = [1, 2, 4];\n *\n * assertEquals(diff(a, b), [\n * { type: \"common\", value: 1 },\n * { type: \"common\", value: 2 },\n * { type: \"removed\", value: 3 },\n * { type: \"added\", value: 4 },\n * ]);\n * ```\n */\nexport function diff<T>(A: T[], B: T[]): DiffResult<T>[] {\n const prefixCommon = createCommon(A, B);\n A = A.slice(prefixCommon.length);\n B = B.slice(prefixCommon.length);\n const swapped = B.length > A.length;\n [A, B] = swapped ? [B, A] : [A, B];\n const M = A.length;\n const N = B.length;\n if (!M && !N && !prefixCommon.length) return [];\n if (!N) {\n return [\n ...prefixCommon.map((value) => ({ type: \"common\", value })),\n ...A.map((value) => ({ type: swapped ? \"added\" : \"removed\", value })),\n ] as DiffResult<T>[];\n }\n const offset = N;\n const delta = M - N;\n const length = M + N + 1;\n const fp: FarthestPoint[] = Array.from({ length }, () => ({ y: -1, id: -1 }));\n\n /**\n * Note: this buffer is used to save memory and improve performance. The first\n * half is used to save route and the last half is used to save diff type.\n */\n const routes = new Uint32Array((M * N + length + 1) * 2);\n const diffTypesPtrOffset = routes.length / 2;\n let ptr = 0;\n\n function snake<T>(\n k: number,\n A: T[],\n B: T[],\n slide?: FarthestPoint,\n down?: FarthestPoint,\n ): FarthestPoint {\n const M = A.length;\n const N = B.length;\n const fp = createFp(k, M, routes, diffTypesPtrOffset, ptr, slide, down);\n ptr = fp.id;\n while (fp.y + k < M && fp.y < N && A[fp.y + k] === B[fp.y]) {\n const prev = fp.id;\n ptr++;\n fp.id = ptr;\n fp.y += 1;\n routes[ptr] = prev;\n routes[ptr + diffTypesPtrOffset] = COMMON;\n }\n return fp;\n }\n\n let currentFp = fp[delta + offset];\n assertFp(currentFp);\n let p = -1;\n while (currentFp.y < N) {\n p = p + 1;\n for (let k = -p; k < delta; ++k) {\n const index = k + offset;\n fp[index] = snake(k, A, B, fp[index - 1], fp[index + 1]);\n }\n for (let k = delta + p; k > delta; --k) {\n const index = k + offset;\n fp[index] = snake(k, A, B, fp[index - 1], fp[index + 1]);\n }\n const index = delta + offset;\n fp[delta + offset] = snake(delta, A, B, fp[index - 1], fp[index + 1]);\n currentFp = fp[delta + offset];\n assertFp(currentFp);\n }\n return [\n ...prefixCommon.map((value) => ({ type: \"common\", value })),\n ...backTrace(A, B, currentFp, swapped, routes, diffTypesPtrOffset),\n ] as DiffResult<T>[];\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport type { ChangedDiffResult, DiffResult } from \"./types.ts\";\nimport { diff } from \"./diff.ts\";\n\n/**\n * Unescape invisible characters.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#escape_sequences}\n *\n * @param string String to unescape.\n *\n * @returns Unescaped string.\n *\n * @example Usage\n * ```ts\n * import { unescape } from \"@std/internal/diff-str\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(unescape(\"Hello\\nWorld\"), \"Hello\\\\n\\nWorld\");\n * ```\n */\nexport function unescape(string: string): string {\n return string\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll(\"\\b\", \"\\\\b\")\n .replaceAll(\"\\f\", \"\\\\f\")\n .replaceAll(\"\\t\", \"\\\\t\")\n .replaceAll(\"\\v\", \"\\\\v\")\n // This does not remove line breaks\n .replaceAll(\n /\\r\\n|\\r|\\n/g,\n (str) => str === \"\\r\" ? \"\\\\r\" : str === \"\\n\" ? \"\\\\n\\n\" : \"\\\\r\\\\n\\r\\n\",\n );\n}\n\nconst WHITESPACE_SYMBOLS_REGEXP =\n /((?:\\\\[bftv]|[^\\S\\r\\n])+|\\\\[rn\\\\]|[()[\\]{}'\"\\r\\n]|\\b)/;\n\n/**\n * Tokenizes a string into an array of tokens.\n *\n * @param string The string to tokenize.\n * @param wordDiff If true, performs word-based tokenization. Default is false.\n *\n * @returns An array of tokens.\n *\n * @example Usage\n * ```ts\n * import { tokenize } from \"@std/internal/diff-str\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(tokenize(\"Hello\\nWorld\"), [\"Hello\\n\", \"World\"]);\n * ```\n */\nexport function tokenize(string: string, wordDiff = false): string[] {\n if (wordDiff) {\n return string\n .split(WHITESPACE_SYMBOLS_REGEXP)\n .filter((token) => token);\n }\n const tokens: string[] = [];\n const lines = string.split(/(\\n|\\r\\n)/).filter((line) => line);\n\n for (const [i, line] of lines.entries()) {\n if (i % 2) {\n tokens[tokens.length - 1] += line;\n } else {\n tokens.push(line);\n }\n }\n return tokens;\n}\n\n/**\n * Create details by filtering relevant word-diff for current line and merge\n * \"space-diff\" if surrounded by word-diff for cleaner displays.\n *\n * @param line Current line\n * @param tokens Word-diff tokens\n *\n * @returns Array of diff results.\n *\n * @example Usage\n * ```ts\n * import { createDetails } from \"@std/internal/diff-str\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const tokens = [\n * { type: \"added\", value: \"a\" },\n * { type: \"removed\", value: \"b\" },\n * { type: \"common\", value: \"c\" },\n * ] as const;\n * assertEquals(\n * createDetails({ type: \"added\", value: \"a\" }, [...tokens]),\n * [{ type: \"added\", value: \"a\" }, { type: \"common\", value: \"c\" }]\n * );\n * ```\n */\nexport function createDetails(\n line: DiffResult<string>,\n tokens: DiffResult<string>[],\n): DiffResult<string>[] {\n return tokens.filter(({ type }) => type === line.type || type === \"common\")\n .map((result, i, t) => {\n const token = t[i - 1];\n if (\n (result.type === \"common\") && token &&\n (token.type === t[i + 1]?.type) && /\\s+/.test(result.value)\n ) {\n return {\n ...result,\n type: token.type,\n };\n }\n return result;\n });\n}\n\nconst NON_WHITESPACE_REGEXP = /\\S/;\n\n/**\n * Renders the differences between the actual and expected strings. Partially\n * inspired from {@link https://github.com/kpdecker/jsdiff}.\n *\n * @param A Actual string\n * @param B Expected string\n *\n * @returns Array of diff results.\n *\n * @example Usage\n * ```ts\n * import { diffStr } from \"@std/internal/diff-str\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(diffStr(\"Hello!\", \"Hello\"), [\n * {\n * type: \"removed\",\n * value: \"Hello!\\n\",\n * details: [\n * { type: \"common\", value: \"Hello\" },\n * { type: \"removed\", value: \"!\" },\n * { type: \"common\", value: \"\\n\" }\n * ]\n * },\n * {\n * type: \"added\",\n * value: \"Hello\\n\",\n * details: [\n * { type: \"common\", value: \"Hello\" },\n * { type: \"common\", value: \"\\n\" }\n * ]\n * }\n * ]);\n * ```\n */\nexport function diffStr(A: string, B: string): DiffResult<string>[] {\n // Compute multi-line diff\n const diffResult = diff(\n tokenize(`${unescape(A)}\\n`),\n tokenize(`${unescape(B)}\\n`),\n );\n\n const added = [];\n const removed = [];\n for (const result of diffResult) {\n if (result.type === \"added\") {\n added.push(result);\n }\n if (result.type === \"removed\") {\n removed.push(result);\n }\n }\n\n // Compute word-diff\n const hasMoreRemovedLines = added.length < removed.length;\n const aLines = hasMoreRemovedLines ? added : removed;\n const bLines = hasMoreRemovedLines ? removed : added;\n for (const a of aLines) {\n let tokens = [] as Array<DiffResult<string>>;\n let b: undefined | ChangedDiffResult<string>;\n // Search another diff line with at least one common token\n while (bLines.length) {\n b = bLines.shift();\n const tokenized = [\n tokenize(a.value, true),\n tokenize(b!.value, true),\n ] as [string[], string[]];\n if (hasMoreRemovedLines) tokenized.reverse();\n tokens = diff(tokenized[0], tokenized[1]);\n if (\n tokens.some(({ type, value }) =>\n type === \"common\" && NON_WHITESPACE_REGEXP.test(value)\n )\n ) {\n break;\n }\n }\n // Register word-diff details\n a.details = createDetails(a, tokens);\n if (b) {\n b.details = createDetails(b, tokens);\n }\n }\n\n return diffResult;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { equal } from \"./equal.ts\";\nimport { buildMessage } from \"jsr:@std/internal@^1.0.12/build-message\";\nimport { diff } from \"jsr:@std/internal@^1.0.12/diff\";\nimport { diffStr } from \"jsr:@std/internal@^1.0.12/diff-str\";\nimport { format } from \"jsr:@std/internal@^1.0.12/format\";\n\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that `actual` and `expected` are equal, deeply. If not\n * deeply equal, then throw.\n *\n * Type parameter can be specified to ensure values under comparison have the\n * same type.\n *\n * Note: This function is based on value equality, but for some cases (such as\n * data that can only be read asynchronously or function properties) value\n * equality is not possible to determine. In such cases, reference equality is\n * used instead, which may cause false negatives for objects such as `Blob`s or\n * `Request`s.\n *\n * @example Usage\n * ```ts ignore\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\"world\", \"world\"); // Doesn't throw\n * assertEquals(\"hello\", \"world\"); // Throws\n * ```\n * @example Compare `Blob` objects\n * ```ts ignore\n * import { assertEquals } from \"@std/assert\";\n *\n * const bytes1 = await new Blob([\"foo\"]).bytes();\n * const bytes2 = await new Blob([\"foo\"]).bytes();\n *\n * assertEquals(bytes1, bytes2);\n * ```\n *\n * @typeParam T The type of the values to compare. This is usually inferred.\n * @param actual The actual value to compare.\n * @param expected The expected value to compare.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertEquals<T>(\n actual: T,\n expected: T,\n msg?: string,\n) {\n if (equal(actual, expected)) {\n return;\n }\n const msgSuffix = msg ? `: ${msg}` : \".\";\n let message = `Values are not equal${msgSuffix}`;\n\n const actualString = format(actual);\n const expectedString = format(expected);\n const stringDiff = (typeof actual === \"string\") &&\n (typeof expected === \"string\");\n const diffResult = stringDiff\n ? diffStr(actual as string, expected as string)\n : diff(actualString.split(\"\\n\"), expectedString.split(\"\\n\"));\n const diffMsg = buildMessage(diffResult, { stringDiff }, arguments[3])\n .join(\"\\n\");\n message = `${message}\\n${diffMsg}`;\n throw new AssertionError(message);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that actual is not null or undefined.\n * If not then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertExists } from \"@std/assert\";\n *\n * assertExists(\"something\"); // Doesn't throw\n * assertExists(undefined); // Throws\n * ```\n *\n * @typeParam T The type of the actual value.\n * @param actual The actual value to check.\n * @param msg The optional message to include in the error if the assertion fails.\n */\nexport function assertExists<T>(\n actual: T,\n msg?: string,\n): asserts actual is NonNullable<T> {\n if (actual === undefined || actual === null) {\n const msgSuffix = msg ? `: ${msg}` : \".\";\n msg =\n `Expected actual: \"${actual}\" to not be null or undefined${msgSuffix}`;\n throw new AssertionError(msg);\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/** Any constructor */\n// deno-lint-ignore no-explicit-any\nexport type AnyConstructor = new (...args: any[]) => any;\n/** Gets constructor type */\nexport type GetConstructorType<T extends AnyConstructor> = InstanceType<T>;\n\n/**\n * Make an assertion that `obj` is an instance of `type`.\n * If not then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertInstanceOf } from \"@std/assert\";\n *\n * assertInstanceOf(new Date(), Date); // Doesn't throw\n * assertInstanceOf(new Date(), Number); // Throws\n * ```\n *\n * @typeParam T The expected type of the object.\n * @param actual The object to check.\n * @param expectedType The expected class constructor.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertInstanceOf<\n // deno-lint-ignore no-explicit-any\n T extends abstract new (...args: any[]) => any,\n>(\n actual: unknown,\n expectedType: T,\n msg = \"\",\n): asserts actual is InstanceType<T> {\n if (actual instanceof expectedType) return;\n\n const msgSuffix = msg ? `: ${msg}` : \".\";\n const expectedTypeStr = expectedType.name;\n\n let actualTypeStr = \"\";\n if (actual === null) {\n actualTypeStr = \"null\";\n } else if (actual === undefined) {\n actualTypeStr = \"undefined\";\n } else if (typeof actual === \"object\") {\n actualTypeStr = actual.constructor?.name ?? \"Object\";\n } else {\n actualTypeStr = typeof actual;\n }\n\n if (expectedTypeStr === actualTypeStr) {\n msg =\n `Expected object to be an instance of \"${expectedTypeStr}\"${msgSuffix}`;\n } else if (actualTypeStr === \"function\") {\n msg =\n `Expected object to be an instance of \"${expectedTypeStr}\" but was not an instanced object${msgSuffix}`;\n } else {\n msg =\n `Expected object to be an instance of \"${expectedTypeStr}\" but was \"${actualTypeStr}\"${msgSuffix}`;\n }\n\n throw new AssertionError(msg);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion, an error will be thrown if `expr` does not have a truthy value.\n *\n * @example Usage\n * ```ts ignore\n * import { assert } from \"@std/assert\";\n *\n * assert(\"hello\".includes(\"ello\")); // Doesn't throw\n * assert(\"hello\".includes(\"world\")); // Throws\n * ```\n *\n * @param expr The expression to test.\n * @param msg The optional message to display if the assertion fails.\n * @throws {AssertionError} If `expr` is falsy.\n */\nexport function assert(expr: unknown, msg = \"\"): asserts expr {\n if (!expr) {\n throw new AssertionError(msg);\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nexport function checkWindows(): boolean {\n // deno-lint-ignore no-explicit-any\n const global = globalThis as any;\n const os = global.Deno?.build?.os;\n\n // Check Deno, then the remaining runtimes (e.g. Node, Bun and the browser)\n return typeof os === \"string\"\n ? os === \"windows\"\n : global.navigator?.platform?.startsWith(\"Win\") ??\n global.process?.platform?.startsWith(\"win\") ?? false;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { checkWindows } from \"./_os.ts\";\n\n/** Whether the current platform is Windows */\nexport const isWindows: boolean = checkWindows();\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// Copyright the Browserify authors. MIT License.\n\nexport function assertPath(path?: string) {\n if (typeof path !== \"string\") {\n throw new TypeError(\n `Path must be a string, received \"${JSON.stringify(path)}\"`,\n );\n }\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\nexport function assertArg(url: URL | string) {\n url = url instanceof URL ? url : new URL(url);\n if (url.protocol !== \"file:\") {\n throw new TypeError(\n `URL must be a file URL: received \"${url.protocol}\"`,\n );\n }\n return url;\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertArg } from \"../_common/from_file_url.ts\";\n\n/**\n * Converts a file URL to a path string.\n *\n * @example Usage\n * ```ts\n * import { fromFileUrl } from \"@std/path/posix/from-file-url\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(fromFileUrl(new URL(\"file:///home/foo\")), \"/home/foo\");\n * ```\n *\n * @param url The file URL to convert.\n * @returns The path string.\n */\nexport function fromFileUrl(url: URL | string): string {\n url = assertArg(url);\n return decodeURIComponent(\n url.pathname.replace(/%(?![0-9A-Fa-f]{2})/g, \"%25\"),\n );\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// Copyright the Browserify authors. MIT License.\n// Ported from https://github.com/browserify/path-browserify/\n// This module is browser compatible.\n\nexport function stripTrailingSeparators(\n segment: string,\n isSep: (char: number) => boolean,\n): string {\n if (segment.length <= 1) {\n return segment;\n }\n\n let end = segment.length;\n\n for (let i = segment.length - 1; i > 0; i--) {\n if (isSep(segment.charCodeAt(i))) {\n end = i;\n } else {\n break;\n }\n }\n\n return segment.slice(0, end);\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// Copyright the Browserify authors. MIT License.\n// Ported from https://github.com/browserify/path-browserify/\n// This module is browser compatible.\n\nimport { CHAR_FORWARD_SLASH } from \"../_common/constants.ts\";\n\nexport function isPosixPathSeparator(code: number): boolean {\n return code === CHAR_FORWARD_SLASH;\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// Copyright the Browserify authors. MIT License.\n// Ported from https://github.com/browserify/path-browserify/\n// This module is browser compatible.\n\nimport {\n CHAR_BACKWARD_SLASH,\n CHAR_FORWARD_SLASH,\n CHAR_LOWERCASE_A,\n CHAR_LOWERCASE_Z,\n CHAR_UPPERCASE_A,\n CHAR_UPPERCASE_Z,\n} from \"../_common/constants.ts\";\n\nexport function isPosixPathSeparator(code: number): boolean {\n return code === CHAR_FORWARD_SLASH;\n}\n\nexport function isPathSeparator(code: number): boolean {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n}\n\nexport function isWindowsDeviceRoot(code: number): boolean {\n return (\n (code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z) ||\n (code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z)\n );\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertArg } from \"../_common/from_file_url.ts\";\n\n/**\n * Converts a file URL to a path string.\n *\n * @example Usage\n * ```ts\n * import { fromFileUrl } from \"@std/path/windows/from-file-url\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(fromFileUrl(\"file:///home/foo\"), \"\\\\home\\\\foo\");\n * assertEquals(fromFileUrl(\"file:///C:/Users/foo\"), \"C:\\\\Users\\\\foo\");\n * assertEquals(fromFileUrl(\"file://localhost/home/foo\"), \"\\\\home\\\\foo\");\n * ```\n *\n * @param url The file URL to convert.\n * @returns The path string.\n */\nexport function fromFileUrl(url: URL | string): string {\n url = assertArg(url);\n let path = decodeURIComponent(\n url.pathname.replace(/\\//g, \"\\\\\").replace(/%(?![0-9A-Fa-f]{2})/g, \"%25\"),\n ).replace(/^\\\\*([A-Za-z]:)(\\\\|$)/, \"$1\\\\\");\n if (url.hostname !== \"\") {\n // Note: The `URL` implementation guarantees that the drive letter and\n // hostname are mutually exclusive. Otherwise it would not have been valid\n // to append the hostname and path like this.\n path = `\\\\\\\\${url.hostname}${path}`;\n }\n return path;\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertPath } from \"./assert_path.ts\";\n\nexport function assertArg(path: string) {\n assertPath(path);\n if (path.length === 0) return \".\";\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertArg } from \"../_common/dirname.ts\";\nimport { stripTrailingSeparators } from \"../_common/strip_trailing_separators.ts\";\nimport { isPosixPathSeparator } from \"./_util.ts\";\nimport { fromFileUrl } from \"./from_file_url.ts\";\n\n/**\n * Return the directory path of a `path`.\n *\n * @example Usage\n * ```ts\n * import { dirname } from \"@std/path/posix/dirname\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(dirname(\"/home/user/Documents/\"), \"/home/user\");\n * assertEquals(dirname(\"/home/user/Documents/image.png\"), \"/home/user/Documents\");\n * assertEquals(dirname(\"https://deno.land/std/path/mod.ts\"), \"https://deno.land/std/path\");\n * assertEquals(dirname(new URL(\"file:///home/user/Documents/image.png\")), \"/home/user/Documents\");\n * ```\n *\n * @example Working with URLs\n *\n * ```ts\n * import { dirname } from \"@std/path/posix/dirname\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(dirname(\"https://deno.land/std/path/mod.ts\"), \"https://deno.land/std/path\");\n * assertEquals(dirname(\"https://deno.land/std/path/mod.ts?a=b\"), \"https://deno.land/std/path\");\n * assertEquals(dirname(\"https://deno.land/std/path/mod.ts#header\"), \"https://deno.land/std/path\");\n * ```\n *\n * @param path The path to get the directory from.\n * @returns The directory path.\n */\nexport function dirname(path: string | URL): string {\n if (path instanceof URL) {\n path = fromFileUrl(path);\n }\n assertArg(path);\n\n let end = -1;\n let matchedNonSeparator = false;\n\n for (let i = path.length - 1; i >= 1; --i) {\n if (isPosixPathSeparator(path.charCodeAt(i))) {\n if (matchedNonSeparator) {\n end = i;\n break;\n }\n } else {\n matchedNonSeparator = true;\n }\n }\n\n // No matches. Fallback based on provided path:\n //\n // - leading slashes paths\n // \"/foo\" => \"/\"\n // \"///foo\" => \"/\"\n // - no slash path\n // \"foo\" => \".\"\n if (end === -1) {\n return isPosixPathSeparator(path.charCodeAt(0)) ? \"/\" : \".\";\n }\n\n return stripTrailingSeparators(\n path.slice(0, end),\n isPosixPathSeparator,\n );\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertArg } from \"../_common/dirname.ts\";\nimport { CHAR_COLON } from \"../_common/constants.ts\";\nimport { stripTrailingSeparators } from \"../_common/strip_trailing_separators.ts\";\nimport {\n isPathSeparator,\n isPosixPathSeparator,\n isWindowsDeviceRoot,\n} from \"./_util.ts\";\nimport { fromFileUrl } from \"./from_file_url.ts\";\n\n/**\n * Return the directory path of a `path`.\n *\n * @example Usage\n * ```ts\n * import { dirname } from \"@std/path/windows/dirname\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(dirname(\"C:\\\\foo\\\\bar\\\\baz.ext\"), \"C:\\\\foo\\\\bar\");\n * assertEquals(dirname(new URL(\"file:///C:/foo/bar/baz.ext\")), \"C:\\\\foo\\\\bar\");\n * ```\n *\n * @param path The path to get the directory from.\n * @returns The directory path.\n */\nexport function dirname(path: string | URL): string {\n if (path instanceof URL) {\n path = fromFileUrl(path);\n }\n assertArg(path);\n\n const len = path.length;\n let rootEnd = -1;\n let end = -1;\n let matchedSlash = true;\n let offset = 0;\n const code = path.charCodeAt(0);\n\n // Try to match a root\n if (len > 1) {\n if (isPathSeparator(code)) {\n // Possible UNC root\n\n rootEnd = offset = 1;\n\n if (isPathSeparator(path.charCodeAt(1))) {\n // Matched double path separator at beginning\n let j = 2;\n let last = j;\n // Match 1 or more non-path separators\n for (; j < len; ++j) {\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more path separators\n for (; j < len; ++j) {\n if (!isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n for (; j < len; ++j) {\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j === len) {\n // We matched a UNC root only\n return path;\n }\n if (j !== last) {\n // We matched a UNC root with leftovers\n\n // Offset by 1 to include the separator after the UNC root to\n // treat it as a \"normal root\" on top of a (UNC) root\n rootEnd = offset = j + 1;\n }\n }\n }\n }\n } else if (isWindowsDeviceRoot(code)) {\n // Possible device root\n\n if (path.charCodeAt(1) === CHAR_COLON) {\n rootEnd = offset = 2;\n if (len > 2) {\n if (isPathSeparator(path.charCodeAt(2))) rootEnd = offset = 3;\n }\n }\n }\n } else if (isPathSeparator(code)) {\n // `path` contains just a path separator, exit early to avoid\n // unnecessary work\n return path;\n }\n\n for (let i = len - 1; i >= offset; --i) {\n if (isPathSeparator(path.charCodeAt(i))) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) {\n if (rootEnd === -1) return \".\";\n else end = rootEnd;\n }\n return stripTrailingSeparators(path.slice(0, end), isPosixPathSeparator);\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { isWindows } from \"jsr:@std/internal@^1.0.12/os\";\nimport { dirname as posixDirname } from \"./posix/dirname.ts\";\nimport { dirname as windowsDirname } from \"./windows/dirname.ts\";\n\n/**\n * Return the directory path of a path.\n *\n * @example Usage\n * ```ts\n * import { dirname } from \"@std/path/dirname\";\n * import { assertEquals } from \"@std/assert\";\n *\n * if (Deno.build.os === \"windows\") {\n * assertEquals(dirname(\"C:\\\\home\\\\user\\\\Documents\\\\image.png\"), \"C:\\\\home\\\\user\\\\Documents\");\n * assertEquals(dirname(new URL(\"file:///C:/home/user/Documents/image.png\")), \"C:\\\\home\\\\user\\\\Documents\");\n * } else {\n * assertEquals(dirname(\"/home/user/Documents/image.png\"), \"/home/user/Documents\");\n * assertEquals(dirname(new URL(\"file:///home/user/Documents/image.png\")), \"/home/user/Documents\");\n * }\n * ```\n *\n * @param path Path to extract the directory from.\n * @returns The directory path.\n */\nexport function dirname(path: string | URL): string {\n return isWindows ? windowsDirname(path) : posixDirname(path);\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertPath } from \"./assert_path.ts\";\n\nexport function assertArg(path: string) {\n assertPath(path);\n if (path.length === 0) return \".\";\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// Copyright the Browserify authors. MIT License.\n// Ported from https://github.com/browserify/path-browserify/\n// This module is browser compatible.\n\nimport { CHAR_DOT, CHAR_FORWARD_SLASH } from \"./constants.ts\";\n\n// Resolves . and .. elements in a path with directory names\nexport function normalizeString(\n path: string,\n allowAboveRoot: boolean,\n separator: string,\n isPathSeparator: (code: number) => boolean,\n): string {\n let res = \"\";\n let lastSegmentLength = 0;\n let lastSlash = -1;\n let dots = 0;\n let code: number | undefined;\n for (let i = 0; i <= path.length; ++i) {\n if (i < path.length) code = path.charCodeAt(i);\n else if (isPathSeparator(code!)) break;\n else code = CHAR_FORWARD_SLASH;\n\n if (isPathSeparator(code!)) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n } else if (lastSlash !== i - 1 && dots === 2) {\n if (\n res.length < 2 ||\n lastSegmentLength !== 2 ||\n res.charCodeAt(res.length - 1) !== CHAR_DOT ||\n res.charCodeAt(res.length - 2) !== CHAR_DOT\n ) {\n if (res.length > 2) {\n const lastSlashIndex = res.lastIndexOf(separator);\n if (lastSlashIndex === -1) {\n res = \"\";\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf(separator);\n }\n lastSlash = i;\n dots = 0;\n continue;\n } else if (res.length === 2 || res.length === 1) {\n res = \"\";\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0) res += `${separator}..`;\n else res = \"..\";\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0) res += separator + path.slice(lastSlash + 1, i);\n else res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === CHAR_DOT && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertArg } from \"../_common/normalize.ts\";\nimport { normalizeString } from \"../_common/normalize_string.ts\";\nimport { isPosixPathSeparator } from \"./_util.ts\";\nimport { fromFileUrl } from \"./from_file_url.ts\";\n\n/**\n * Normalize the `path`, resolving `'..'` and `'.'` segments.\n * Note that resolving these segments does not necessarily mean that all will be eliminated.\n * A `'..'` at the top-level will be preserved, and an empty path is canonically `'.'`.\n *\n * @example Usage\n * ```ts\n * import { normalize } from \"@std/path/posix/normalize\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(normalize(\"/foo/bar//baz/asdf/quux/..\"), \"/foo/bar/baz/asdf\");\n * assertEquals(normalize(new URL(\"file:///foo/bar//baz/asdf/quux/..\")), \"/foo/bar/baz/asdf/\");\n * ```\n *\n * @example Working with URLs\n *\n * Note: This function will remove the double slashes from a URL's scheme.\n * Hence, do not pass a full URL to this function. Instead, pass the pathname of\n * the URL.\n *\n * ```ts\n * import { normalize } from \"@std/path/posix/normalize\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const url = new URL(\"https://deno.land\");\n * url.pathname = normalize(\"//std//assert//.//mod.ts\");\n * assertEquals(url.href, \"https://deno.land/std/assert/mod.ts\");\n *\n * url.pathname = normalize(\"std/assert/../async/retry.ts\");\n * assertEquals(url.href, \"https://deno.land/std/async/retry.ts\");\n * ```\n *\n * @param path The path to normalize.\n * @returns The normalized path.\n */\nexport function normalize(path: string | URL): string {\n if (path instanceof URL) {\n path = fromFileUrl(path);\n }\n assertArg(path);\n\n const isAbsolute = isPosixPathSeparator(path.charCodeAt(0));\n const trailingSeparator = isPosixPathSeparator(\n path.charCodeAt(path.length - 1),\n );\n\n // Normalize the path\n path = normalizeString(path, !isAbsolute, \"/\", isPosixPathSeparator);\n\n if (path.length === 0 && !isAbsolute) path = \".\";\n if (path.length > 0 && trailingSeparator) path += \"/\";\n\n if (isAbsolute) return `/${path}`;\n return path;\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertArg } from \"../_common/normalize.ts\";\nimport { CHAR_COLON } from \"../_common/constants.ts\";\nimport { normalizeString } from \"../_common/normalize_string.ts\";\nimport { isPathSeparator, isWindowsDeviceRoot } from \"./_util.ts\";\nimport { fromFileUrl } from \"./from_file_url.ts\";\n\n/**\n * Normalize the `path`, resolving `'..'` and `'.'` segments.\n * Note that resolving these segments does not necessarily mean that all will be eliminated.\n * A `'..'` at the top-level will be preserved, and an empty path is canonically `'.'`.\n *\n * @example Usage\n * ```ts\n * import { normalize } from \"@std/path/windows/normalize\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(normalize(\"C:\\\\foo\\\\..\\\\bar\"), \"C:\\\\bar\");\n * assertEquals(normalize(new URL(\"file:///C:/foo/../bar\")), \"C:\\\\bar\");\n * ```\n *\n * @param path The path to normalize\n * @returns The normalized path\n */\nexport function normalize(path: string | URL): string {\n if (path instanceof URL) {\n path = fromFileUrl(path);\n }\n assertArg(path);\n\n const len = path.length;\n let rootEnd = 0;\n let device: string | undefined;\n let isAbsolute = false;\n const code = path.charCodeAt(0);\n\n // Try to match a root\n if (len > 1) {\n if (isPathSeparator(code)) {\n // Possible UNC root\n\n // If we started with a separator, we know we at least have an absolute\n // path of some kind (UNC or otherwise)\n isAbsolute = true;\n\n if (isPathSeparator(path.charCodeAt(1))) {\n // Matched double path separator at beginning\n let j = 2;\n let last = j;\n // Match 1 or more non-path separators\n for (; j < len; ++j) {\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n const firstPart = path.slice(last, j);\n // Matched!\n last = j;\n // Match 1 or more path separators\n for (; j < len; ++j) {\n if (!isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n for (; j < len; ++j) {\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j === len) {\n // We matched a UNC root only\n // Return the normalized version of the UNC root since there\n // is nothing left to process\n\n return `\\\\\\\\${firstPart}\\\\${path.slice(last)}\\\\`;\n } else if (j !== last) {\n // We matched a UNC root with leftovers\n\n device = `\\\\\\\\${firstPart}\\\\${path.slice(last, j)}`;\n rootEnd = j;\n }\n }\n }\n } else {\n rootEnd = 1;\n }\n } else if (isWindowsDeviceRoot(code)) {\n // Possible device root\n\n if (path.charCodeAt(1) === CHAR_COLON) {\n device = path.slice(0, 2);\n rootEnd = 2;\n if (len > 2) {\n if (isPathSeparator(path.charCodeAt(2))) {\n // Treat separator following drive name as an absolute path\n // indicator\n isAbsolute = true;\n rootEnd = 3;\n }\n }\n }\n }\n } else if (isPathSeparator(code)) {\n // `path` contains just a path separator, exit early to avoid unnecessary\n // work\n return \"\\\\\";\n }\n\n let tail: string;\n if (rootEnd < len) {\n tail = normalizeString(\n path.slice(rootEnd),\n !isAbsolute,\n \"\\\\\",\n isPathSeparator,\n );\n } else {\n tail = \"\";\n }\n if (tail.length === 0 && !isAbsolute) tail = \".\";\n if (tail.length > 0 && isPathSeparator(path.charCodeAt(len - 1))) {\n tail += \"\\\\\";\n }\n if (device === undefined) {\n if (isAbsolute) {\n if (tail.length > 0) return `\\\\${tail}`;\n else return \"\\\\\";\n }\n return tail;\n } else if (isAbsolute) {\n if (tail.length > 0) return `${device}\\\\${tail}`;\n else return `${device}\\\\`;\n }\n return device + tail;\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { isWindows } from \"jsr:@std/internal@^1.0.12/os\";\nimport { normalize as posixNormalize } from \"./posix/normalize.ts\";\nimport { normalize as windowsNormalize } from \"./windows/normalize.ts\";\n/**\n * Normalize the path, resolving `'..'` and `'.'` segments.\n *\n * Note: Resolving these segments does not necessarily mean that all will be\n * eliminated. A `'..'` at the top-level will be preserved, and an empty path is\n * canonically `'.'`.\n *\n * @example Usage\n * ```ts\n * import { normalize } from \"@std/path/normalize\";\n * import { assertEquals } from \"@std/assert\";\n *\n * if (Deno.build.os === \"windows\") {\n * assertEquals(normalize(\"C:\\\\foo\\\\bar\\\\..\\\\baz\\\\quux\"), \"C:\\\\foo\\\\baz\\\\quux\");\n * assertEquals(normalize(new URL(\"file:///C:/foo/bar/../baz/quux\")), \"C:\\\\foo\\\\baz\\\\quux\");\n * } else {\n * assertEquals(normalize(\"/foo/bar/../baz/quux\"), \"/foo/baz/quux\");\n * assertEquals(normalize(new URL(\"file:///foo/bar/../baz/quux\")), \"/foo/baz/quux\");\n * }\n * ```\n *\n * @param path Path to be normalized\n * @returns The normalized path.\n */\nexport function normalize(path: string | URL): string {\n return isWindows ? windowsNormalize(path) : posixNormalize(path);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// deno-lint-ignore-file no-explicit-any\n\n/**\n * True if the runtime is Deno, false otherwise.\n */\nexport const isDeno = (globalThis as any).navigator\n ?.userAgent?.includes(\"Deno\");\n\n/**\n * @returns The Node.js `fs` module.\n */\nexport function getNodeFs() {\n return (globalThis as any).process.getBuiltinModule(\"node:fs\");\n}\n\n/**\n * @returns The Node.js `os` module.\n */\nexport function getNodeOs() {\n return (globalThis as any).process.getBuiltinModule(\"node:os\");\n}\n\n/**\n * @returns The Node.js `path` module.\n */\nexport function getNodePath() {\n return (globalThis as any).process.getBuiltinModule(\"node:path\");\n}\n\n/**\n * @returns The Node.js `process` module.\n */\nexport function getNodeProcess() {\n return (globalThis as any).process.getBuiltinModule(\"node:process\");\n}\n\n/**\n * @returns The Node.js `stream` module.\n */\nexport function getNodeStream() {\n return (globalThis as any).process.getBuiltinModule(\"node:stream\");\n}\n\n/**\n * @returns The Node.js `tty` module.\n */\nexport function getNodeTty() {\n return (globalThis as any).process.getBuiltinModule(\"node:tty\");\n}\n\n/**\n * @returns The Node.js `util` module.\n */\nexport function getNodeUtil() {\n return (globalThis as any).process.getBuiltinModule(\"node:util\");\n}\n\n/**\n * Used for naming temporary files. See {@linkcode makeTempFile} and\n * {@linkcode makeTempFileSync}.\n * @returns A randomized 6-digit hexadecimal string.\n */\nexport function randomId(): string {\n const bytes = new Uint8Array(3);\n crypto.getRandomValues(bytes);\n let result = \"\";\n for (const byte of bytes) {\n result += byte.toString(16).padStart(2, \"0\");\n }\n return result;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\n// @ts-self-types=\"./unstable_errors.d.ts\"\n\nimport { isDeno } from \"./_utils.ts\";\n\n// please keep sorted\nexport const AlreadyExists = isDeno\n ? Deno.errors.AlreadyExists\n : class AlreadyExists extends Error {};\nexport const BadResource = isDeno\n ? Deno.errors.BadResource\n : class BadResource extends Error {};\nexport const BrokenPipe = isDeno\n ? Deno.errors.BrokenPipe\n : class BrokenPipe extends Error {};\nexport const Busy = isDeno ? Deno.errors.Busy : class Busy extends Error {};\nexport const Interrupted = isDeno\n ? Deno.errors.Interrupted\n : class Interrupted extends Error {};\nexport const InvalidData = isDeno\n ? Deno.errors.InvalidData\n : class InvalidData extends Error {};\nexport const NotFound = isDeno\n ? Deno.errors.NotFound\n : class NotFound extends Error {};\nexport const PermissionDenied = isDeno\n ? Deno.errors.PermissionDenied\n : class PermissionDenied extends Error {};\nexport const TimedOut = isDeno\n ? Deno.errors.TimedOut\n : class TimedOut extends Error {};\nexport const UnexpectedEof = isDeno\n ? Deno.errors.UnexpectedEof\n : class UnexpectedEof extends Error {};\nexport const WriteZero = isDeno\n ? Deno.errors.WriteZero\n : class WriteZero extends Error {};\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport * as errors from \"./unstable_errors.js\";\n\ntype Class<T> = new (...params: unknown[]) => T;\n\ntype ClassOrT<T> = T extends Class<infer U> ? U : T;\n\nfunction mapper(Ctor: typeof errors[keyof typeof errors]) {\n return (err: Error) =>\n Object.assign(new Ctor(err.message), {\n stack: err.stack,\n }) as unknown as ClassOrT<typeof Ctor>;\n}\n\nconst map: Record<string, ReturnType<typeof mapper>> = {\n EEXIST: mapper(errors.AlreadyExists),\n ENOENT: mapper(errors.NotFound),\n EBADF: mapper(errors.BadResource),\n};\n\nfunction isNodeErr(e: unknown): e is Error & { code: string } {\n return e instanceof Error && \"code\" in e;\n}\n\nexport function mapError<E>(e: E) {\n if (!isNodeErr(e)) return e;\n return map[e.code]?.(e) || e;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport { getNodeFs, isDeno } from \"./_utils.ts\";\nimport { mapError } from \"./_map_error.ts\";\n\n/**\n * Options which can be set when using {@linkcode mkdir} and\n * {@linkcode mkdirSync}.\n */\nexport interface MkdirOptions {\n /**\n * If set to `true`, means that any intermediate directories will also be\n * created (as with the shell command `mkdir -p`).\n *\n * Intermediate directories are created with the same permissions.\n *\n * When recursive is set to `true`, succeeds silently (without changing any\n * permissions) if a directory already exists at the path, or if the path\n * is a symlink to an existing directory.\n *\n * @default {false}\n */\n recursive?: boolean;\n /**\n * Permissions to use when creating the directory (defaults to `0o777`,\n * before the process's umask).\n *\n * Ignored on Windows.\n */\n mode?: number;\n}\n\n/**\n * Creates a new directory with the specified path.\n *\n * Defaults to throwing error if the directory already exists.\n *\n * Requires `allow-write` permission.\n *\n * @example Usage\n * ```ts ignore\n * import { mkdir } from \"@std/fs/unstable-mkdir\";\n * await mkdir(\"new_dir\");\n * await mkdir(\"nested/directories\", { recursive: true });\n * await mkdir(\"restricted_access_dir\", { mode: 0o700 });\n * ```\n *\n * @tags allow-write\n *\n * @param path The path to the new directory.\n * @param options Options for creating directories.\n */\nexport async function mkdir(\n path: string | URL,\n options?: MkdirOptions,\n): Promise<void> {\n if (isDeno) {\n await Deno.mkdir(path, { ...options });\n } else {\n try {\n await getNodeFs().promises.mkdir(path, { ...options });\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n\n/**\n * Synchronously creates a new directory with the specified path.\n *\n * Defaults to throwing error if the directory already exists.\n *\n * Requires `allow-write` permission.\n *\n * @example Usage\n * ```ts ignore\n * import { mkdirSync } from \"@std/fs/unstable-mkdir\";\n * mkdirSync(\"new_dir\");\n * mkdirSync(\"nested/directories\", { recursive: true });\n * mkdirSync(\"restricted_access_dir\", { mode: 0o700 });\n * ```\n *\n * @tags allow-write\n *\n * @param path The path to the new directory.\n * @param options Options for creating directories.\n */\nexport function mkdirSync(path: string | URL, options?: MkdirOptions) {\n if (isDeno) {\n Deno.mkdirSync(path, { ...options });\n } else {\n try {\n getNodeFs().mkdirSync(path, { ...options });\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport type { FileInfo } from \"./unstable_types.ts\";\nimport { isWindows } from \"jsr:@std/internal@^1.0.12/os\";\n\nexport function toFileInfo(s: import(\"node:fs\").Stats): FileInfo {\n return {\n atime: s.atime,\n // TODO(kt3k): uncomment this when we drop support for Deno 1.x\n // ctime: s.ctime,\n birthtime: s.birthtime,\n blksize: isWindows ? null : s.blksize,\n blocks: isWindows ? null : s.blocks,\n dev: s.dev,\n gid: isWindows ? null : s.gid,\n ino: isWindows ? null : s.ino,\n isDirectory: s.isDirectory(),\n isFile: s.isFile(),\n isSymlink: s.isSymbolicLink(),\n isBlockDevice: isWindows ? null : s.isBlockDevice(),\n isCharDevice: isWindows ? null : s.isCharacterDevice(),\n isFifo: isWindows ? null : s.isFIFO(),\n isSocket: isWindows ? null : s.isSocket(),\n mode: isWindows ? null : s.mode,\n mtime: s.mtime,\n nlink: isWindows ? null : s.nlink,\n rdev: isWindows ? null : s.rdev,\n size: s.size,\n uid: isWindows ? null : s.uid,\n };\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport { getNodeFs, isDeno } from \"./_utils.ts\";\nimport { mapError } from \"./_map_error.ts\";\nimport { toFileInfo } from \"./_to_file_info.ts\";\nimport type { FileInfo } from \"./unstable_types.ts\";\n\n/**\n * Resolves to a {@linkcode FileInfo} for the specified `path`. Will\n * always follow symlinks.\n *\n * Requires `allow-read` permission in Deno.\n *\n * @example Usage\n * ```ts\n * import { assert } from \"@std/assert\";\n * import { stat } from \"@std/fs/unstable-stat\";\n * const fileInfo = await stat(\"README.md\");\n * assert(fileInfo.isFile);\n * ```\n *\n * @tags allow-read\n *\n * @param path The path to the file or directory.\n * @returns A promise that resolves to a {@linkcode FileInfo} for the specified `path`.\n */\nexport async function stat(path: string | URL): Promise<FileInfo> {\n if (isDeno) {\n return Deno.stat(path);\n } else {\n try {\n return toFileInfo(await getNodeFs().promises.stat(path));\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n\n/**\n * Synchronously returns a {@linkcode FileInfo} for the specified\n * `path`. Will always follow symlinks.\n *\n * Requires `allow-read` permission in Deno.\n *\n * @example Usage\n * ```ts\n * import { assert } from \"@std/assert\";\n * import { statSync } from \"@std/fs/unstable-stat\";\n *\n * const fileInfo = statSync(\"README.md\");\n * assert(fileInfo.isFile);\n * ```\n *\n * @tags allow-read\n *\n * @param path The path to the file or directory.\n * @returns A {@linkcode FileInfo} for the specified `path`.\n */\nexport function statSync(path: string | URL): FileInfo {\n if (isDeno) {\n return Deno.statSync(path);\n } else {\n try {\n return toFileInfo(getNodeFs().statSync(path));\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport { getNodeFs } from \"./_utils.ts\";\nimport type { WriteFileOptions } from \"./unstable_types.ts\";\nimport type { OpenOptions } from \"./unstable_open.ts\";\n\ntype WriteBooleanOptions = Pick<\n WriteFileOptions,\n \"append\" | \"create\" | \"createNew\"\n>;\n\ntype OpenBooleanOptions = Pick<\n OpenOptions,\n \"read\" | \"write\" | \"append\" | \"truncate\" | \"create\" | \"createNew\"\n>;\n\n/**\n * Uses the boolean options specified in {@linkcode WriteFileOptions} to\n * construct the composite flag value to pass to the `flag` option in the\n * Node.js `writeFile` function.\n */\nexport function getWriteFsFlag(opt: WriteBooleanOptions): number {\n const { O_APPEND, O_CREAT, O_EXCL, O_TRUNC, O_WRONLY } =\n getNodeFs().constants;\n\n let flag = O_WRONLY;\n if (opt.create) {\n flag |= O_CREAT;\n }\n if (opt.createNew) {\n flag |= O_EXCL;\n }\n if (opt.append) {\n flag |= O_APPEND;\n } else {\n flag |= O_TRUNC;\n }\n return flag;\n}\n\n/**\n * Uses the boolean options specified in {@linkcode OpenOptions} to construct the\n * composite flag value to pass to the `flag` option in the Node.js `open`\n * function.\n */\nexport function getOpenFsFlag(opt: OpenBooleanOptions): number {\n const { O_APPEND, O_CREAT, O_EXCL, O_WRONLY, O_RDONLY, O_RDWR, O_TRUNC } =\n getNodeFs().constants;\n\n if (\n !opt.read && !opt.write && !opt.append && !opt.truncate && !opt.create &&\n !opt.createNew\n ) {\n throw new Error(\"'options' requires at least one option to be true\");\n }\n\n if (!opt.write && opt.truncate) {\n throw new Error(\"'truncate' option requires 'write' to be true\");\n }\n\n if ((opt.create || opt.createNew) && !(opt.write || opt.append)) {\n throw new Error(\n \"'create' or 'createNew' options require 'write' or 'append' to be true\",\n );\n }\n\n // This error is added to match the Deno runtime. Deno throws a `TypeError`\n // (os error 22) for this OpenOption combo. Under Node.js, the bitmask\n // combinations of (O_RDWR | O_TRUNC | O_APPEND) and\n // (O_WRONLY | O_TRUNC | O_APPEND) to open files are valid.\n if (opt.write && opt.append && opt.truncate) {\n throw new TypeError(\"Invalid argument\");\n }\n\n let flag = O_RDONLY;\n if (opt.read && !opt.write) {\n flag |= O_RDONLY;\n }\n\n if (opt.read && opt.write) {\n flag |= O_RDWR;\n }\n\n if (!opt.read && opt.write) {\n flag |= O_WRONLY;\n }\n\n if (opt.create || opt.createNew) {\n flag |= O_CREAT;\n }\n\n if (opt.createNew) {\n flag |= O_EXCL;\n }\n\n if (opt.append) {\n flag |= O_APPEND;\n if (!opt.read) {\n flag |= O_WRONLY;\n } else {\n flag |= O_RDWR;\n }\n }\n\n if (opt.truncate) {\n flag |= O_TRUNC;\n }\n\n return flag;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport { getNodeFs, isDeno } from \"./_utils.ts\";\nimport { getWriteFsFlag } from \"./_get_fs_flag.ts\";\nimport { mapError } from \"./_map_error.ts\";\nimport type { WriteFileOptions } from \"./unstable_types.ts\";\n\n/**\n * Write `data` to the given `path`, by default creating a new file if needed,\n * else overwriting.\n *\n * Requires `allow-write` permission, and `allow-read` if `options.create` is\n * `false`.\n *\n * @example Usage\n * ```ts ignore\n * import { writeFile } from \"@std/fs/unstable-write-file\";\n * const encoder = new TextEncoder();\n * const data = encoder.encode(\"Hello world\\n\");\n * await Deno.writeFile(\"hello1.txt\", data); // overwrite \"hello1.txt\" or create it\n * await Deno.writeFile(\"hello2.txt\", data, { create: false }); // only works if \"hello2.txt\" exists\n * await Deno.writeFile(\"hello3.txt\", data, { mode: 0o777 }); // set permissions on new file\n * await Deno.writeFile(\"hello4.txt\", data, { append: true }); // add data to the end of the file\n * ```\n *\n * @tags allow-read, allow-write\n *\n * @param path The path of the file that `data` is written to.\n * @param data The content in bytes or a stream of bytes to be written.\n * @param options Options to write files. See {@linkcode WriteFileOptions}.\n */\nexport async function writeFile(\n path: string | URL,\n data: Uint8Array | ReadableStream<Uint8Array>,\n options?: WriteFileOptions,\n): Promise<void> {\n if (isDeno) {\n await Deno.writeFile(path, data, { ...options });\n } else {\n const {\n append = false,\n create = true,\n createNew = false,\n mode,\n signal,\n } = options ?? {};\n\n const flag = getWriteFsFlag({ append, create, createNew });\n try {\n await getNodeFs().promises.writeFile(path, data, { flag, signal });\n if (mode != null) {\n await getNodeFs().promises.chmod(path, mode);\n }\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n\n/**\n * Synchronously write `data` to the given `path`, by default creating a new\n * file if needed, else overwriting.\n *\n * Requires `allow-write` permission, and `allow-read` if `options.create` is\n * `false`.\n *\n * @example Usage\n * ```ts ignore\n * import { writeFileSync } from \"@std/fs/unstable-write-file\";\n * const encoder = new TextEncoder();\n * const data = encoder.encode(\"Hello world\\n\");\n * writeFileSync(\"hello1.txt\", data); // overwrite \"hello1.txt\" or create it\n * writeFileSync(\"hello2.txt\", data, { create: false }); // only works if \"hello2.txt\" exists\n * writeFileSync(\"hello3.txt\", data, { mode: 0o777 }); // set permissions on new file\n * writeFileSync(\"hello4.txt\", data, { append: true }); // add data to the end of the file\n * ```\n *\n * @tags allow-read, allow-write\n *\n * @param path The path of the file that `data` is written to.\n * @param data The content in bytes to be written.\n * @param options Options to write files. See {@linkcode WriteFileOptions}.\n */\nexport function writeFileSync(\n path: string | URL,\n data: Uint8Array,\n options?: WriteFileOptions,\n): void {\n if (isDeno) {\n Deno.writeFileSync(path, data, { ...options });\n } else {\n const {\n append = false,\n create = true,\n createNew = false,\n mode,\n signal,\n } = options ?? {};\n\n const flag = getWriteFsFlag({ append, create, createNew });\n try {\n getNodeFs().writeFileSync(path, data, { flag, signal });\n if (mode != null) {\n getNodeFs().chmodSync(path, mode);\n }\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport { getNodeFs, isDeno } from \"./_utils.ts\";\nimport { getWriteFsFlag } from \"./_get_fs_flag.ts\";\nimport { mapError } from \"./_map_error.ts\";\nimport type { WriteFileOptions } from \"./unstable_types.ts\";\n\n/**\n * Write string `data` to the given `path`, by default creating a new file if\n * needed, else overwriting.\n *\n * Requires `allow-write` permission, and `allow-read` if `options.create` is\n * `false`.\n *\n * @example Usage\n * ```ts ignore\n * import { writeTextFile } from \"@std/fs/unstable-write-text-file\";\n * await writeTextFile(\"hello1.txt\", \"Hello world\\n\"); // overwrite \"hello1.txt\" or create it\n * ```\n *\n * @tags allow-read, allow-write\n *\n * @param path The path of the file that `data` is written to.\n * @param data A UTF-8 string or a stream of UTF-8 strings.\n * @param options Options for writing files. See {@linkcode WriteFileOptions}.\n */\nexport async function writeTextFile(\n path: string | URL,\n data: string | ReadableStream<string>,\n options?: WriteFileOptions,\n): Promise<void> {\n if (isDeno) {\n await Deno.writeTextFile(path, data, { ...options });\n } else {\n const {\n append = false,\n create = true,\n createNew = false,\n mode,\n signal,\n } = options ?? {};\n\n const flag = getWriteFsFlag({ append, create, createNew });\n try {\n await getNodeFs().promises.writeFile(path, data, {\n encoding: \"utf-8\",\n flag,\n signal,\n });\n if (mode != null) {\n await getNodeFs().promises.chmod(path, mode);\n }\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n\n/**\n * Synchronously write string `data` to the given `path`, by default creating\n * a new file if needed, else overwriting.\n *\n * Requires `allow-write` permission, and `allow-read` if `options.create` is\n * `false`.\n *\n * @example Usage\n * ```ts ignore\n * import { writeTextFileSync } from \"@std/fs/unstable-write-text-file\";\n * writeTextFileSync(\"hello1.txt\", \"Hello world\\n\"); // overwrite \"hello1.txt\" or create it\n * ```\n *\n * @tags allow-read, allow-write\n *\n * @param path The path of the file that `data` is written to.\n * @param data A UTF-8 string.\n * @param options Options for writing files. See {@linkcode WriteFileOptions}.\n */\nexport function writeTextFileSync(\n path: string | URL,\n data: string,\n options?: WriteFileOptions,\n): void {\n if (isDeno) {\n Deno.writeTextFileSync(path, data, { ...options });\n } else {\n const {\n append = false,\n create = true,\n createNew = false,\n mode,\n } = options ?? {};\n\n const flag = getWriteFsFlag({ append, create, createNew });\n try {\n getNodeFs().writeFileSync(path, data, { encoding: \"utf-8\", flag });\n if (mode != null) {\n getNodeFs().chmodSync(path, mode);\n }\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n", "export * from \"npm:@babel/generator@^8.0.0-rc.5\";\nexport { default } from \"npm:@babel/generator@^8.0.0-rc.5\";\n", "export * from \"npm:@babel/traverse@^8.0.0-rc.5\";\nexport { default } from \"npm:@babel/traverse@^8.0.0-rc.5\";\n", "import type * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport * as babel from \"npm:@babel/parser@^8.0.0-rc.5\";\nimport { buildOptions } from \"./lib/options.ts\";\n\nexport {\n buildOptions,\n isParserPluginName,\n type ParserPluginName,\n} from \"./lib/options.ts\";\n\n/**\n * Wraps `parse` from `@babel/parser`, but sets default options such that as few\n * restrictions as possible are placed on the `input` code.\n */\nexport function parse(input: string, options?: babel.ParserOptions): t.File {\n return babel.parse(input, buildOptions(options));\n}\n\n/**\n * Wraps `parseExpression` from `@babel/parser`, but sets default options such that as few\n * restrictions as possible are placed on the `input` code.\n */\nexport function parseExpression(\n input: string,\n options?: babel.ParserOptions,\n): babel.ParseResult<t.Expression> {\n return babel.parseExpression(input, buildOptions(options));\n}\n", "import type {\n FlowPluginOptions,\n ParserOptions,\n ParserPlugin,\n PipelineOperatorPluginOptions,\n TypeScriptPluginOptions,\n} from \"npm:@babel/parser@^8.0.0-rc.5\";\n\nexport type ParserPluginName =\n | Extract<ParserPlugin, string>\n | Extract<ParserPlugin, [string, object]>[0];\n\ntype ParserPluginOptions = Extract<ParserPlugin, [string, object]>[1];\n\nconst DefaultParserPlugins = new Set<ParserPlugin>([\n \"asyncDoExpressions\",\n \"decorators\",\n \"decorators-legacy\",\n \"decoratorAutoAccessors\",\n \"deferredImportEvaluation\",\n \"destructuringPrivate\",\n \"doExpressions\",\n \"exportDefaultFrom\",\n \"functionBind\",\n \"functionSent\",\n \"importMeta\",\n \"jsx\",\n \"moduleBlocks\",\n \"sourcePhaseImports\",\n \"throwExpressions\",\n \"v8intrinsic\",\n [\"discardBinding\", { syntaxType: \"void\" }],\n [\"optionalChainingAssign\", { version: \"2023-07\" }],\n [\"partialApplication\", { version: \"2018-07\" }],\n [\"pipelineOperator\", { proposal: \"fsharp\" }],\n]);\n\nexport function isParserPluginName(name: string): name is ParserPluginName {\n for (const plugin of DefaultParserPlugins) {\n if (name === getPluginName(plugin)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Builds options for `@babel/parser` by enabling as many features as possible,\n * while also preserving the options given as an argument.\n */\nexport function buildOptions({\n sourceType = \"unambiguous\",\n allowAwaitOutsideFunction = true,\n allowImportExportEverywhere = true,\n allowReturnOutsideFunction = true,\n allowSuperOutsideMethod = true,\n allowUndeclaredExports = true,\n plugins = [],\n sourceFilename,\n ...rest\n}: ParserOptions = {}): ParserOptions {\n for (const plugin of DefaultParserPlugins) {\n if (shouldAddPlugin(plugins, plugin)) {\n plugins = [...plugins, plugin];\n }\n }\n\n const typePlugin = typePluginForSourceFileName(sourceFilename);\n\n if (shouldAddPlugin(plugins, typePlugin)) {\n plugins = [...plugins, typePlugin];\n }\n\n return {\n sourceType,\n allowAwaitOutsideFunction,\n allowImportExportEverywhere,\n allowReturnOutsideFunction,\n allowSuperOutsideMethod,\n allowUndeclaredExports,\n plugins,\n sourceFilename,\n ...rest,\n };\n}\n\n/**\n * Gets the type plugin to use for a given file name.\n *\n * @example\n *\n * typePluginForSourceFileName('index.ts'); // 'typescript'\n * typePluginForSourceFileName('index.jsx'); // 'flow'\n */\nfunction typePluginForSourceFileName(\n sourceFileName?: string,\n): \"flow\" | \"typescript\" {\n if (typeof sourceFileName === \"string\" && !/\\.tsx?$/i.test(sourceFileName)) {\n return \"flow\";\n } else {\n return \"typescript\";\n }\n}\n\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"discardBinding\",\n): { syntaxType: \"void\" } | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"estree\",\n): { classFeatures?: boolean } | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"optionalChainingAssign\",\n): { version: \"2023-07\" } | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"partialApplication\",\n): { version: \"2018-07\" } | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"pipelineOperator\",\n): PipelineOperatorPluginOptions | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"flow\",\n): FlowPluginOptions | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"typescript\",\n): TypeScriptPluginOptions | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: ParserPluginName,\n): ParserPluginOptions | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: ParserPluginName,\n): ParserPluginOptions | undefined {\n for (const plugin of plugins) {\n if (Array.isArray(plugin)) {\n if (plugin[0] === name) {\n return plugin[1];\n }\n } else if (plugin === name) {\n return {};\n }\n }\n}\n\n/**\n * Determines whether a plugin list can accept a new plugin by name.\n *\n * @example\n *\n * shouldAddPlugin([], 'jsx'); // true; existing list does not have \"jsx\"\n * shouldAddPlugin(['jsx', 'bigInt'], 'jsx'); // false; existing list already has \"jsx\"\n * shouldAddPlugin(['flow'], 'typescript'); // false; \"typescript\" is incompatible with \"flow\"\n */\nfunction shouldAddPlugin(\n plugins: Array<ParserPlugin>,\n plugin: ParserPlugin,\n): boolean {\n const name = getPluginName(plugin);\n\n if (pluginListIncludesPlugin(plugins, name)) {\n return false;\n }\n\n switch (name) {\n case \"flow\":\n case \"flowComments\":\n return !getPluginOptions(plugins, \"typescript\");\n\n case \"typescript\":\n return !(\n getPluginOptions(plugins, \"flow\") ||\n getPluginOptions(plugins, \"flowComments\")\n );\n\n case \"decorators\":\n return !getPluginOptions(plugins, \"decorators-legacy\");\n\n case \"decorators-legacy\":\n return !getPluginOptions(plugins, \"decorators\");\n\n case \"v8intrinsic\":\n return !getPluginOptions(plugins, \"placeholders\");\n\n case \"placeholders\":\n return !getPluginOptions(plugins, \"v8intrinsic\");\n\n default:\n return true;\n }\n}\n\n/**\n * Checks `plugins` for an entry named `name`.\n *\n * @example\n *\n * pluginListIncludesPlugin(['jsx', 'bigInt'], 'bigInt'); // true; list includes \"bigInt\" without options\n * pluginListIncludesPlugin(['jsx', 'bigInt'], 'flow'); // false; list does not include \"flow\"\n * pluginListIncludesPlugin(['jsx', ['flow', { all: true }]], 'flow'); // true; list includes \"flow\" with options\n */\nfunction pluginListIncludesPlugin(\n plugins: Array<ParserPlugin>,\n name: ParserPluginName,\n): boolean {\n return plugins.some((entry) => getPluginName(entry) === name);\n}\n\n/**\n * Gets the name of `plugin`.\n *\n * @example\n *\n * getPluginName('decorators'); // 'decorators'\n * getPluginName(['flow', { all: true }]); // 'flow'\n */\nexport function getPluginName(plugin: ParserPlugin): ParserPluginName {\n return typeof plugin === \"string\" ? plugin : plugin[0];\n}\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as generator from \"jsr:/@codemod/utils@^2.2.1/babel-generator\";\nimport traverse, {\n type TraverseOptions,\n type Visitor,\n visitors,\n} from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport { parse as codemodParse } from \"jsr:@codemod/parser@^2.1.0\";\nimport type {\n AsyncTransform,\n Transform,\n TransformState,\n} from \"../webcrack/ast-utils/transform.ts\";\nimport { createDebug } from \"npm:obug@^2.1.1\";\n\nconst logger = createDebug(\"delance:transforms\");\n\nexport function parse(code: string) {\n return codemodParse(code, {\n sourceType: \"script\",\n allowReturnOutsideFunction: true,\n });\n}\n\nexport function generate(ast: t.Node): string {\n return generator.generate(ast, {\n jsescOption: { minimal: true, quotes: \"single\" },\n }).code;\n}\n\nexport async function applyTransformAsync<TOptions>(\n ast: t.Node,\n transform: AsyncTransform<TOptions>,\n options?: TOptions,\n): Promise<TransformState> {\n logger(`${transform.name}: started`);\n const state: TransformState = { changes: 0 };\n\n await transform.run?.(ast, state, options);\n if (transform.visitor) {\n traverse(ast, transform.visitor(options), undefined, state);\n }\n\n logger(`${transform.name}: finished with ${state.changes} changes`);\n return state;\n}\n\nexport function applyTransform<TOptions>(\n ast: t.Node,\n transform: Transform<TOptions>,\n options?: TOptions,\n noScopeOverride?: boolean,\n): TransformState {\n logger(`${transform.name}: started`);\n const state: TransformState = { changes: 0 };\n transform.run?.(ast, state, options);\n\n if (transform.visitor) {\n const visitor = transform.visitor(options);\n visitor.noScope = noScopeOverride ?? !transform.scope;\n traverse(ast, visitor, undefined, state);\n }\n\n logger(`${transform.name}: finished with ${state.changes} changes`);\n return state;\n}\n\nexport function applyTransforms(\n ast: t.Node,\n transforms: Transform[],\n options: { noScope?: boolean; name?: string; log?: boolean } = {},\n): TransformState {\n options.log ??= true;\n const name = options.name ?? transforms.map((t) => t.name).join(\", \");\n if (options.log) {\n logger(`${name}: started`);\n }\n\n const state: TransformState = { changes: 0 };\n\n for (const transform of transforms) {\n transform.run?.(ast, state);\n }\n\n const traverseOptions = transforms.flatMap((t) => t.visitor?.() ?? []);\n if (traverseOptions.length > 0) {\n const visitor: TraverseOptions & Visitor<TransformState> = visitors.merge(\n traverseOptions,\n );\n visitor.noScope = options.noScope ?? transforms.every((t) => !t.scope);\n traverse(ast, visitor, undefined, state);\n }\n\n if (options.log) {\n logger(`${name}: finished with ${state.changes} changes`);\n }\n\n return state;\n}\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport traverse, {\n type TraverseOptions,\n type Visitor,\n visitors,\n} from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport { createDebug } from \"npm:obug@^2.1.1\";\n\nconst logger = createDebug(\"webcrack:transforms\");\n\nexport async function applyTransformAsync<TOptions>(\n ast: t.Node,\n transform: AsyncTransform<TOptions>,\n options?: TOptions,\n): Promise<TransformState> {\n logger(`${transform.name}: started`);\n const state: TransformState = { changes: 0 };\n\n await transform.run?.(ast, state, options);\n if (transform.visitor) {\n traverse(ast, transform.visitor(options), undefined, state);\n }\n\n logger(`${transform.name}: finished with ${state.changes} changes`);\n return state;\n}\n\nexport function applyTransform<TOptions>(\n ast: t.Node,\n transform: Transform<TOptions>,\n options?: TOptions,\n): TransformState {\n logger(`${transform.name}: started`);\n const state: TransformState = { changes: 0 };\n transform.run?.(ast, state, options);\n\n if (transform.visitor) {\n const visitor = transform.visitor(\n options,\n );\n visitor.noScope = !transform.scope;\n traverse(ast, visitor, undefined, state);\n }\n\n logger(`${transform.name}: finished with ${state.changes} changes`);\n return state;\n}\n\nexport function applyTransforms(\n ast: t.Node,\n transforms: Transform[],\n options: { noScope?: boolean; name?: string; log?: boolean } = {},\n): TransformState {\n options.log ??= true;\n const name = options.name ?? transforms.map((t) => t.name).join(\", \");\n if (options.log) logger(`${name}: started`);\n const state: TransformState = { changes: 0 };\n\n for (const transform of transforms) {\n transform.run?.(ast, state);\n }\n\n const traverseOptions = transforms.flatMap((t) => t.visitor?.() ?? []);\n if (traverseOptions.length > 0) {\n const visitor: TraverseOptions & Visitor<TransformState> = visitors.merge(\n traverseOptions,\n );\n visitor.noScope = options.noScope || transforms.every((t) => !t.scope);\n traverse(ast, visitor, undefined, state);\n }\n\n if (options.log) logger(`${name}: finished with ${state.changes} changes`);\n return state;\n}\n\nexport function mergeTransforms(options: {\n name: string;\n tags: Tag[];\n transforms: Transform[];\n}): Transform {\n return {\n name: options.name,\n tags: options.tags,\n scope: options.transforms.some((t) => t.scope),\n visitor() {\n return visitors.merge(\n options.transforms.flatMap((t) => t.visitor?.() ?? []),\n );\n },\n };\n}\n\nexport interface TransformState {\n changes: number;\n}\n\nexport interface Transform<TOptions = unknown> {\n name: string;\n tags: Tag[];\n scope?: boolean;\n run?: (ast: t.Node, state: TransformState, options?: TOptions) => void;\n visitor?: (options?: TOptions) => TraverseOptions & Visitor<TransformState>;\n}\n\nexport interface AsyncTransform<TOptions = unknown> extends\n Omit<\n Transform<TOptions>,\n \"run\"\n > {\n run?: (\n ast: t.Node,\n state: TransformState,\n options?: TOptions,\n ) => Promise<void>;\n}\n\nexport type Tag = \"safe\" | \"unsafe\";\n", "export * from \"npm:@babel/types@^8.0.0-rc.5\";\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { Matcher } from \"./Matcher.ts\";\n\nexport class AnyExpressionMatcher extends Matcher<t.Expression> {\n override matchValue(value: unknown): value is t.Expression {\n return t.isNode(value) && t.isExpression(value);\n }\n}\n\nexport function anyExpression(): Matcher<t.Expression> {\n return new AnyExpressionMatcher();\n}\n", "export class Matcher<T> {\n match(value: unknown, keys: ReadonlyArray<PropertyKey> = []): value is T {\n return this.matchValue(value, keys);\n }\n\n matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is T {\n void value;\n void keys;\n throw new Error(`${this.constructor.name}#matchValue is not implemented`);\n }\n}\n", "import type { SliceMatcher } from \"../matchers/slice.ts\";\n\n/**\n * Iterates through the possible allocations of `available` across `slices`.\n */\nexport function* distributeAcrossSlices(\n slices: Array<SliceMatcher<unknown>>,\n available: number,\n): IterableIterator<Array<number>> {\n if (slices.length === 0) {\n yield [];\n } else if (slices.length === 1) {\n const spacer = slices[0];\n\n if (spacer.min <= available && available <= spacer.max) {\n yield [available];\n }\n } else {\n const last = slices[slices.length - 1];\n\n for (\n let allocateToLast = last.min;\n allocateToLast <= last.max && allocateToLast <= available;\n allocateToLast++\n ) {\n const allButLast = slices.slice(0, -1);\n\n for (\n const allButLastAllocations of distributeAcrossSlices(\n allButLast,\n available - allocateToLast,\n )\n ) {\n yield [...allButLastAllocations, allocateToLast];\n }\n }\n }\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport class AnythingMatcher<T> extends Matcher<T> {\n override matchValue(_value: unknown): _value is T {\n return true;\n }\n}\n\nexport function anything<T>(): Matcher<T> {\n return new AnythingMatcher();\n}\n", "import { anything } from \"./anything.ts\";\nimport { Matcher } from \"./Matcher.ts\";\n\nexport class SliceMatcher<T> extends Matcher<T> {\n constructor(\n readonly min: number,\n readonly max: number,\n readonly matcher: Matcher<T>,\n ) {\n super();\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is T {\n return this.matcher.matchValue(value, keys);\n }\n}\n\n/**\n * Match zero or more elements. For use with `anyList`.\n *\n * @example\n *\n * ```ts\n * // matches `['foo', 1]` and `['foo', 'bar', 2]` and `['foo', 'bar', 'baz', 3]` but not `['foo']` or `['foo', 'bar']`\n * m.anyList([m.anyString(), m.zeroOrMore(), m.anyNumber()])\n * ```\n */\nexport function zeroOrMore<T>(\n matcher: Matcher<T> = anything(),\n): SliceMatcher<T> {\n return new SliceMatcher(0, Infinity, matcher);\n}\n\n/**\n * Match one or more elements. For use with `anyList`.\n *\n * @example\n *\n * ```ts\n * // matches `['foo']` and `['foo', 'bar']` but not `[]`\n * m.anyList([m.oneOrMore()])\n * ```\n */\nexport function oneOrMore<T>(\n matcher: Matcher<T> = anything(),\n): SliceMatcher<T> {\n return new SliceMatcher(1, Infinity, matcher);\n}\n\n/**\n * Options for {@link slice}.\n */\nexport interface SliceOptions<T> {\n min?: number;\n max?: number;\n matcher?: Matcher<T>;\n}\n\n/**\n * Match a slice of an array. For use with `anyList`.\n *\n * @example\n *\n * ```ts\n * // matches `['foo', 'bar', 'baz']` but not `['foo']` or `['foo', 'bar', 'baz', 'qux']`\n * m.anyList([m.anyString(), m.slice({ min: 1, max: 2 })])\n * ```\n */\nexport function slice<T>(options: SliceOptions<T>): SliceMatcher<T>;\n\n/**\n * Match a slice of an array of the given length. For use with `anyList`.\n *\n * @example\n *\n * ```ts\n * // matches `['foo', 'bar', 'baz']` but not `['foo']` or `['foo', 'bar', 'baz', 'qux']`\n * m.anyList([m.anyString(), m.slice(2)])\n * ```\n */\nexport function slice<T>(length: number, matcher?: Matcher<T>): SliceMatcher<T>;\n\n/**\n * Match a slice of an array. For use with `anyList`.\n *\n * @example\n *\n * ```ts\n * // matches `['foo', 'bar', 'baz']` but not `['foo']` or `['foo', 'bar', 'baz', 'qux']`\n * m.anyList([m.anyString(), m.slice({ min: 1, max: 2 })])\n * ```\n */\nexport function slice<T>(\n optionsOrLength: SliceOptions<T> | number,\n matcherOrUndefined?: Matcher<T>,\n): SliceMatcher<T> {\n let min: number;\n let max: number;\n let matcher: Matcher<T>;\n\n if (typeof optionsOrLength === \"number\") {\n min = optionsOrLength;\n max = optionsOrLength;\n matcher = matcherOrUndefined ?? anything();\n } else if (\n typeof optionsOrLength === \"object\" &&\n typeof matcherOrUndefined === \"undefined\"\n ) {\n min = optionsOrLength.min ?? 0;\n max = optionsOrLength.max ?? Infinity;\n matcher = optionsOrLength.matcher ?? anything();\n } else {\n throw new TypeError(\"Invalid arguments\");\n }\n\n return new SliceMatcher(min, max, matcher);\n}\n", "import { distributeAcrossSlices } from \"../utils/distributeAcrossSlices.ts\";\nimport { Matcher } from \"./Matcher.ts\";\nimport { SliceMatcher } from \"./slice.ts\";\n\nexport class AnyListMatcher<T> extends Matcher<Array<T>> {\n private readonly sliceMatchers: Array<SliceMatcher<T>> = [];\n\n constructor(private readonly matchers: Array<Matcher<T>>) {\n super();\n\n for (const matcher of matchers) {\n if (matcher instanceof SliceMatcher) {\n this.sliceMatchers.push(matcher as SliceMatcher<T>);\n }\n }\n }\n\n override matchValue(\n array: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): array is Array<T> {\n if (!Array.isArray(array)) {\n return false;\n }\n\n if (this.matchers.length === 0 && array.length === 0) {\n return true;\n }\n\n const spacerAllocations = distributeAcrossSlices(\n this.sliceMatchers,\n array.length - this.matchers.length + this.sliceMatchers.length,\n );\n\n for (const allocations of spacerAllocations) {\n const valuesToMatch: Array<T> = array.slice() as T[];\n let matchedAll = true;\n let key = 0;\n\n for (const matcher of this.matchers) {\n if (matcher instanceof SliceMatcher) {\n let sliceValueCount = allocations.shift() ?? 0;\n\n while (sliceValueCount > 0) {\n const valueToMatch = valuesToMatch.shift();\n if (!matcher.matchValue(valueToMatch, [...keys, key])) {\n matchedAll = false;\n break;\n }\n sliceValueCount--;\n key++;\n }\n } else if (!matcher.matchValue(valuesToMatch.shift(), [...keys, key])) {\n matchedAll = false;\n break;\n } else {\n key++;\n }\n }\n\n if (matchedAll) {\n if (valuesToMatch.length > 0) {\n throw new Error(\n `expected to consume all elements to match but ${valuesToMatch.length} remain!`,\n );\n }\n\n return true;\n }\n }\n\n return false;\n }\n}\n\nexport function anyList<T>(...elements: Array<Matcher<T>>): Matcher<Array<T>> {\n return new AnyListMatcher(elements);\n}\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { Matcher } from \"./Matcher.ts\";\n\nexport class AnyNodeMatcher extends Matcher<t.Node> {\n override matchValue(value: unknown): value is t.Node {\n return t.isNode(value);\n }\n}\n\nexport function anyNode(): Matcher<t.Node> {\n return new AnyNodeMatcher();\n}\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { Matcher } from \"./Matcher.ts\";\n\nexport class AnyStatementMatcher extends Matcher<t.Statement> {\n override matchValue(value: unknown): value is t.Statement {\n return t.isNode(value) && t.isStatement(value);\n }\n}\n\nexport function anyStatement(): Matcher<t.Statement> {\n return new AnyStatementMatcher();\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport class StringMatcher extends Matcher<string> {\n override matchValue(value: unknown): value is string {\n return typeof value === \"string\" || value instanceof String;\n }\n}\n\nexport function anyString(): Matcher<string> {\n return new StringMatcher();\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport class ArrayOfMatcher<T> extends Matcher<Array<T>> {\n constructor(private readonly elementMatcher: Matcher<T>) {\n super();\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is Array<T> {\n if (!Array.isArray(value)) {\n return false;\n }\n\n for (const [i, element] of value.entries()) {\n if (!this.elementMatcher.matchValue(element, [...keys, i])) {\n return false;\n }\n }\n\n return true;\n }\n}\n\nexport function arrayOf<T>(elementMatcher: Matcher<T>): Matcher<Array<T>> {\n return new ArrayOfMatcher(elementMatcher);\n}\n", "import { anything } from \"./anything.ts\";\nimport { Matcher } from \"./Matcher.ts\";\n\nexport interface CaptureBase {\n // deno-lint-ignore no-explicit-any\n [key: string]: any;\n}\n\nexport class CapturedMatcher<C, M = C> extends Matcher<M> {\n private _current?: C;\n private _currentKeys?: ReadonlyArray<PropertyKey>;\n\n constructor(private readonly matcher: Matcher<C> = anything()) {\n super();\n }\n\n get current(): C | undefined {\n return this._current;\n }\n\n get currentKeys(): ReadonlyArray<PropertyKey> | undefined {\n return this._currentKeys;\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is M {\n if (this.matcher.matchValue(value, keys)) {\n this.capture(value as unknown as C, keys);\n return true;\n } else {\n return false;\n }\n }\n\n protected capture(value: C, keys: ReadonlyArray<PropertyKey>): void {\n this._current = value;\n this._currentKeys = keys;\n }\n}\n\nexport function capture<C, M = C>(matcher?: Matcher<C>): CapturedMatcher<C, M> {\n return new CapturedMatcher(matcher);\n}\n", "import type { Matcher } from \"./Matcher.ts\";\nimport * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { CapturedMatcher } from \"./capture.ts\";\n\n/**\n * Matches and captures using another matcher by recursively checking all\n * descendants of a given node. The matched descendant is captured as the\n * current value of this capturing matcher.\n */\nexport class ContainerOfMatcher<\n C extends t.Node,\n M extends t.Node = C,\n> extends CapturedMatcher<C, M> {\n constructor(private readonly containedMatcher: Matcher<C>) {\n super();\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is M {\n if (!t.isNode(value)) {\n return false;\n }\n\n if (this.containedMatcher.matchValue(value, keys)) {\n this.capture(value, keys);\n return true;\n }\n\n for (const key in value) {\n const valueAtKey = value[key as keyof typeof value];\n if (Array.isArray(valueAtKey)) {\n for (const [i, element] of valueAtKey.entries()) {\n if (this.matchValue(element, [...keys, key, i])) {\n return true;\n }\n }\n } else if (this.matchValue(valueAtKey, [...keys, key])) {\n return true;\n }\n }\n\n return false;\n }\n}\n\nexport function containerOf<C extends t.Node, M extends t.Node = C>(\n containedMatcher: Matcher<C>,\n): ContainerOfMatcher<C, M> {\n return new ContainerOfMatcher(containedMatcher);\n}\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport type { CapturedMatcher } from \"./capture.ts\";\nimport { nodesEquivalent } from \"jsr:@codemod/utils@^2.2.0\";\nimport { Matcher } from \"./Matcher.ts\";\n\nexport class FromCaptureMatcher<T> extends Matcher<T> {\n constructor(private readonly capturedMatcher: CapturedMatcher<T>) {\n super();\n }\n\n override matchValue(value: unknown): value is T {\n if (t.isNode(this.capturedMatcher.current) && t.isNode(value)) {\n return nodesEquivalent(this.capturedMatcher.current, value);\n }\n return this.capturedMatcher.current === value;\n }\n}\n\nexport function fromCapture<T>(\n capturedMatcher: CapturedMatcher<T>,\n): Matcher<T> {\n return new FromCaptureMatcher(capturedMatcher);\n}\n", "import type { NodePath } from \"npm:@babel/traverse@^8.0.0-rc.5\";\nimport traverse from \"npm:@babel/traverse@^8.0.0-rc.5\";\nimport * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { parse } from \"jsr:@codemod/parser@^2.1.0\";\n\nexport type Replacement =\n | t.Statement\n | t.Expression\n | Array<t.Statement>\n | Array<t.Expression>;\n\nexport interface ReplacementsBase {\n [key: string]: Replacement;\n}\n\nexport function program<R extends ReplacementsBase>(\n template: string,\n): (replacements?: R) => t.File {\n const ast = parse(template, {\n plugins: [\"placeholders\"],\n });\n\n return (replacements = {} as R) => {\n const unusedReplacements = new Set(Object.keys(replacements));\n\n traverse(ast, {\n Placeholder(path: NodePath<t.Placeholder>): void {\n const name = path.node.name.name;\n const replacement = replacements[name];\n\n if (replacement !== undefined) {\n throw new Error(\n `no replacement found for placeholder with name: ${name}`,\n );\n }\n\n if (Array.isArray(replacement)) {\n path.replaceWithMultiple(replacement);\n } else {\n path.replaceWith(replacement);\n }\n\n unusedReplacements.delete(name);\n },\n });\n\n if (unusedReplacements.size > 0) {\n const names = Array.from(unusedReplacements).join(\", \");\n\n throw new Error(`template replacements were not used: ${names}`);\n }\n\n return ast;\n };\n}\n\nexport function statement<R extends ReplacementsBase>(\n template: string,\n): (replacements?: R) => t.Statement {\n const builder = program(template);\n return (replacements) =>\n getSingleStatement(builder(replacements).program.body);\n}\n\nexport function expression<R extends ReplacementsBase>(\n template: string,\n): (replacements?: R) => t.Expression {\n const builder = program(template);\n return (replacements) =>\n getSingleExpression(builder(replacements).program.body);\n}\n\nfunction getSingleStatement(statements: Array<t.Statement>): t.Statement {\n if (statements.length !== 1) {\n throw new TypeError(\n `expected a single statement but ${statements.length} statements`,\n );\n }\n\n return statements[0];\n}\n\nfunction getSingleExpression(statements: Array<t.Statement>): t.Expression {\n if (statements.length !== 1) {\n throw new TypeError(\n `expected a single expression but ${statements.length} statements`,\n );\n }\n\n const statement = statements[0];\n\n if (!t.isExpressionStatement(statement)) {\n throw new TypeError(\n `expected a single expression but got a single ${statement.type}`,\n );\n }\n\n return statement.expression;\n}\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { parse } from \"jsr:@codemod/parser@^2.1.0\";\nimport { NODE_FIELDS } from \"./NodeTypes.ts\";\n\nfunction fieldsForNodeType(nodeType: string): Set<string> {\n return new Set([\"type\", ...Object.keys(NODE_FIELDS[nodeType])]);\n}\n\nexport function js(code: string): t.File {\n return stripExtras(parse(code));\n}\n\nfunction stripExtras<N extends t.Node>(node: N): N {\n const fieldsToKeep = fieldsForNodeType(node.type) as Set<keyof typeof node>;\n const allFields = Object.keys(node) as (keyof typeof node)[];\n\n for (const field of allFields) {\n const nodeObj = node;\n\n if (!fieldsToKeep.has(field)) {\n delete nodeObj[field];\n } else {\n const children = Array.isArray(nodeObj[field])\n ? nodeObj[field]\n : [nodeObj[field]];\n\n for (const child of children) {\n if (t.isNode(child)) {\n stripExtras(child);\n }\n }\n }\n }\n\n return node;\n}\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\n\nexport interface ArrayValidator {\n each: Validator;\n}\n\nexport interface ChainOfValidator {\n chainOf: Array<Validator>;\n}\n\nexport interface OneOfValidator {\n oneOf: Array<string | boolean | number>;\n}\n\nexport interface OneOfNodeTypesValidator {\n oneOfNodeTypes: Array<string>;\n}\n\nexport interface OneOfNodeOrValueTypesValidator {\n oneOfNodeOrValueTypes: Array<string>;\n}\n\nexport interface Type {\n type: string;\n}\n\nexport type Validator =\n | ArrayValidator\n | ChainOfValidator\n | OneOfValidator\n | OneOfNodeTypesValidator\n | OneOfNodeOrValueTypesValidator\n | Type;\n\nexport interface BuilderKeysByType {\n [key: string]: Array<string>;\n}\n\nexport interface NodeFieldsByType {\n [key: string]: NodeFields;\n}\n\nexport interface NodeFields {\n [key: string]: NodeField;\n}\n\nexport interface NodeField<T = unknown> {\n default: T | null;\n optional?: boolean;\n validate: Validator;\n}\n\nexport const BUILDER_KEYS = t.BUILDER_KEYS as BuilderKeysByType;\nexport const NODE_FIELDS = t.NODE_FIELDS as NodeFieldsByType;\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { NODE_FIELDS } from \"./NodeTypes.ts\";\n\n/**\n * Determines whether two `@babel/types` nodes are equivalent.\n */\nexport function nodesEquivalent(a: t.Node, b: t.Node): boolean {\n if (a === b) {\n return true;\n }\n\n if (a.type !== b.type) {\n return false;\n }\n\n const fields = NODE_FIELDS[a.type];\n const aProps = a as unknown as { [key: string]: unknown };\n const bProps = b as unknown as { [key: string]: unknown };\n\n for (const [k, field] of Object.entries(fields)) {\n const key = k as keyof typeof fields;\n\n if (field.optional && aProps[key] == null && bProps[key] == null) {\n continue;\n }\n\n const aVal = aProps[key];\n const bVal = bProps[key];\n\n if (aVal === bVal) {\n continue;\n }\n\n if (aVal == null || bVal == null) {\n return false;\n }\n\n if (Array.isArray(aVal) && Array.isArray(bVal)) {\n if (aVal.length !== bVal.length) {\n return false;\n }\n\n for (let i = 0; i < aVal.length; i++) {\n if (!nodesEquivalent(aVal[i] as t.Node, bVal[i] as t.Node)) {\n return false;\n }\n }\n\n continue;\n }\n\n if (t.isNode(aVal) && t.isNode(bVal)) {\n if (!nodesEquivalent(aVal, bVal)) {\n return false;\n }\n\n continue;\n }\n\n return false;\n }\n\n return true;\n}\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { Matcher } from \"./Matcher.ts\";\nimport { tupleOf } from \"./tupleOf.ts\";\n\nexport class FunctionMatcher extends Matcher<t.Function> {\n constructor(\n private readonly params?: Matcher<Array<t.LVal>> | Array<Matcher<t.LVal>>,\n private readonly body?: Matcher<t.Expression | t.BlockStatement>,\n ) {\n super();\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is t.Function {\n if (!t.isNode(value) || !t.isFunction(value)) {\n return false;\n }\n\n if (this.params) {\n if (Array.isArray(this.params)) {\n if (\n !tupleOf(...this.params).matchValue(value.params, [...keys, \"params\"])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(value.params, [...keys, \"params\"])) {\n return false;\n }\n }\n\n if (this.body && !this.body.matchValue(value.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function Function(\n params?: Matcher<Array<t.LVal>> | Array<Matcher<t.LVal>>,\n body?: Matcher<t.Expression | t.BlockStatement>,\n): Matcher<t.Function> {\n return new FunctionMatcher(params, body);\n}\n\nexport { Function as function };\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport class TupleOfMatcher<\n T,\n A extends Array<T> = Array<T>,\n> extends Matcher<A> {\n private readonly matchers: Array<Matcher<T>>;\n\n constructor(...matchers: Array<Matcher<T>>) {\n super();\n this.matchers = matchers;\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is A {\n if (!Array.isArray(value)) {\n return false;\n }\n\n if (value.length !== this.matchers.length) {\n return false;\n }\n\n for (let i = 0; i < this.matchers.length; i++) {\n const matcher = this.matchers[i];\n const element: unknown = value[i];\n\n if (!matcher.matchValue(element, [...keys, i])) {\n return false;\n }\n }\n\n return true;\n }\n}\n\nexport function tupleOf<T, A extends Array<T> = Array<T>>(\n ...matchers: Array<Matcher<T>>\n): Matcher<A> {\n return new TupleOfMatcher(...matchers);\n}\n", "/* DO NOT EDIT. This file was generated by 'script/rebuild' */\n// deno-lint-ignore-file\n\nimport * as t from \"npm:@babel/types@^8.0.0-rc.5\";\n\nimport { tupleOf } from \"./tupleOf.ts\";\nimport { Matcher } from \"./Matcher.ts\";\n\n// aliases for keyword-named functions\n\nexport { Import as import };\nexport { Super as super };\n\nexport class AnyTypeAnnotationMatcher extends Matcher<t.AnyTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.AnyTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isAnyTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function anyTypeAnnotation(): Matcher<t.AnyTypeAnnotation> {\n return new AnyTypeAnnotationMatcher();\n}\nexport class ArgumentPlaceholderMatcher extends Matcher<t.ArgumentPlaceholder> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ArgumentPlaceholder {\n if (\n !t.isNode(node) ||\n !t.isArgumentPlaceholder(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function argumentPlaceholder(): Matcher<t.ArgumentPlaceholder> {\n return new ArgumentPlaceholderMatcher();\n}\nexport class ArrayExpressionMatcher extends Matcher<t.ArrayExpression> {\n constructor(\n private readonly elements?:\n | Matcher<Array<null | t.Expression | t.SpreadElement>>\n | Array<Matcher<null> | Matcher<t.Expression> | Matcher<t.SpreadElement>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ArrayExpression {\n if (\n !t.isNode(node) ||\n !t.isArrayExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.elements === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.elements)) {\n if (\n !tupleOf<unknown>(...this.elements).matchValue(node.elements, [\n ...keys,\n \"elements\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.elements.matchValue(node.elements, [...keys, \"elements\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function arrayExpression(\n elements?:\n | Matcher<Array<null | t.Expression | t.SpreadElement>>\n | Array<Matcher<null> | Matcher<t.Expression> | Matcher<t.SpreadElement>>,\n): Matcher<t.ArrayExpression> {\n return new ArrayExpressionMatcher(\n elements,\n );\n}\nexport class ArrayPatternMatcher extends Matcher<t.ArrayPattern> {\n constructor(\n private readonly elements?:\n | Matcher<Array<null | t.PatternLike>>\n | Array<Matcher<null> | Matcher<t.PatternLike>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ArrayPattern {\n if (\n !t.isNode(node) ||\n !t.isArrayPattern(node)\n ) {\n return false;\n }\n\n if (typeof this.elements === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.elements)) {\n if (\n !tupleOf<unknown>(...this.elements).matchValue(node.elements, [\n ...keys,\n \"elements\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.elements.matchValue(node.elements, [...keys, \"elements\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function arrayPattern(\n elements?:\n | Matcher<Array<null | t.PatternLike>>\n | Array<Matcher<null> | Matcher<t.PatternLike>>,\n): Matcher<t.ArrayPattern> {\n return new ArrayPatternMatcher(\n elements,\n );\n}\nexport class ArrayTypeAnnotationMatcher extends Matcher<t.ArrayTypeAnnotation> {\n constructor(\n private readonly elementType?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ArrayTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isArrayTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.elementType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.elementType.matchValue(node.elementType, [...keys, \"elementType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function arrayTypeAnnotation(\n elementType?: Matcher<t.FlowType>,\n): Matcher<t.ArrayTypeAnnotation> {\n return new ArrayTypeAnnotationMatcher(\n elementType,\n );\n}\nexport class ArrowFunctionExpressionMatcher\n extends Matcher<t.ArrowFunctionExpression> {\n constructor(\n private readonly params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n private readonly body?: Matcher<t.BlockStatement | t.Expression>,\n private readonly async?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ArrowFunctionExpression {\n if (\n !t.isNode(node) ||\n !t.isArrowFunctionExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.async === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.async === \"boolean\") {\n if (this.async !== node.async) {\n return false;\n }\n } else if (!this.async.matchValue(node.async, [...keys, \"async\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function arrowFunctionExpression(\n params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n body?: Matcher<t.BlockStatement | t.Expression>,\n async?: Matcher<boolean> | boolean,\n): Matcher<t.ArrowFunctionExpression> {\n return new ArrowFunctionExpressionMatcher(\n params,\n body,\n async,\n );\n}\nexport class AssignmentExpressionMatcher\n extends Matcher<t.AssignmentExpression> {\n constructor(\n private readonly operator?:\n | Matcher<\n | \"=\"\n | \"+=\"\n | \"-=\"\n | \"/=\"\n | \"%=\"\n | \"*=\"\n | \"**=\"\n | \"&=\"\n | \"|=\"\n | \">>=\"\n | \">>>=\"\n | \"<<=\"\n | \"^=\"\n | \"||=\"\n | \"&&=\"\n | \"??=\"\n >\n | string,\n private readonly left?: Matcher<\n | t.Identifier\n | t.MemberExpression\n | t.OptionalMemberExpression\n | t.ArrayPattern\n | t.ObjectPattern\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n private readonly right?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.AssignmentExpression {\n if (\n !t.isNode(node) ||\n !t.isAssignmentExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.operator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.operator === \"string\") {\n if (this.operator !== node.operator) {\n return false;\n }\n } else if (\n !this.operator.matchValue(node.operator, [...keys, \"operator\"])\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function assignmentExpression(\n operator?:\n | Matcher<\n | \"=\"\n | \"+=\"\n | \"-=\"\n | \"/=\"\n | \"%=\"\n | \"*=\"\n | \"**=\"\n | \"&=\"\n | \"|=\"\n | \">>=\"\n | \">>>=\"\n | \"<<=\"\n | \"^=\"\n | \"||=\"\n | \"&&=\"\n | \"??=\"\n >\n | string,\n left?: Matcher<\n | t.Identifier\n | t.MemberExpression\n | t.OptionalMemberExpression\n | t.ArrayPattern\n | t.ObjectPattern\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n right?: Matcher<t.Expression>,\n): Matcher<t.AssignmentExpression> {\n return new AssignmentExpressionMatcher(\n operator,\n left,\n right,\n );\n}\nexport class AssignmentPatternMatcher extends Matcher<t.AssignmentPattern> {\n constructor(\n private readonly left?: Matcher<\n | t.Identifier\n | t.ObjectPattern\n | t.ArrayPattern\n | t.MemberExpression\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n private readonly right?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.AssignmentPattern {\n if (\n !t.isNode(node) ||\n !t.isAssignmentPattern(node)\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function assignmentPattern(\n left?: Matcher<\n | t.Identifier\n | t.ObjectPattern\n | t.ArrayPattern\n | t.MemberExpression\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n right?: Matcher<t.Expression>,\n): Matcher<t.AssignmentPattern> {\n return new AssignmentPatternMatcher(\n left,\n right,\n );\n}\nexport class AwaitExpressionMatcher extends Matcher<t.AwaitExpression> {\n constructor(\n private readonly argument?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.AwaitExpression {\n if (\n !t.isNode(node) ||\n !t.isAwaitExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function awaitExpression(\n argument?: Matcher<t.Expression>,\n): Matcher<t.AwaitExpression> {\n return new AwaitExpressionMatcher(\n argument,\n );\n}\nexport class BigIntLiteralMatcher extends Matcher<t.BigIntLiteral> {\n constructor(\n private readonly value?: Matcher<bigint> | bigint,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BigIntLiteral {\n if (\n !t.isNode(node) ||\n !t.isBigIntLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"bigint\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function bigIntLiteral(\n value?: Matcher<bigint> | bigint,\n): Matcher<t.BigIntLiteral> {\n return new BigIntLiteralMatcher(\n value,\n );\n}\nexport class BigIntLiteralTypeAnnotationMatcher\n extends Matcher<t.BigIntLiteralTypeAnnotation> {\n constructor(\n private readonly value?: Matcher<bigint> | bigint,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BigIntLiteralTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isBigIntLiteralTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"bigint\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function bigIntLiteralTypeAnnotation(\n value?: Matcher<bigint> | bigint,\n): Matcher<t.BigIntLiteralTypeAnnotation> {\n return new BigIntLiteralTypeAnnotationMatcher(\n value,\n );\n}\nexport class BinaryExpressionMatcher extends Matcher<t.BinaryExpression> {\n constructor(\n private readonly operator?:\n | Matcher<\n | \"+\"\n | \"-\"\n | \"/\"\n | \"%\"\n | \"*\"\n | \"**\"\n | \"&\"\n | \"|\"\n | \">>\"\n | \">>>\"\n | \"<<\"\n | \"^\"\n | \"==\"\n | \"===\"\n | \"!=\"\n | \"!==\"\n | \"in\"\n | \"instanceof\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\"\n | \"|>\"\n >\n | string,\n private readonly left?: Matcher<t.Expression | t.PrivateName>,\n private readonly right?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BinaryExpression {\n if (\n !t.isNode(node) ||\n !t.isBinaryExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.operator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.operator === \"string\") {\n if (this.operator !== node.operator) {\n return false;\n }\n } else if (\n !this.operator.matchValue(node.operator, [...keys, \"operator\"])\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function binaryExpression(\n operator?:\n | Matcher<\n | \"+\"\n | \"-\"\n | \"/\"\n | \"%\"\n | \"*\"\n | \"**\"\n | \"&\"\n | \"|\"\n | \">>\"\n | \">>>\"\n | \"<<\"\n | \"^\"\n | \"==\"\n | \"===\"\n | \"!=\"\n | \"!==\"\n | \"in\"\n | \"instanceof\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\"\n | \"|>\"\n >\n | string,\n left?: Matcher<t.Expression | t.PrivateName>,\n right?: Matcher<t.Expression>,\n): Matcher<t.BinaryExpression> {\n return new BinaryExpressionMatcher(\n operator,\n left,\n right,\n );\n}\nexport class BindExpressionMatcher extends Matcher<t.BindExpression> {\n constructor(\n private readonly object?: Matcher<null | t.Expression>,\n private readonly callee?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BindExpression {\n if (\n !t.isNode(node) ||\n !t.isBindExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.object === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.object.matchValue(node.object, [...keys, \"object\"])) {\n return false;\n }\n\n if (typeof this.callee === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.callee.matchValue(node.callee, [...keys, \"callee\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function bindExpression(\n object?: Matcher<null | t.Expression>,\n callee?: Matcher<t.Expression>,\n): Matcher<t.BindExpression> {\n return new BindExpressionMatcher(\n object,\n callee,\n );\n}\nexport class BlockStatementMatcher extends Matcher<t.BlockStatement> {\n constructor(\n private readonly body?:\n | Matcher<Array<t.Statement>>\n | Array<Matcher<t.Statement>>,\n private readonly directives?:\n | Matcher<Array<t.Directive>>\n | Array<Matcher<t.Directive>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BlockStatement {\n if (\n !t.isNode(node) ||\n !t.isBlockStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.body)) {\n if (\n !tupleOf<unknown>(...this.body).matchValue(node.body, [...keys, \"body\"])\n ) {\n return false;\n }\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.directives === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.directives)) {\n if (\n !tupleOf<unknown>(...this.directives).matchValue(node.directives, [\n ...keys,\n \"directives\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.directives.matchValue(node.directives, [...keys, \"directives\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function blockStatement(\n body?: Matcher<Array<t.Statement>> | Array<Matcher<t.Statement>>,\n directives?: Matcher<Array<t.Directive>> | Array<Matcher<t.Directive>>,\n): Matcher<t.BlockStatement> {\n return new BlockStatementMatcher(\n body,\n directives,\n );\n}\nexport class BooleanLiteralMatcher extends Matcher<t.BooleanLiteral> {\n constructor(\n private readonly value?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BooleanLiteral {\n if (\n !t.isNode(node) ||\n !t.isBooleanLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"boolean\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function booleanLiteral(\n value?: Matcher<boolean> | boolean,\n): Matcher<t.BooleanLiteral> {\n return new BooleanLiteralMatcher(\n value,\n );\n}\nexport class BooleanLiteralTypeAnnotationMatcher\n extends Matcher<t.BooleanLiteralTypeAnnotation> {\n constructor(\n private readonly value?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BooleanLiteralTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isBooleanLiteralTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"boolean\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function booleanLiteralTypeAnnotation(\n value?: Matcher<boolean> | boolean,\n): Matcher<t.BooleanLiteralTypeAnnotation> {\n return new BooleanLiteralTypeAnnotationMatcher(\n value,\n );\n}\nexport class BooleanTypeAnnotationMatcher\n extends Matcher<t.BooleanTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BooleanTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isBooleanTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function booleanTypeAnnotation(): Matcher<t.BooleanTypeAnnotation> {\n return new BooleanTypeAnnotationMatcher();\n}\nexport class BreakStatementMatcher extends Matcher<t.BreakStatement> {\n constructor(\n private readonly label?: Matcher<t.Identifier> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BreakStatement {\n if (\n !t.isNode(node) ||\n !t.isBreakStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.label === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.label === null) {\n // null matcher means we expect null value\n if (node.label !== null) {\n return false;\n }\n } else if (!this.label.matchValue(node.label, [...keys, \"label\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function breakStatement(\n label?: Matcher<t.Identifier> | null,\n): Matcher<t.BreakStatement> {\n return new BreakStatementMatcher(\n label,\n );\n}\nexport class CallExpressionMatcher extends Matcher<t.CallExpression> {\n constructor(\n private readonly callee?: Matcher<\n t.Expression | t.Super | t.Import | t.V8IntrinsicIdentifier\n >,\n private readonly _arguments?:\n | Matcher<Array<t.Expression | t.SpreadElement | t.ArgumentPlaceholder>>\n | Array<\n | Matcher<t.Expression>\n | Matcher<t.SpreadElement>\n | Matcher<t.ArgumentPlaceholder>\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.CallExpression {\n if (\n !t.isNode(node) ||\n !t.isCallExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.callee === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.callee.matchValue(node.callee, [...keys, \"callee\"])) {\n return false;\n }\n\n if (typeof this._arguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this._arguments)) {\n if (\n !tupleOf<unknown>(...this._arguments).matchValue(node.arguments, [\n ...keys,\n \"arguments\",\n ])\n ) {\n return false;\n }\n } else if (\n !this._arguments.matchValue(node.arguments, [...keys, \"arguments\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function callExpression(\n callee?: Matcher<t.Expression | t.Super | t.Import | t.V8IntrinsicIdentifier>,\n _arguments?:\n | Matcher<Array<t.Expression | t.SpreadElement | t.ArgumentPlaceholder>>\n | Array<\n | Matcher<t.Expression>\n | Matcher<t.SpreadElement>\n | Matcher<t.ArgumentPlaceholder>\n >,\n): Matcher<t.CallExpression> {\n return new CallExpressionMatcher(\n callee,\n _arguments,\n );\n}\nexport class CatchClauseMatcher extends Matcher<t.CatchClause> {\n constructor(\n private readonly param?:\n | Matcher<t.Identifier | t.ArrayPattern | t.ObjectPattern>\n | null,\n private readonly body?: Matcher<t.BlockStatement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.CatchClause {\n if (\n !t.isNode(node) ||\n !t.isCatchClause(node)\n ) {\n return false;\n }\n\n if (typeof this.param === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.param === null) {\n // null matcher means we expect null value\n if (node.param !== null) {\n return false;\n }\n } else if (!this.param.matchValue(node.param, [...keys, \"param\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function catchClause(\n param?: Matcher<t.Identifier | t.ArrayPattern | t.ObjectPattern> | null,\n body?: Matcher<t.BlockStatement>,\n): Matcher<t.CatchClause> {\n return new CatchClauseMatcher(\n param,\n body,\n );\n}\nexport class ClassAccessorPropertyMatcher\n extends Matcher<t.ClassAccessorProperty> {\n constructor(\n private readonly key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n | t.PrivateName\n >,\n private readonly value?: Matcher<t.Expression> | null,\n private readonly typeAnnotation?:\n | Matcher<t.TypeAnnotation | t.TSTypeAnnotation>\n | null,\n private readonly decorators?:\n | Matcher<Array<t.Decorator>>\n | Array<Matcher<t.Decorator>>\n | null,\n private readonly computed?: Matcher<boolean> | boolean,\n private readonly _static?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassAccessorProperty {\n if (\n !t.isNode(node) ||\n !t.isClassAccessorProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.value === null) {\n // null matcher means we expect null value\n if (node.value !== null) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeAnnotation === null) {\n // null matcher means we expect null value\n if (node.typeAnnotation !== null) {\n return false;\n }\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.decorators === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.decorators === null) {\n // null matcher means we expect null value\n if (node.decorators !== null) {\n return false;\n }\n } else if (Array.isArray(this.decorators)) {\n if (\n !tupleOf<unknown>(...this.decorators).matchValue(node.decorators, [\n ...keys,\n \"decorators\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.decorators.matchValue(node.decorators, [...keys, \"decorators\"])\n ) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n if (typeof this._static === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._static === \"boolean\") {\n if (this._static !== node.static) {\n return false;\n }\n } else if (!this._static.matchValue(node.static, [...keys, \"static\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classAccessorProperty(\n key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n | t.PrivateName\n >,\n value?: Matcher<t.Expression> | null,\n typeAnnotation?: Matcher<t.TypeAnnotation | t.TSTypeAnnotation> | null,\n decorators?: Matcher<Array<t.Decorator>> | Array<Matcher<t.Decorator>> | null,\n computed?: Matcher<boolean> | boolean,\n _static?: Matcher<boolean> | boolean,\n): Matcher<t.ClassAccessorProperty> {\n return new ClassAccessorPropertyMatcher(\n key,\n value,\n typeAnnotation,\n decorators,\n computed,\n _static,\n );\n}\nexport class ClassBodyMatcher extends Matcher<t.ClassBody> {\n constructor(\n private readonly body?:\n | Matcher<\n Array<\n | t.ClassMethod\n | t.ClassPrivateMethod\n | t.ClassProperty\n | t.ClassPrivateProperty\n | t.ClassAccessorProperty\n | t.TSDeclareMethod\n | t.TSIndexSignature\n | t.StaticBlock\n >\n >\n | Array<\n | Matcher<t.ClassMethod>\n | Matcher<t.ClassPrivateMethod>\n | Matcher<t.ClassProperty>\n | Matcher<t.ClassPrivateProperty>\n | Matcher<t.ClassAccessorProperty>\n | Matcher<t.TSDeclareMethod>\n | Matcher<t.TSIndexSignature>\n | Matcher<t.StaticBlock>\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassBody {\n if (\n !t.isNode(node) ||\n !t.isClassBody(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.body)) {\n if (\n !tupleOf<unknown>(...this.body).matchValue(node.body, [...keys, \"body\"])\n ) {\n return false;\n }\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classBody(\n body?:\n | Matcher<\n Array<\n | t.ClassMethod\n | t.ClassPrivateMethod\n | t.ClassProperty\n | t.ClassPrivateProperty\n | t.ClassAccessorProperty\n | t.TSDeclareMethod\n | t.TSIndexSignature\n | t.StaticBlock\n >\n >\n | Array<\n | Matcher<t.ClassMethod>\n | Matcher<t.ClassPrivateMethod>\n | Matcher<t.ClassProperty>\n | Matcher<t.ClassPrivateProperty>\n | Matcher<t.ClassAccessorProperty>\n | Matcher<t.TSDeclareMethod>\n | Matcher<t.TSIndexSignature>\n | Matcher<t.StaticBlock>\n >,\n): Matcher<t.ClassBody> {\n return new ClassBodyMatcher(\n body,\n );\n}\nexport class ClassDeclarationMatcher extends Matcher<t.ClassDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier> | null,\n private readonly superClass?: Matcher<t.Expression> | null,\n private readonly body?: Matcher<t.ClassBody>,\n private readonly decorators?:\n | Matcher<Array<t.Decorator>>\n | Array<Matcher<t.Decorator>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassDeclaration {\n if (\n !t.isNode(node) ||\n !t.isClassDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.id === null) {\n // null matcher means we expect null value\n if (node.id !== null) {\n return false;\n }\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.superClass === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.superClass === null) {\n // null matcher means we expect null value\n if (node.superClass !== null) {\n return false;\n }\n } else if (\n !this.superClass.matchValue(node.superClass, [...keys, \"superClass\"])\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.decorators === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.decorators === null) {\n // null matcher means we expect null value\n if (node.decorators !== null) {\n return false;\n }\n } else if (Array.isArray(this.decorators)) {\n if (\n !tupleOf<unknown>(...this.decorators).matchValue(node.decorators, [\n ...keys,\n \"decorators\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.decorators.matchValue(node.decorators, [...keys, \"decorators\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classDeclaration(\n id?: Matcher<t.Identifier> | null,\n superClass?: Matcher<t.Expression> | null,\n body?: Matcher<t.ClassBody>,\n decorators?: Matcher<Array<t.Decorator>> | Array<Matcher<t.Decorator>> | null,\n): Matcher<t.ClassDeclaration> {\n return new ClassDeclarationMatcher(\n id,\n superClass,\n body,\n decorators,\n );\n}\nexport class ClassExpressionMatcher extends Matcher<t.ClassExpression> {\n constructor(\n private readonly id?: Matcher<t.Identifier> | null,\n private readonly superClass?: Matcher<t.Expression> | null,\n private readonly body?: Matcher<t.ClassBody>,\n private readonly decorators?:\n | Matcher<Array<t.Decorator>>\n | Array<Matcher<t.Decorator>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassExpression {\n if (\n !t.isNode(node) ||\n !t.isClassExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.id === null) {\n // null matcher means we expect null value\n if (node.id !== null) {\n return false;\n }\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.superClass === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.superClass === null) {\n // null matcher means we expect null value\n if (node.superClass !== null) {\n return false;\n }\n } else if (\n !this.superClass.matchValue(node.superClass, [...keys, \"superClass\"])\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.decorators === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.decorators === null) {\n // null matcher means we expect null value\n if (node.decorators !== null) {\n return false;\n }\n } else if (Array.isArray(this.decorators)) {\n if (\n !tupleOf<unknown>(...this.decorators).matchValue(node.decorators, [\n ...keys,\n \"decorators\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.decorators.matchValue(node.decorators, [...keys, \"decorators\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classExpression(\n id?: Matcher<t.Identifier> | null,\n superClass?: Matcher<t.Expression> | null,\n body?: Matcher<t.ClassBody>,\n decorators?: Matcher<Array<t.Decorator>> | Array<Matcher<t.Decorator>> | null,\n): Matcher<t.ClassExpression> {\n return new ClassExpressionMatcher(\n id,\n superClass,\n body,\n decorators,\n );\n}\nexport class ClassImplementsMatcher extends Matcher<t.ClassImplements> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassImplements {\n if (\n !t.isNode(node) ||\n !t.isClassImplements(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classImplements(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterInstantiation> | null,\n): Matcher<t.ClassImplements> {\n return new ClassImplementsMatcher(\n id,\n typeParameters,\n );\n}\nexport class ClassMethodMatcher extends Matcher<t.ClassMethod> {\n constructor(\n private readonly kind?:\n | Matcher<\"get\" | \"set\" | \"method\" | \"constructor\">\n | string,\n private readonly key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n >,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter | t.TSParameterProperty>>\n | Array<Matcher<t.FunctionParameter> | Matcher<t.TSParameterProperty>>,\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly computed?: Matcher<boolean> | boolean,\n private readonly _static?: Matcher<boolean> | boolean,\n private readonly generator?: Matcher<boolean> | boolean,\n private readonly async?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassMethod {\n if (\n !t.isNode(node) ||\n !t.isClassMethod(node)\n ) {\n return false;\n }\n\n if (typeof this.kind === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.kind === \"string\") {\n if (this.kind !== node.kind) {\n return false;\n }\n } else if (!this.kind.matchValue(node.kind, [...keys, \"kind\"])) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n if (typeof this._static === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._static === \"boolean\") {\n if (this._static !== node.static) {\n return false;\n }\n } else if (!this._static.matchValue(node.static, [...keys, \"static\"])) {\n return false;\n }\n\n if (typeof this.generator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.generator === \"boolean\") {\n if (this.generator !== node.generator) {\n return false;\n }\n } else if (\n !this.generator.matchValue(node.generator, [...keys, \"generator\"])\n ) {\n return false;\n }\n\n if (typeof this.async === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.async === \"boolean\") {\n if (this.async !== node.async) {\n return false;\n }\n } else if (!this.async.matchValue(node.async, [...keys, \"async\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classMethod(\n kind?: Matcher<\"get\" | \"set\" | \"method\" | \"constructor\"> | string,\n key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n >,\n params?:\n | Matcher<Array<t.FunctionParameter | t.TSParameterProperty>>\n | Array<Matcher<t.FunctionParameter> | Matcher<t.TSParameterProperty>>,\n body?: Matcher<t.BlockStatement>,\n computed?: Matcher<boolean> | boolean,\n _static?: Matcher<boolean> | boolean,\n generator?: Matcher<boolean> | boolean,\n async?: Matcher<boolean> | boolean,\n): Matcher<t.ClassMethod> {\n return new ClassMethodMatcher(\n kind,\n key,\n params,\n body,\n computed,\n _static,\n generator,\n async,\n );\n}\nexport class ClassPrivateMethodMatcher extends Matcher<t.ClassPrivateMethod> {\n constructor(\n private readonly kind?: Matcher<\"get\" | \"set\" | \"method\"> | string,\n private readonly key?: Matcher<t.PrivateName>,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter | t.TSParameterProperty>>\n | Array<Matcher<t.FunctionParameter> | Matcher<t.TSParameterProperty>>,\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly _static?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassPrivateMethod {\n if (\n !t.isNode(node) ||\n !t.isClassPrivateMethod(node)\n ) {\n return false;\n }\n\n if (typeof this.kind === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.kind === \"string\") {\n if (this.kind !== node.kind) {\n return false;\n }\n } else if (!this.kind.matchValue(node.kind, [...keys, \"kind\"])) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this._static === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._static === \"boolean\") {\n if (this._static !== node.static) {\n return false;\n }\n } else if (!this._static.matchValue(node.static, [...keys, \"static\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classPrivateMethod(\n kind?: Matcher<\"get\" | \"set\" | \"method\"> | string,\n key?: Matcher<t.PrivateName>,\n params?:\n | Matcher<Array<t.FunctionParameter | t.TSParameterProperty>>\n | Array<Matcher<t.FunctionParameter> | Matcher<t.TSParameterProperty>>,\n body?: Matcher<t.BlockStatement>,\n _static?: Matcher<boolean> | boolean,\n): Matcher<t.ClassPrivateMethod> {\n return new ClassPrivateMethodMatcher(\n kind,\n key,\n params,\n body,\n _static,\n );\n}\nexport class ClassPrivatePropertyMatcher\n extends Matcher<t.ClassPrivateProperty> {\n constructor(\n private readonly key?: Matcher<t.PrivateName>,\n private readonly value?: Matcher<t.Expression> | null,\n private readonly decorators?:\n | Matcher<Array<t.Decorator>>\n | Array<Matcher<t.Decorator>>\n | null,\n private readonly _static?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassPrivateProperty {\n if (\n !t.isNode(node) ||\n !t.isClassPrivateProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.value === null) {\n // null matcher means we expect null value\n if (node.value !== null) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.decorators === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.decorators === null) {\n // null matcher means we expect null value\n if (node.decorators !== null) {\n return false;\n }\n } else if (Array.isArray(this.decorators)) {\n if (\n !tupleOf<unknown>(...this.decorators).matchValue(node.decorators, [\n ...keys,\n \"decorators\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.decorators.matchValue(node.decorators, [...keys, \"decorators\"])\n ) {\n return false;\n }\n\n if (typeof this._static === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._static === \"boolean\") {\n if (this._static !== node.static) {\n return false;\n }\n } else if (!this._static.matchValue(node.static, [...keys, \"static\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classPrivateProperty(\n key?: Matcher<t.PrivateName>,\n value?: Matcher<t.Expression> | null,\n decorators?: Matcher<Array<t.Decorator>> | Array<Matcher<t.Decorator>> | null,\n _static?: Matcher<boolean> | boolean,\n): Matcher<t.ClassPrivateProperty> {\n return new ClassPrivatePropertyMatcher(\n key,\n value,\n decorators,\n _static,\n );\n}\nexport class ClassPropertyMatcher extends Matcher<t.ClassProperty> {\n constructor(\n private readonly key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n >,\n private readonly value?: Matcher<t.Expression> | null,\n private readonly typeAnnotation?:\n | Matcher<t.TypeAnnotation | t.TSTypeAnnotation>\n | null,\n private readonly decorators?:\n | Matcher<Array<t.Decorator>>\n | Array<Matcher<t.Decorator>>\n | null,\n private readonly computed?: Matcher<boolean> | boolean,\n private readonly _static?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassProperty {\n if (\n !t.isNode(node) ||\n !t.isClassProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.value === null) {\n // null matcher means we expect null value\n if (node.value !== null) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeAnnotation === null) {\n // null matcher means we expect null value\n if (node.typeAnnotation !== null) {\n return false;\n }\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.decorators === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.decorators === null) {\n // null matcher means we expect null value\n if (node.decorators !== null) {\n return false;\n }\n } else if (Array.isArray(this.decorators)) {\n if (\n !tupleOf<unknown>(...this.decorators).matchValue(node.decorators, [\n ...keys,\n \"decorators\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.decorators.matchValue(node.decorators, [...keys, \"decorators\"])\n ) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n if (typeof this._static === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._static === \"boolean\") {\n if (this._static !== node.static) {\n return false;\n }\n } else if (!this._static.matchValue(node.static, [...keys, \"static\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classProperty(\n key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n >,\n value?: Matcher<t.Expression> | null,\n typeAnnotation?: Matcher<t.TypeAnnotation | t.TSTypeAnnotation> | null,\n decorators?: Matcher<Array<t.Decorator>> | Array<Matcher<t.Decorator>> | null,\n computed?: Matcher<boolean> | boolean,\n _static?: Matcher<boolean> | boolean,\n): Matcher<t.ClassProperty> {\n return new ClassPropertyMatcher(\n key,\n value,\n typeAnnotation,\n decorators,\n computed,\n _static,\n );\n}\nexport class ConditionalExpressionMatcher\n extends Matcher<t.ConditionalExpression> {\n constructor(\n private readonly test?: Matcher<t.Expression>,\n private readonly consequent?: Matcher<t.Expression>,\n private readonly alternate?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ConditionalExpression {\n if (\n !t.isNode(node) ||\n !t.isConditionalExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.test === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.test.matchValue(node.test, [...keys, \"test\"])) {\n return false;\n }\n\n if (typeof this.consequent === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.consequent.matchValue(node.consequent, [...keys, \"consequent\"])\n ) {\n return false;\n }\n\n if (typeof this.alternate === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.alternate.matchValue(node.alternate, [...keys, \"alternate\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function conditionalExpression(\n test?: Matcher<t.Expression>,\n consequent?: Matcher<t.Expression>,\n alternate?: Matcher<t.Expression>,\n): Matcher<t.ConditionalExpression> {\n return new ConditionalExpressionMatcher(\n test,\n consequent,\n alternate,\n );\n}\nexport class ContinueStatementMatcher extends Matcher<t.ContinueStatement> {\n constructor(\n private readonly label?: Matcher<t.Identifier> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ContinueStatement {\n if (\n !t.isNode(node) ||\n !t.isContinueStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.label === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.label === null) {\n // null matcher means we expect null value\n if (node.label !== null) {\n return false;\n }\n } else if (!this.label.matchValue(node.label, [...keys, \"label\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function continueStatement(\n label?: Matcher<t.Identifier> | null,\n): Matcher<t.ContinueStatement> {\n return new ContinueStatementMatcher(\n label,\n );\n}\nexport class DebuggerStatementMatcher extends Matcher<t.DebuggerStatement> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DebuggerStatement {\n if (\n !t.isNode(node) ||\n !t.isDebuggerStatement(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function debuggerStatement(): Matcher<t.DebuggerStatement> {\n return new DebuggerStatementMatcher();\n}\nexport class DeclareClassMatcher extends Matcher<t.DeclareClass> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n private readonly body?: Matcher<t.ObjectTypeAnnotation>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareClass {\n if (\n !t.isNode(node) ||\n !t.isDeclareClass(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this._extends === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._extends === null) {\n // null matcher means we expect null value\n if (node.extends !== null) {\n return false;\n }\n } else if (Array.isArray(this._extends)) {\n if (\n !tupleOf<unknown>(...this._extends).matchValue(node.extends, [\n ...keys,\n \"extends\",\n ])\n ) {\n return false;\n }\n } else if (!this._extends.matchValue(node.extends, [...keys, \"extends\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareClass(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n body?: Matcher<t.ObjectTypeAnnotation>,\n): Matcher<t.DeclareClass> {\n return new DeclareClassMatcher(\n id,\n typeParameters,\n _extends,\n body,\n );\n}\nexport class DeclareExportAllDeclarationMatcher\n extends Matcher<t.DeclareExportAllDeclaration> {\n constructor(\n private readonly source?: Matcher<t.StringLiteral>,\n private readonly attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareExportAllDeclaration {\n if (\n !t.isNode(node) ||\n !t.isDeclareExportAllDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.attributes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.attributes === null) {\n // null matcher means we expect null value\n if (node.attributes !== null) {\n return false;\n }\n } else if (Array.isArray(this.attributes)) {\n if (\n !tupleOf<unknown>(...this.attributes).matchValue(node.attributes, [\n ...keys,\n \"attributes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.attributes.matchValue(node.attributes, [...keys, \"attributes\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareExportAllDeclaration(\n source?: Matcher<t.StringLiteral>,\n attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n): Matcher<t.DeclareExportAllDeclaration> {\n return new DeclareExportAllDeclarationMatcher(\n source,\n attributes,\n );\n}\nexport class DeclareExportDeclarationMatcher\n extends Matcher<t.DeclareExportDeclaration> {\n constructor(\n private readonly declaration?: Matcher<t.Flow> | null,\n private readonly specifiers?:\n | Matcher<Array<t.ExportSpecifier | t.ExportNamespaceSpecifier>>\n | Array<Matcher<t.ExportSpecifier> | Matcher<t.ExportNamespaceSpecifier>>\n | null,\n private readonly source?: Matcher<t.StringLiteral> | null,\n private readonly attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareExportDeclaration {\n if (\n !t.isNode(node) ||\n !t.isDeclareExportDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.declaration === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.declaration === null) {\n // null matcher means we expect null value\n if (node.declaration !== null) {\n return false;\n }\n } else if (\n !this.declaration.matchValue(node.declaration, [...keys, \"declaration\"])\n ) {\n return false;\n }\n\n if (typeof this.specifiers === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.specifiers === null) {\n // null matcher means we expect null value\n if (node.specifiers !== null) {\n return false;\n }\n } else if (Array.isArray(this.specifiers)) {\n if (\n !tupleOf<unknown>(...this.specifiers).matchValue(node.specifiers, [\n ...keys,\n \"specifiers\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.specifiers.matchValue(node.specifiers, [...keys, \"specifiers\"])\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.source === null) {\n // null matcher means we expect null value\n if (node.source !== null) {\n return false;\n }\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.attributes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.attributes === null) {\n // null matcher means we expect null value\n if (node.attributes !== null) {\n return false;\n }\n } else if (Array.isArray(this.attributes)) {\n if (\n !tupleOf<unknown>(...this.attributes).matchValue(node.attributes, [\n ...keys,\n \"attributes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.attributes.matchValue(node.attributes, [...keys, \"attributes\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareExportDeclaration(\n declaration?: Matcher<t.Flow> | null,\n specifiers?:\n | Matcher<Array<t.ExportSpecifier | t.ExportNamespaceSpecifier>>\n | Array<Matcher<t.ExportSpecifier> | Matcher<t.ExportNamespaceSpecifier>>\n | null,\n source?: Matcher<t.StringLiteral> | null,\n attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n): Matcher<t.DeclareExportDeclaration> {\n return new DeclareExportDeclarationMatcher(\n declaration,\n specifiers,\n source,\n attributes,\n );\n}\nexport class DeclareFunctionMatcher extends Matcher<t.DeclareFunction> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareFunction {\n if (\n !t.isNode(node) ||\n !t.isDeclareFunction(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareFunction(\n id?: Matcher<t.Identifier>,\n): Matcher<t.DeclareFunction> {\n return new DeclareFunctionMatcher(\n id,\n );\n}\nexport class DeclareInterfaceMatcher extends Matcher<t.DeclareInterface> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n private readonly body?: Matcher<t.ObjectTypeAnnotation>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareInterface {\n if (\n !t.isNode(node) ||\n !t.isDeclareInterface(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this._extends === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._extends === null) {\n // null matcher means we expect null value\n if (node.extends !== null) {\n return false;\n }\n } else if (Array.isArray(this._extends)) {\n if (\n !tupleOf<unknown>(...this._extends).matchValue(node.extends, [\n ...keys,\n \"extends\",\n ])\n ) {\n return false;\n }\n } else if (!this._extends.matchValue(node.extends, [...keys, \"extends\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareInterface(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n body?: Matcher<t.ObjectTypeAnnotation>,\n): Matcher<t.DeclareInterface> {\n return new DeclareInterfaceMatcher(\n id,\n typeParameters,\n _extends,\n body,\n );\n}\nexport class DeclareModuleMatcher extends Matcher<t.DeclareModule> {\n constructor(\n private readonly id?: Matcher<t.Identifier | t.StringLiteral>,\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly kind?: Matcher<\"CommonJS\" | \"ES\"> | string | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareModule {\n if (\n !t.isNode(node) ||\n !t.isDeclareModule(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.kind === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.kind === \"string\") {\n if (this.kind !== node.kind) {\n return false;\n }\n } else if (this.kind === null) {\n // null matcher means we expect null value\n if (node.kind !== null) {\n return false;\n }\n } else if (!this.kind.matchValue(node.kind, [...keys, \"kind\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareModule(\n id?: Matcher<t.Identifier | t.StringLiteral>,\n body?: Matcher<t.BlockStatement>,\n kind?: Matcher<\"CommonJS\" | \"ES\"> | string | null,\n): Matcher<t.DeclareModule> {\n return new DeclareModuleMatcher(\n id,\n body,\n kind,\n );\n}\nexport class DeclareModuleExportsMatcher\n extends Matcher<t.DeclareModuleExports> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TypeAnnotation>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareModuleExports {\n if (\n !t.isNode(node) ||\n !t.isDeclareModuleExports(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareModuleExports(\n typeAnnotation?: Matcher<t.TypeAnnotation>,\n): Matcher<t.DeclareModuleExports> {\n return new DeclareModuleExportsMatcher(\n typeAnnotation,\n );\n}\nexport class DeclareOpaqueTypeMatcher extends Matcher<t.DeclareOpaqueType> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly supertype?: Matcher<t.FlowType> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareOpaqueType {\n if (\n !t.isNode(node) ||\n !t.isDeclareOpaqueType(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.supertype === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.supertype === null) {\n // null matcher means we expect null value\n if (node.supertype !== null) {\n return false;\n }\n } else if (\n !this.supertype.matchValue(node.supertype, [...keys, \"supertype\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareOpaqueType(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n supertype?: Matcher<t.FlowType> | null,\n): Matcher<t.DeclareOpaqueType> {\n return new DeclareOpaqueTypeMatcher(\n id,\n typeParameters,\n supertype,\n );\n}\nexport class DeclareTypeAliasMatcher extends Matcher<t.DeclareTypeAlias> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly right?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareTypeAlias {\n if (\n !t.isNode(node) ||\n !t.isDeclareTypeAlias(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareTypeAlias(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n right?: Matcher<t.FlowType>,\n): Matcher<t.DeclareTypeAlias> {\n return new DeclareTypeAliasMatcher(\n id,\n typeParameters,\n right,\n );\n}\nexport class DeclareVariableMatcher extends Matcher<t.DeclareVariable> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareVariable {\n if (\n !t.isNode(node) ||\n !t.isDeclareVariable(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareVariable(\n id?: Matcher<t.Identifier>,\n): Matcher<t.DeclareVariable> {\n return new DeclareVariableMatcher(\n id,\n );\n}\nexport class DeclaredPredicateMatcher extends Matcher<t.DeclaredPredicate> {\n constructor(\n private readonly value?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclaredPredicate {\n if (\n !t.isNode(node) ||\n !t.isDeclaredPredicate(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declaredPredicate(\n value?: Matcher<t.Expression>,\n): Matcher<t.DeclaredPredicate> {\n return new DeclaredPredicateMatcher(\n value,\n );\n}\nexport class DecoratorMatcher extends Matcher<t.Decorator> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Decorator {\n if (\n !t.isNode(node) ||\n !t.isDecorator(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function decorator(\n expression?: Matcher<t.Expression>,\n): Matcher<t.Decorator> {\n return new DecoratorMatcher(\n expression,\n );\n}\nexport class DirectiveMatcher extends Matcher<t.Directive> {\n constructor(\n private readonly value?: Matcher<t.DirectiveLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Directive {\n if (\n !t.isNode(node) ||\n !t.isDirective(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function directive(\n value?: Matcher<t.DirectiveLiteral>,\n): Matcher<t.Directive> {\n return new DirectiveMatcher(\n value,\n );\n}\nexport class DirectiveLiteralMatcher extends Matcher<t.DirectiveLiteral> {\n constructor(\n private readonly value?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DirectiveLiteral {\n if (\n !t.isNode(node) ||\n !t.isDirectiveLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"string\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function directiveLiteral(\n value?: Matcher<string> | string,\n): Matcher<t.DirectiveLiteral> {\n return new DirectiveLiteralMatcher(\n value,\n );\n}\nexport class DoExpressionMatcher extends Matcher<t.DoExpression> {\n constructor(\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly async?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DoExpression {\n if (\n !t.isNode(node) ||\n !t.isDoExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.async === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.async === \"boolean\") {\n if (this.async !== node.async) {\n return false;\n }\n } else if (!this.async.matchValue(node.async, [...keys, \"async\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function doExpression(\n body?: Matcher<t.BlockStatement>,\n async?: Matcher<boolean> | boolean,\n): Matcher<t.DoExpression> {\n return new DoExpressionMatcher(\n body,\n async,\n );\n}\nexport class DoWhileStatementMatcher extends Matcher<t.DoWhileStatement> {\n constructor(\n private readonly test?: Matcher<t.Expression>,\n private readonly body?: Matcher<t.Statement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DoWhileStatement {\n if (\n !t.isNode(node) ||\n !t.isDoWhileStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.test === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.test.matchValue(node.test, [...keys, \"test\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function doWhileStatement(\n test?: Matcher<t.Expression>,\n body?: Matcher<t.Statement>,\n): Matcher<t.DoWhileStatement> {\n return new DoWhileStatementMatcher(\n test,\n body,\n );\n}\nexport class EmptyStatementMatcher extends Matcher<t.EmptyStatement> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EmptyStatement {\n if (\n !t.isNode(node) ||\n !t.isEmptyStatement(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function emptyStatement(): Matcher<t.EmptyStatement> {\n return new EmptyStatementMatcher();\n}\nexport class EmptyTypeAnnotationMatcher extends Matcher<t.EmptyTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EmptyTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isEmptyTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function emptyTypeAnnotation(): Matcher<t.EmptyTypeAnnotation> {\n return new EmptyTypeAnnotationMatcher();\n}\nexport class EnumBooleanBodyMatcher extends Matcher<t.EnumBooleanBody> {\n constructor(\n private readonly members?:\n | Matcher<Array<t.EnumBooleanMember>>\n | Array<Matcher<t.EnumBooleanMember>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumBooleanBody {\n if (\n !t.isNode(node) ||\n !t.isEnumBooleanBody(node)\n ) {\n return false;\n }\n\n if (typeof this.members === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.members)) {\n if (\n !tupleOf<unknown>(...this.members).matchValue(node.members, [\n ...keys,\n \"members\",\n ])\n ) {\n return false;\n }\n } else if (!this.members.matchValue(node.members, [...keys, \"members\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumBooleanBody(\n members?:\n | Matcher<Array<t.EnumBooleanMember>>\n | Array<Matcher<t.EnumBooleanMember>>,\n): Matcher<t.EnumBooleanBody> {\n return new EnumBooleanBodyMatcher(\n members,\n );\n}\nexport class EnumBooleanMemberMatcher extends Matcher<t.EnumBooleanMember> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly init?: Matcher<t.BooleanLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumBooleanMember {\n if (\n !t.isNode(node) ||\n !t.isEnumBooleanMember(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.init === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.init.matchValue(node.init, [...keys, \"init\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumBooleanMember(\n id?: Matcher<t.Identifier>,\n init?: Matcher<t.BooleanLiteral>,\n): Matcher<t.EnumBooleanMember> {\n return new EnumBooleanMemberMatcher(\n id,\n init,\n );\n}\nexport class EnumDeclarationMatcher extends Matcher<t.EnumDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly body?: Matcher<\n t.EnumBooleanBody | t.EnumNumberBody | t.EnumStringBody | t.EnumSymbolBody\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumDeclaration {\n if (\n !t.isNode(node) ||\n !t.isEnumDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumDeclaration(\n id?: Matcher<t.Identifier>,\n body?: Matcher<\n t.EnumBooleanBody | t.EnumNumberBody | t.EnumStringBody | t.EnumSymbolBody\n >,\n): Matcher<t.EnumDeclaration> {\n return new EnumDeclarationMatcher(\n id,\n body,\n );\n}\nexport class EnumDefaultedMemberMatcher extends Matcher<t.EnumDefaultedMember> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumDefaultedMember {\n if (\n !t.isNode(node) ||\n !t.isEnumDefaultedMember(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumDefaultedMember(\n id?: Matcher<t.Identifier>,\n): Matcher<t.EnumDefaultedMember> {\n return new EnumDefaultedMemberMatcher(\n id,\n );\n}\nexport class EnumNumberBodyMatcher extends Matcher<t.EnumNumberBody> {\n constructor(\n private readonly members?:\n | Matcher<Array<t.EnumNumberMember>>\n | Array<Matcher<t.EnumNumberMember>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumNumberBody {\n if (\n !t.isNode(node) ||\n !t.isEnumNumberBody(node)\n ) {\n return false;\n }\n\n if (typeof this.members === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.members)) {\n if (\n !tupleOf<unknown>(...this.members).matchValue(node.members, [\n ...keys,\n \"members\",\n ])\n ) {\n return false;\n }\n } else if (!this.members.matchValue(node.members, [...keys, \"members\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumNumberBody(\n members?:\n | Matcher<Array<t.EnumNumberMember>>\n | Array<Matcher<t.EnumNumberMember>>,\n): Matcher<t.EnumNumberBody> {\n return new EnumNumberBodyMatcher(\n members,\n );\n}\nexport class EnumNumberMemberMatcher extends Matcher<t.EnumNumberMember> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly init?: Matcher<t.NumericLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumNumberMember {\n if (\n !t.isNode(node) ||\n !t.isEnumNumberMember(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.init === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.init.matchValue(node.init, [...keys, \"init\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumNumberMember(\n id?: Matcher<t.Identifier>,\n init?: Matcher<t.NumericLiteral>,\n): Matcher<t.EnumNumberMember> {\n return new EnumNumberMemberMatcher(\n id,\n init,\n );\n}\nexport class EnumStringBodyMatcher extends Matcher<t.EnumStringBody> {\n constructor(\n private readonly members?:\n | Matcher<Array<t.EnumStringMember | t.EnumDefaultedMember>>\n | Array<Matcher<t.EnumStringMember> | Matcher<t.EnumDefaultedMember>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumStringBody {\n if (\n !t.isNode(node) ||\n !t.isEnumStringBody(node)\n ) {\n return false;\n }\n\n if (typeof this.members === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.members)) {\n if (\n !tupleOf<unknown>(...this.members).matchValue(node.members, [\n ...keys,\n \"members\",\n ])\n ) {\n return false;\n }\n } else if (!this.members.matchValue(node.members, [...keys, \"members\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumStringBody(\n members?:\n | Matcher<Array<t.EnumStringMember | t.EnumDefaultedMember>>\n | Array<Matcher<t.EnumStringMember> | Matcher<t.EnumDefaultedMember>>,\n): Matcher<t.EnumStringBody> {\n return new EnumStringBodyMatcher(\n members,\n );\n}\nexport class EnumStringMemberMatcher extends Matcher<t.EnumStringMember> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly init?: Matcher<t.StringLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumStringMember {\n if (\n !t.isNode(node) ||\n !t.isEnumStringMember(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.init === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.init.matchValue(node.init, [...keys, \"init\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumStringMember(\n id?: Matcher<t.Identifier>,\n init?: Matcher<t.StringLiteral>,\n): Matcher<t.EnumStringMember> {\n return new EnumStringMemberMatcher(\n id,\n init,\n );\n}\nexport class EnumSymbolBodyMatcher extends Matcher<t.EnumSymbolBody> {\n constructor(\n private readonly members?:\n | Matcher<Array<t.EnumDefaultedMember>>\n | Array<Matcher<t.EnumDefaultedMember>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumSymbolBody {\n if (\n !t.isNode(node) ||\n !t.isEnumSymbolBody(node)\n ) {\n return false;\n }\n\n if (typeof this.members === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.members)) {\n if (\n !tupleOf<unknown>(...this.members).matchValue(node.members, [\n ...keys,\n \"members\",\n ])\n ) {\n return false;\n }\n } else if (!this.members.matchValue(node.members, [...keys, \"members\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumSymbolBody(\n members?:\n | Matcher<Array<t.EnumDefaultedMember>>\n | Array<Matcher<t.EnumDefaultedMember>>,\n): Matcher<t.EnumSymbolBody> {\n return new EnumSymbolBodyMatcher(\n members,\n );\n}\nexport class ExistsTypeAnnotationMatcher\n extends Matcher<t.ExistsTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExistsTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isExistsTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function existsTypeAnnotation(): Matcher<t.ExistsTypeAnnotation> {\n return new ExistsTypeAnnotationMatcher();\n}\nexport class ExportAllDeclarationMatcher\n extends Matcher<t.ExportAllDeclaration> {\n constructor(\n private readonly source?: Matcher<t.StringLiteral>,\n private readonly attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExportAllDeclaration {\n if (\n !t.isNode(node) ||\n !t.isExportAllDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.attributes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.attributes === null) {\n // null matcher means we expect null value\n if (node.attributes !== null) {\n return false;\n }\n } else if (Array.isArray(this.attributes)) {\n if (\n !tupleOf<unknown>(...this.attributes).matchValue(node.attributes, [\n ...keys,\n \"attributes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.attributes.matchValue(node.attributes, [...keys, \"attributes\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function exportAllDeclaration(\n source?: Matcher<t.StringLiteral>,\n attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n): Matcher<t.ExportAllDeclaration> {\n return new ExportAllDeclarationMatcher(\n source,\n attributes,\n );\n}\nexport class ExportDefaultDeclarationMatcher\n extends Matcher<t.ExportDefaultDeclaration> {\n constructor(\n private readonly declaration?: Matcher<\n | t.FunctionDeclaration\n | t.ClassDeclaration\n | t.Expression\n | t.TSDeclareFunction\n | t.TSInterfaceDeclaration\n | t.EnumDeclaration\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExportDefaultDeclaration {\n if (\n !t.isNode(node) ||\n !t.isExportDefaultDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.declaration === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.declaration.matchValue(node.declaration, [...keys, \"declaration\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function exportDefaultDeclaration(\n declaration?: Matcher<\n | t.FunctionDeclaration\n | t.ClassDeclaration\n | t.Expression\n | t.TSDeclareFunction\n | t.TSInterfaceDeclaration\n | t.EnumDeclaration\n >,\n): Matcher<t.ExportDefaultDeclaration> {\n return new ExportDefaultDeclarationMatcher(\n declaration,\n );\n}\nexport class ExportDefaultSpecifierMatcher\n extends Matcher<t.ExportDefaultSpecifier> {\n constructor(\n private readonly exported?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExportDefaultSpecifier {\n if (\n !t.isNode(node) ||\n !t.isExportDefaultSpecifier(node)\n ) {\n return false;\n }\n\n if (typeof this.exported === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.exported.matchValue(node.exported, [...keys, \"exported\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function exportDefaultSpecifier(\n exported?: Matcher<t.Identifier>,\n): Matcher<t.ExportDefaultSpecifier> {\n return new ExportDefaultSpecifierMatcher(\n exported,\n );\n}\nexport class ExportNamedDeclarationMatcher\n extends Matcher<t.ExportNamedDeclaration> {\n constructor(\n private readonly declaration?:\n | Matcher<\n | t.VariableDeclaration\n | t.FunctionDeclaration\n | t.ClassDeclaration\n | t.TSDeclareFunction\n | t.TSEnumDeclaration\n | t.TSImportEqualsDeclaration\n | t.TSInterfaceDeclaration\n | t.TSModuleDeclaration\n | t.TSTypeAliasDeclaration\n | t.EnumDeclaration\n | t.InterfaceDeclaration\n | t.OpaqueType\n | t.TypeAlias\n >\n | null,\n private readonly specifiers?:\n | Matcher<\n Array<\n | t.ExportSpecifier\n | t.ExportDefaultSpecifier\n | t.ExportNamespaceSpecifier\n >\n >\n | Array<\n | Matcher<t.ExportSpecifier>\n | Matcher<t.ExportDefaultSpecifier>\n | Matcher<t.ExportNamespaceSpecifier>\n >,\n private readonly source?: Matcher<t.StringLiteral> | null,\n private readonly attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExportNamedDeclaration {\n if (\n !t.isNode(node) ||\n !t.isExportNamedDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.declaration === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.declaration === null) {\n // null matcher means we expect null value\n if (node.declaration !== null) {\n return false;\n }\n } else if (\n !this.declaration.matchValue(node.declaration, [...keys, \"declaration\"])\n ) {\n return false;\n }\n\n if (typeof this.specifiers === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.specifiers)) {\n if (\n !tupleOf<unknown>(...this.specifiers).matchValue(node.specifiers, [\n ...keys,\n \"specifiers\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.specifiers.matchValue(node.specifiers, [...keys, \"specifiers\"])\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.source === null) {\n // null matcher means we expect null value\n if (node.source !== null) {\n return false;\n }\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.attributes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.attributes === null) {\n // null matcher means we expect null value\n if (node.attributes !== null) {\n return false;\n }\n } else if (Array.isArray(this.attributes)) {\n if (\n !tupleOf<unknown>(...this.attributes).matchValue(node.attributes, [\n ...keys,\n \"attributes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.attributes.matchValue(node.attributes, [...keys, \"attributes\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function exportNamedDeclaration(\n declaration?:\n | Matcher<\n | t.VariableDeclaration\n | t.FunctionDeclaration\n | t.ClassDeclaration\n | t.TSDeclareFunction\n | t.TSEnumDeclaration\n | t.TSImportEqualsDeclaration\n | t.TSInterfaceDeclaration\n | t.TSModuleDeclaration\n | t.TSTypeAliasDeclaration\n | t.EnumDeclaration\n | t.InterfaceDeclaration\n | t.OpaqueType\n | t.TypeAlias\n >\n | null,\n specifiers?:\n | Matcher<\n Array<\n | t.ExportSpecifier\n | t.ExportDefaultSpecifier\n | t.ExportNamespaceSpecifier\n >\n >\n | Array<\n | Matcher<t.ExportSpecifier>\n | Matcher<t.ExportDefaultSpecifier>\n | Matcher<t.ExportNamespaceSpecifier>\n >,\n source?: Matcher<t.StringLiteral> | null,\n attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n): Matcher<t.ExportNamedDeclaration> {\n return new ExportNamedDeclarationMatcher(\n declaration,\n specifiers,\n source,\n attributes,\n );\n}\nexport class ExportNamespaceSpecifierMatcher\n extends Matcher<t.ExportNamespaceSpecifier> {\n constructor(\n private readonly exported?: Matcher<t.Identifier | t.StringLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExportNamespaceSpecifier {\n if (\n !t.isNode(node) ||\n !t.isExportNamespaceSpecifier(node)\n ) {\n return false;\n }\n\n if (typeof this.exported === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.exported.matchValue(node.exported, [...keys, \"exported\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function exportNamespaceSpecifier(\n exported?: Matcher<t.Identifier | t.StringLiteral>,\n): Matcher<t.ExportNamespaceSpecifier> {\n return new ExportNamespaceSpecifierMatcher(\n exported,\n );\n}\nexport class ExportSpecifierMatcher extends Matcher<t.ExportSpecifier> {\n constructor(\n private readonly local?: Matcher<t.Identifier>,\n private readonly exported?: Matcher<t.Identifier | t.StringLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExportSpecifier {\n if (\n !t.isNode(node) ||\n !t.isExportSpecifier(node)\n ) {\n return false;\n }\n\n if (typeof this.local === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.local.matchValue(node.local, [...keys, \"local\"])) {\n return false;\n }\n\n if (typeof this.exported === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.exported.matchValue(node.exported, [...keys, \"exported\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function exportSpecifier(\n local?: Matcher<t.Identifier>,\n exported?: Matcher<t.Identifier | t.StringLiteral>,\n): Matcher<t.ExportSpecifier> {\n return new ExportSpecifierMatcher(\n local,\n exported,\n );\n}\nexport class ExpressionStatementMatcher extends Matcher<t.ExpressionStatement> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExpressionStatement {\n if (\n !t.isNode(node) ||\n !t.isExpressionStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function expressionStatement(\n expression?: Matcher<t.Expression>,\n): Matcher<t.ExpressionStatement> {\n return new ExpressionStatementMatcher(\n expression,\n );\n}\nexport class FileMatcher extends Matcher<t.File> {\n constructor(\n private readonly program?: Matcher<t.Program>,\n private readonly comments?:\n | Matcher<Array<t.CommentBlock | t.CommentLine>>\n | null,\n private readonly tokens?: Matcher<Array<any>> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.File {\n if (\n !t.isNode(node) ||\n !t.isFile(node)\n ) {\n return false;\n }\n\n if (typeof this.program === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.program.matchValue(node.program, [...keys, \"program\"])) {\n return false;\n }\n\n if (typeof this.comments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.comments === null) {\n // null matcher means we expect null value\n if (node.comments !== null) {\n return false;\n }\n } else if (\n !this.comments.matchValue(node.comments, [...keys, \"comments\"])\n ) {\n return false;\n }\n\n if (typeof this.tokens === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.tokens === null) {\n // null matcher means we expect null value\n if (node.tokens !== null) {\n return false;\n }\n } else if (!this.tokens.matchValue(node.tokens, [...keys, \"tokens\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function file(\n program?: Matcher<t.Program>,\n comments?: Matcher<Array<t.CommentBlock | t.CommentLine>> | null,\n tokens?: Matcher<Array<any>> | null,\n): Matcher<t.File> {\n return new FileMatcher(\n program,\n comments,\n tokens,\n );\n}\nexport class ForInStatementMatcher extends Matcher<t.ForInStatement> {\n constructor(\n private readonly left?: Matcher<\n | t.VariableDeclaration\n | t.Identifier\n | t.MemberExpression\n | t.ArrayPattern\n | t.ObjectPattern\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n private readonly right?: Matcher<t.Expression>,\n private readonly body?: Matcher<t.Statement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ForInStatement {\n if (\n !t.isNode(node) ||\n !t.isForInStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function forInStatement(\n left?: Matcher<\n | t.VariableDeclaration\n | t.Identifier\n | t.MemberExpression\n | t.ArrayPattern\n | t.ObjectPattern\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n right?: Matcher<t.Expression>,\n body?: Matcher<t.Statement>,\n): Matcher<t.ForInStatement> {\n return new ForInStatementMatcher(\n left,\n right,\n body,\n );\n}\nexport class ForOfStatementMatcher extends Matcher<t.ForOfStatement> {\n constructor(\n private readonly left?: Matcher<\n | t.VariableDeclaration\n | t.Identifier\n | t.MemberExpression\n | t.ArrayPattern\n | t.ObjectPattern\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n private readonly right?: Matcher<t.Expression>,\n private readonly body?: Matcher<t.Statement>,\n private readonly _await?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ForOfStatement {\n if (\n !t.isNode(node) ||\n !t.isForOfStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this._await === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._await === \"boolean\") {\n if (this._await !== node.await) {\n return false;\n }\n } else if (!this._await.matchValue(node.await, [...keys, \"await\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function forOfStatement(\n left?: Matcher<\n | t.VariableDeclaration\n | t.Identifier\n | t.MemberExpression\n | t.ArrayPattern\n | t.ObjectPattern\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n right?: Matcher<t.Expression>,\n body?: Matcher<t.Statement>,\n _await?: Matcher<boolean> | boolean,\n): Matcher<t.ForOfStatement> {\n return new ForOfStatementMatcher(\n left,\n right,\n body,\n _await,\n );\n}\nexport class ForStatementMatcher extends Matcher<t.ForStatement> {\n constructor(\n private readonly init?:\n | Matcher<t.VariableDeclaration | t.Expression>\n | null,\n private readonly test?: Matcher<t.Expression> | null,\n private readonly update?: Matcher<t.Expression> | null,\n private readonly body?: Matcher<t.Statement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ForStatement {\n if (\n !t.isNode(node) ||\n !t.isForStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.init === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.init === null) {\n // null matcher means we expect null value\n if (node.init !== null) {\n return false;\n }\n } else if (!this.init.matchValue(node.init, [...keys, \"init\"])) {\n return false;\n }\n\n if (typeof this.test === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.test === null) {\n // null matcher means we expect null value\n if (node.test !== null) {\n return false;\n }\n } else if (!this.test.matchValue(node.test, [...keys, \"test\"])) {\n return false;\n }\n\n if (typeof this.update === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.update === null) {\n // null matcher means we expect null value\n if (node.update !== null) {\n return false;\n }\n } else if (!this.update.matchValue(node.update, [...keys, \"update\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function forStatement(\n init?: Matcher<t.VariableDeclaration | t.Expression> | null,\n test?: Matcher<t.Expression> | null,\n update?: Matcher<t.Expression> | null,\n body?: Matcher<t.Statement>,\n): Matcher<t.ForStatement> {\n return new ForStatementMatcher(\n init,\n test,\n update,\n body,\n );\n}\nexport class FunctionDeclarationMatcher extends Matcher<t.FunctionDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier> | null,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly generator?: Matcher<boolean> | boolean,\n private readonly async?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.FunctionDeclaration {\n if (\n !t.isNode(node) ||\n !t.isFunctionDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.id === null) {\n // null matcher means we expect null value\n if (node.id !== null) {\n return false;\n }\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.generator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.generator === \"boolean\") {\n if (this.generator !== node.generator) {\n return false;\n }\n } else if (\n !this.generator.matchValue(node.generator, [...keys, \"generator\"])\n ) {\n return false;\n }\n\n if (typeof this.async === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.async === \"boolean\") {\n if (this.async !== node.async) {\n return false;\n }\n } else if (!this.async.matchValue(node.async, [...keys, \"async\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function functionDeclaration(\n id?: Matcher<t.Identifier> | null,\n params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n body?: Matcher<t.BlockStatement>,\n generator?: Matcher<boolean> | boolean,\n async?: Matcher<boolean> | boolean,\n): Matcher<t.FunctionDeclaration> {\n return new FunctionDeclarationMatcher(\n id,\n params,\n body,\n generator,\n async,\n );\n}\nexport class FunctionExpressionMatcher extends Matcher<t.FunctionExpression> {\n constructor(\n private readonly id?: Matcher<t.Identifier> | null,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly generator?: Matcher<boolean> | boolean,\n private readonly async?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.FunctionExpression {\n if (\n !t.isNode(node) ||\n !t.isFunctionExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.id === null) {\n // null matcher means we expect null value\n if (node.id !== null) {\n return false;\n }\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.generator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.generator === \"boolean\") {\n if (this.generator !== node.generator) {\n return false;\n }\n } else if (\n !this.generator.matchValue(node.generator, [...keys, \"generator\"])\n ) {\n return false;\n }\n\n if (typeof this.async === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.async === \"boolean\") {\n if (this.async !== node.async) {\n return false;\n }\n } else if (!this.async.matchValue(node.async, [...keys, \"async\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function functionExpression(\n id?: Matcher<t.Identifier> | null,\n params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n body?: Matcher<t.BlockStatement>,\n generator?: Matcher<boolean> | boolean,\n async?: Matcher<boolean> | boolean,\n): Matcher<t.FunctionExpression> {\n return new FunctionExpressionMatcher(\n id,\n params,\n body,\n generator,\n async,\n );\n}\nexport class FunctionTypeAnnotationMatcher\n extends Matcher<t.FunctionTypeAnnotation> {\n constructor(\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<Array<t.FunctionTypeParam>>\n | Array<Matcher<t.FunctionTypeParam>>,\n private readonly rest?: Matcher<t.FunctionTypeParam> | null,\n private readonly returnType?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.FunctionTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isFunctionTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.rest === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.rest === null) {\n // null matcher means we expect null value\n if (node.rest !== null) {\n return false;\n }\n } else if (!this.rest.matchValue(node.rest, [...keys, \"rest\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function functionTypeAnnotation(\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n params?:\n | Matcher<Array<t.FunctionTypeParam>>\n | Array<Matcher<t.FunctionTypeParam>>,\n rest?: Matcher<t.FunctionTypeParam> | null,\n returnType?: Matcher<t.FlowType>,\n): Matcher<t.FunctionTypeAnnotation> {\n return new FunctionTypeAnnotationMatcher(\n typeParameters,\n params,\n rest,\n returnType,\n );\n}\nexport class FunctionTypeParamMatcher extends Matcher<t.FunctionTypeParam> {\n constructor(\n private readonly name?: Matcher<t.Identifier> | null,\n private readonly typeAnnotation?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.FunctionTypeParam {\n if (\n !t.isNode(node) ||\n !t.isFunctionTypeParam(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.name === null) {\n // null matcher means we expect null value\n if (node.name !== null) {\n return false;\n }\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function functionTypeParam(\n name?: Matcher<t.Identifier> | null,\n typeAnnotation?: Matcher<t.FlowType>,\n): Matcher<t.FunctionTypeParam> {\n return new FunctionTypeParamMatcher(\n name,\n typeAnnotation,\n );\n}\nexport class GenericTypeAnnotationMatcher\n extends Matcher<t.GenericTypeAnnotation> {\n constructor(\n private readonly id?: Matcher<t.Identifier | t.QualifiedTypeIdentifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.GenericTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isGenericTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function genericTypeAnnotation(\n id?: Matcher<t.Identifier | t.QualifiedTypeIdentifier>,\n typeParameters?: Matcher<t.TypeParameterInstantiation> | null,\n): Matcher<t.GenericTypeAnnotation> {\n return new GenericTypeAnnotationMatcher(\n id,\n typeParameters,\n );\n}\nexport class IdentifierMatcher extends Matcher<t.Identifier> {\n constructor(\n private readonly name?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Identifier {\n if (\n !t.isNode(node) ||\n !t.isIdentifier(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.name === \"string\") {\n if (this.name !== node.name) {\n return false;\n }\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function identifier(\n name?: Matcher<string> | string,\n): Matcher<t.Identifier> {\n return new IdentifierMatcher(\n name,\n );\n}\nexport class IfStatementMatcher extends Matcher<t.IfStatement> {\n constructor(\n private readonly test?: Matcher<t.Expression>,\n private readonly consequent?: Matcher<t.Statement>,\n private readonly alternate?: Matcher<t.Statement> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.IfStatement {\n if (\n !t.isNode(node) ||\n !t.isIfStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.test === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.test.matchValue(node.test, [...keys, \"test\"])) {\n return false;\n }\n\n if (typeof this.consequent === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.consequent.matchValue(node.consequent, [...keys, \"consequent\"])\n ) {\n return false;\n }\n\n if (typeof this.alternate === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.alternate === null) {\n // null matcher means we expect null value\n if (node.alternate !== null) {\n return false;\n }\n } else if (\n !this.alternate.matchValue(node.alternate, [...keys, \"alternate\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function ifStatement(\n test?: Matcher<t.Expression>,\n consequent?: Matcher<t.Statement>,\n alternate?: Matcher<t.Statement> | null,\n): Matcher<t.IfStatement> {\n return new IfStatementMatcher(\n test,\n consequent,\n alternate,\n );\n}\nexport class ImportMatcher extends Matcher<t.Import> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Import {\n if (\n !t.isNode(node) ||\n !t.isImport(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function Import(): Matcher<t.Import> {\n return new ImportMatcher();\n}\nexport class ImportAttributeMatcher extends Matcher<t.ImportAttribute> {\n constructor(\n private readonly key?: Matcher<t.Identifier | t.StringLiteral>,\n private readonly value?: Matcher<t.StringLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ImportAttribute {\n if (\n !t.isNode(node) ||\n !t.isImportAttribute(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function importAttribute(\n key?: Matcher<t.Identifier | t.StringLiteral>,\n value?: Matcher<t.StringLiteral>,\n): Matcher<t.ImportAttribute> {\n return new ImportAttributeMatcher(\n key,\n value,\n );\n}\nexport class ImportDeclarationMatcher extends Matcher<t.ImportDeclaration> {\n constructor(\n private readonly specifiers?:\n | Matcher<\n Array<\n | t.ImportSpecifier\n | t.ImportDefaultSpecifier\n | t.ImportNamespaceSpecifier\n >\n >\n | Array<\n | Matcher<t.ImportSpecifier>\n | Matcher<t.ImportDefaultSpecifier>\n | Matcher<t.ImportNamespaceSpecifier>\n >,\n private readonly source?: Matcher<t.StringLiteral>,\n private readonly attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ImportDeclaration {\n if (\n !t.isNode(node) ||\n !t.isImportDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.specifiers === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.specifiers)) {\n if (\n !tupleOf<unknown>(...this.specifiers).matchValue(node.specifiers, [\n ...keys,\n \"specifiers\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.specifiers.matchValue(node.specifiers, [...keys, \"specifiers\"])\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.attributes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.attributes === null) {\n // null matcher means we expect null value\n if (node.attributes !== null) {\n return false;\n }\n } else if (Array.isArray(this.attributes)) {\n if (\n !tupleOf<unknown>(...this.attributes).matchValue(node.attributes, [\n ...keys,\n \"attributes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.attributes.matchValue(node.attributes, [...keys, \"attributes\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function importDeclaration(\n specifiers?:\n | Matcher<\n Array<\n | t.ImportSpecifier\n | t.ImportDefaultSpecifier\n | t.ImportNamespaceSpecifier\n >\n >\n | Array<\n | Matcher<t.ImportSpecifier>\n | Matcher<t.ImportDefaultSpecifier>\n | Matcher<t.ImportNamespaceSpecifier>\n >,\n source?: Matcher<t.StringLiteral>,\n attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n): Matcher<t.ImportDeclaration> {\n return new ImportDeclarationMatcher(\n specifiers,\n source,\n attributes,\n );\n}\nexport class ImportDefaultSpecifierMatcher\n extends Matcher<t.ImportDefaultSpecifier> {\n constructor(\n private readonly local?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ImportDefaultSpecifier {\n if (\n !t.isNode(node) ||\n !t.isImportDefaultSpecifier(node)\n ) {\n return false;\n }\n\n if (typeof this.local === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.local.matchValue(node.local, [...keys, \"local\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function importDefaultSpecifier(\n local?: Matcher<t.Identifier>,\n): Matcher<t.ImportDefaultSpecifier> {\n return new ImportDefaultSpecifierMatcher(\n local,\n );\n}\nexport class ImportExpressionMatcher extends Matcher<t.ImportExpression> {\n constructor(\n private readonly source?: Matcher<t.Expression>,\n private readonly options?: Matcher<t.Expression> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ImportExpression {\n if (\n !t.isNode(node) ||\n !t.isImportExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.options === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.options === null) {\n // null matcher means we expect null value\n if (node.options !== null) {\n return false;\n }\n } else if (!this.options.matchValue(node.options, [...keys, \"options\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function importExpression(\n source?: Matcher<t.Expression>,\n options?: Matcher<t.Expression> | null,\n): Matcher<t.ImportExpression> {\n return new ImportExpressionMatcher(\n source,\n options,\n );\n}\nexport class ImportNamespaceSpecifierMatcher\n extends Matcher<t.ImportNamespaceSpecifier> {\n constructor(\n private readonly local?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ImportNamespaceSpecifier {\n if (\n !t.isNode(node) ||\n !t.isImportNamespaceSpecifier(node)\n ) {\n return false;\n }\n\n if (typeof this.local === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.local.matchValue(node.local, [...keys, \"local\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function importNamespaceSpecifier(\n local?: Matcher<t.Identifier>,\n): Matcher<t.ImportNamespaceSpecifier> {\n return new ImportNamespaceSpecifierMatcher(\n local,\n );\n}\nexport class ImportSpecifierMatcher extends Matcher<t.ImportSpecifier> {\n constructor(\n private readonly local?: Matcher<t.Identifier>,\n private readonly imported?: Matcher<t.Identifier | t.StringLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ImportSpecifier {\n if (\n !t.isNode(node) ||\n !t.isImportSpecifier(node)\n ) {\n return false;\n }\n\n if (typeof this.local === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.local.matchValue(node.local, [...keys, \"local\"])) {\n return false;\n }\n\n if (typeof this.imported === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.imported.matchValue(node.imported, [...keys, \"imported\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function importSpecifier(\n local?: Matcher<t.Identifier>,\n imported?: Matcher<t.Identifier | t.StringLiteral>,\n): Matcher<t.ImportSpecifier> {\n return new ImportSpecifierMatcher(\n local,\n imported,\n );\n}\nexport class IndexedAccessTypeMatcher extends Matcher<t.IndexedAccessType> {\n constructor(\n private readonly objectType?: Matcher<t.FlowType>,\n private readonly indexType?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.IndexedAccessType {\n if (\n !t.isNode(node) ||\n !t.isIndexedAccessType(node)\n ) {\n return false;\n }\n\n if (typeof this.objectType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.objectType.matchValue(node.objectType, [...keys, \"objectType\"])\n ) {\n return false;\n }\n\n if (typeof this.indexType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.indexType.matchValue(node.indexType, [...keys, \"indexType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function indexedAccessType(\n objectType?: Matcher<t.FlowType>,\n indexType?: Matcher<t.FlowType>,\n): Matcher<t.IndexedAccessType> {\n return new IndexedAccessTypeMatcher(\n objectType,\n indexType,\n );\n}\nexport class InferredPredicateMatcher extends Matcher<t.InferredPredicate> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.InferredPredicate {\n if (\n !t.isNode(node) ||\n !t.isInferredPredicate(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function inferredPredicate(): Matcher<t.InferredPredicate> {\n return new InferredPredicateMatcher();\n}\nexport class InterfaceDeclarationMatcher\n extends Matcher<t.InterfaceDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n private readonly body?: Matcher<t.ObjectTypeAnnotation>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.InterfaceDeclaration {\n if (\n !t.isNode(node) ||\n !t.isInterfaceDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this._extends === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._extends === null) {\n // null matcher means we expect null value\n if (node.extends !== null) {\n return false;\n }\n } else if (Array.isArray(this._extends)) {\n if (\n !tupleOf<unknown>(...this._extends).matchValue(node.extends, [\n ...keys,\n \"extends\",\n ])\n ) {\n return false;\n }\n } else if (!this._extends.matchValue(node.extends, [...keys, \"extends\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function interfaceDeclaration(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n body?: Matcher<t.ObjectTypeAnnotation>,\n): Matcher<t.InterfaceDeclaration> {\n return new InterfaceDeclarationMatcher(\n id,\n typeParameters,\n _extends,\n body,\n );\n}\nexport class InterfaceExtendsMatcher extends Matcher<t.InterfaceExtends> {\n constructor(\n private readonly id?: Matcher<t.Identifier | t.QualifiedTypeIdentifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.InterfaceExtends {\n if (\n !t.isNode(node) ||\n !t.isInterfaceExtends(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function interfaceExtends(\n id?: Matcher<t.Identifier | t.QualifiedTypeIdentifier>,\n typeParameters?: Matcher<t.TypeParameterInstantiation> | null,\n): Matcher<t.InterfaceExtends> {\n return new InterfaceExtendsMatcher(\n id,\n typeParameters,\n );\n}\nexport class InterfaceTypeAnnotationMatcher\n extends Matcher<t.InterfaceTypeAnnotation> {\n constructor(\n private readonly _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n private readonly body?: Matcher<t.ObjectTypeAnnotation>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.InterfaceTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isInterfaceTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this._extends === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._extends === null) {\n // null matcher means we expect null value\n if (node.extends !== null) {\n return false;\n }\n } else if (Array.isArray(this._extends)) {\n if (\n !tupleOf<unknown>(...this._extends).matchValue(node.extends, [\n ...keys,\n \"extends\",\n ])\n ) {\n return false;\n }\n } else if (!this._extends.matchValue(node.extends, [...keys, \"extends\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function interfaceTypeAnnotation(\n _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n body?: Matcher<t.ObjectTypeAnnotation>,\n): Matcher<t.InterfaceTypeAnnotation> {\n return new InterfaceTypeAnnotationMatcher(\n _extends,\n body,\n );\n}\nexport class InterpreterDirectiveMatcher\n extends Matcher<t.InterpreterDirective> {\n constructor(\n private readonly value?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.InterpreterDirective {\n if (\n !t.isNode(node) ||\n !t.isInterpreterDirective(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"string\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function interpreterDirective(\n value?: Matcher<string> | string,\n): Matcher<t.InterpreterDirective> {\n return new InterpreterDirectiveMatcher(\n value,\n );\n}\nexport class IntersectionTypeAnnotationMatcher\n extends Matcher<t.IntersectionTypeAnnotation> {\n constructor(\n private readonly types?:\n | Matcher<Array<t.FlowType>>\n | Array<Matcher<t.FlowType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.IntersectionTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isIntersectionTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.types === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.types)) {\n if (\n !tupleOf<unknown>(...this.types).matchValue(node.types, [\n ...keys,\n \"types\",\n ])\n ) {\n return false;\n }\n } else if (!this.types.matchValue(node.types, [...keys, \"types\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function intersectionTypeAnnotation(\n types?: Matcher<Array<t.FlowType>> | Array<Matcher<t.FlowType>>,\n): Matcher<t.IntersectionTypeAnnotation> {\n return new IntersectionTypeAnnotationMatcher(\n types,\n );\n}\nexport class JSXAttributeMatcher extends Matcher<t.JSXAttribute> {\n constructor(\n private readonly name?: Matcher<t.JSXIdentifier | t.JSXNamespacedName>,\n private readonly value?:\n | Matcher<\n | t.JSXElement\n | t.JSXFragment\n | t.StringLiteral\n | t.JSXExpressionContainer\n >\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXAttribute {\n if (\n !t.isNode(node) ||\n !t.isJSXAttribute(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.value === null) {\n // null matcher means we expect null value\n if (node.value !== null) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxAttribute(\n name?: Matcher<t.JSXIdentifier | t.JSXNamespacedName>,\n value?:\n | Matcher<\n t.JSXElement | t.JSXFragment | t.StringLiteral | t.JSXExpressionContainer\n >\n | null,\n): Matcher<t.JSXAttribute> {\n return new JSXAttributeMatcher(\n name,\n value,\n );\n}\nexport class JSXClosingElementMatcher extends Matcher<t.JSXClosingElement> {\n constructor(\n private readonly name?: Matcher<\n t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXClosingElement {\n if (\n !t.isNode(node) ||\n !t.isJSXClosingElement(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxClosingElement(\n name?: Matcher<t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName>,\n): Matcher<t.JSXClosingElement> {\n return new JSXClosingElementMatcher(\n name,\n );\n}\nexport class JSXClosingFragmentMatcher extends Matcher<t.JSXClosingFragment> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXClosingFragment {\n if (\n !t.isNode(node) ||\n !t.isJSXClosingFragment(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxClosingFragment(): Matcher<t.JSXClosingFragment> {\n return new JSXClosingFragmentMatcher();\n}\nexport class JSXElementMatcher extends Matcher<t.JSXElement> {\n constructor(\n private readonly openingElement?: Matcher<t.JSXOpeningElement>,\n private readonly closingElement?: Matcher<t.JSXClosingElement> | null,\n private readonly children?:\n | Matcher<\n Array<\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXSpreadChild\n | t.JSXElement\n | t.JSXFragment\n >\n >\n | Array<\n | Matcher<t.JSXText>\n | Matcher<t.JSXExpressionContainer>\n | Matcher<t.JSXSpreadChild>\n | Matcher<t.JSXElement>\n | Matcher<t.JSXFragment>\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXElement {\n if (\n !t.isNode(node) ||\n !t.isJSXElement(node)\n ) {\n return false;\n }\n\n if (typeof this.openingElement === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.openingElement.matchValue(node.openingElement, [\n ...keys,\n \"openingElement\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.closingElement === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.closingElement === null) {\n // null matcher means we expect null value\n if (node.closingElement !== null) {\n return false;\n }\n } else if (\n !this.closingElement.matchValue(node.closingElement, [\n ...keys,\n \"closingElement\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.children === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.children)) {\n if (\n !tupleOf<unknown>(...this.children).matchValue(node.children, [\n ...keys,\n \"children\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.children.matchValue(node.children, [...keys, \"children\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxElement(\n openingElement?: Matcher<t.JSXOpeningElement>,\n closingElement?: Matcher<t.JSXClosingElement> | null,\n children?:\n | Matcher<\n Array<\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXSpreadChild\n | t.JSXElement\n | t.JSXFragment\n >\n >\n | Array<\n | Matcher<t.JSXText>\n | Matcher<t.JSXExpressionContainer>\n | Matcher<t.JSXSpreadChild>\n | Matcher<t.JSXElement>\n | Matcher<t.JSXFragment>\n >,\n): Matcher<t.JSXElement> {\n return new JSXElementMatcher(\n openingElement,\n closingElement,\n children,\n );\n}\nexport class JSXEmptyExpressionMatcher extends Matcher<t.JSXEmptyExpression> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXEmptyExpression {\n if (\n !t.isNode(node) ||\n !t.isJSXEmptyExpression(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxEmptyExpression(): Matcher<t.JSXEmptyExpression> {\n return new JSXEmptyExpressionMatcher();\n}\nexport class JSXExpressionContainerMatcher\n extends Matcher<t.JSXExpressionContainer> {\n constructor(\n private readonly expression?: Matcher<t.Expression | t.JSXEmptyExpression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXExpressionContainer {\n if (\n !t.isNode(node) ||\n !t.isJSXExpressionContainer(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxExpressionContainer(\n expression?: Matcher<t.Expression | t.JSXEmptyExpression>,\n): Matcher<t.JSXExpressionContainer> {\n return new JSXExpressionContainerMatcher(\n expression,\n );\n}\nexport class JSXFragmentMatcher extends Matcher<t.JSXFragment> {\n constructor(\n private readonly openingFragment?: Matcher<t.JSXOpeningFragment>,\n private readonly closingFragment?: Matcher<t.JSXClosingFragment>,\n private readonly children?:\n | Matcher<\n Array<\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXSpreadChild\n | t.JSXElement\n | t.JSXFragment\n >\n >\n | Array<\n | Matcher<t.JSXText>\n | Matcher<t.JSXExpressionContainer>\n | Matcher<t.JSXSpreadChild>\n | Matcher<t.JSXElement>\n | Matcher<t.JSXFragment>\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXFragment {\n if (\n !t.isNode(node) ||\n !t.isJSXFragment(node)\n ) {\n return false;\n }\n\n if (typeof this.openingFragment === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.openingFragment.matchValue(node.openingFragment, [\n ...keys,\n \"openingFragment\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.closingFragment === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.closingFragment.matchValue(node.closingFragment, [\n ...keys,\n \"closingFragment\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.children === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.children)) {\n if (\n !tupleOf<unknown>(...this.children).matchValue(node.children, [\n ...keys,\n \"children\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.children.matchValue(node.children, [...keys, \"children\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxFragment(\n openingFragment?: Matcher<t.JSXOpeningFragment>,\n closingFragment?: Matcher<t.JSXClosingFragment>,\n children?:\n | Matcher<\n Array<\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXSpreadChild\n | t.JSXElement\n | t.JSXFragment\n >\n >\n | Array<\n | Matcher<t.JSXText>\n | Matcher<t.JSXExpressionContainer>\n | Matcher<t.JSXSpreadChild>\n | Matcher<t.JSXElement>\n | Matcher<t.JSXFragment>\n >,\n): Matcher<t.JSXFragment> {\n return new JSXFragmentMatcher(\n openingFragment,\n closingFragment,\n children,\n );\n}\nexport class JSXIdentifierMatcher extends Matcher<t.JSXIdentifier> {\n constructor(\n private readonly name?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXIdentifier {\n if (\n !t.isNode(node) ||\n !t.isJSXIdentifier(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.name === \"string\") {\n if (this.name !== node.name) {\n return false;\n }\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxIdentifier(\n name?: Matcher<string> | string,\n): Matcher<t.JSXIdentifier> {\n return new JSXIdentifierMatcher(\n name,\n );\n}\nexport class JSXMemberExpressionMatcher extends Matcher<t.JSXMemberExpression> {\n constructor(\n private readonly object?: Matcher<t.JSXMemberExpression | t.JSXIdentifier>,\n private readonly property?: Matcher<t.JSXIdentifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXMemberExpression {\n if (\n !t.isNode(node) ||\n !t.isJSXMemberExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.object === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.object.matchValue(node.object, [...keys, \"object\"])) {\n return false;\n }\n\n if (typeof this.property === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.property.matchValue(node.property, [...keys, \"property\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxMemberExpression(\n object?: Matcher<t.JSXMemberExpression | t.JSXIdentifier>,\n property?: Matcher<t.JSXIdentifier>,\n): Matcher<t.JSXMemberExpression> {\n return new JSXMemberExpressionMatcher(\n object,\n property,\n );\n}\nexport class JSXNamespacedNameMatcher extends Matcher<t.JSXNamespacedName> {\n constructor(\n private readonly namespace?: Matcher<t.JSXIdentifier>,\n private readonly name?: Matcher<t.JSXIdentifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXNamespacedName {\n if (\n !t.isNode(node) ||\n !t.isJSXNamespacedName(node)\n ) {\n return false;\n }\n\n if (typeof this.namespace === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.namespace.matchValue(node.namespace, [...keys, \"namespace\"])\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxNamespacedName(\n namespace?: Matcher<t.JSXIdentifier>,\n name?: Matcher<t.JSXIdentifier>,\n): Matcher<t.JSXNamespacedName> {\n return new JSXNamespacedNameMatcher(\n namespace,\n name,\n );\n}\nexport class JSXOpeningElementMatcher extends Matcher<t.JSXOpeningElement> {\n constructor(\n private readonly name?: Matcher<\n t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName\n >,\n private readonly attributes?:\n | Matcher<Array<t.JSXAttribute | t.JSXSpreadAttribute>>\n | Array<Matcher<t.JSXAttribute> | Matcher<t.JSXSpreadAttribute>>,\n private readonly selfClosing?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXOpeningElement {\n if (\n !t.isNode(node) ||\n !t.isJSXOpeningElement(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n if (typeof this.attributes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.attributes)) {\n if (\n !tupleOf<unknown>(...this.attributes).matchValue(node.attributes, [\n ...keys,\n \"attributes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.attributes.matchValue(node.attributes, [...keys, \"attributes\"])\n ) {\n return false;\n }\n\n if (typeof this.selfClosing === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.selfClosing === \"boolean\") {\n if (this.selfClosing !== node.selfClosing) {\n return false;\n }\n } else if (\n !this.selfClosing.matchValue(node.selfClosing, [...keys, \"selfClosing\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxOpeningElement(\n name?: Matcher<t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName>,\n attributes?:\n | Matcher<Array<t.JSXAttribute | t.JSXSpreadAttribute>>\n | Array<Matcher<t.JSXAttribute> | Matcher<t.JSXSpreadAttribute>>,\n selfClosing?: Matcher<boolean> | boolean,\n): Matcher<t.JSXOpeningElement> {\n return new JSXOpeningElementMatcher(\n name,\n attributes,\n selfClosing,\n );\n}\nexport class JSXOpeningFragmentMatcher extends Matcher<t.JSXOpeningFragment> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXOpeningFragment {\n if (\n !t.isNode(node) ||\n !t.isJSXOpeningFragment(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxOpeningFragment(): Matcher<t.JSXOpeningFragment> {\n return new JSXOpeningFragmentMatcher();\n}\nexport class JSXSpreadAttributeMatcher extends Matcher<t.JSXSpreadAttribute> {\n constructor(\n private readonly argument?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXSpreadAttribute {\n if (\n !t.isNode(node) ||\n !t.isJSXSpreadAttribute(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxSpreadAttribute(\n argument?: Matcher<t.Expression>,\n): Matcher<t.JSXSpreadAttribute> {\n return new JSXSpreadAttributeMatcher(\n argument,\n );\n}\nexport class JSXSpreadChildMatcher extends Matcher<t.JSXSpreadChild> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXSpreadChild {\n if (\n !t.isNode(node) ||\n !t.isJSXSpreadChild(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxSpreadChild(\n expression?: Matcher<t.Expression>,\n): Matcher<t.JSXSpreadChild> {\n return new JSXSpreadChildMatcher(\n expression,\n );\n}\nexport class JSXTextMatcher extends Matcher<t.JSXText> {\n constructor(\n private readonly value?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXText {\n if (\n !t.isNode(node) ||\n !t.isJSXText(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"string\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxText(\n value?: Matcher<string> | string,\n): Matcher<t.JSXText> {\n return new JSXTextMatcher(\n value,\n );\n}\nexport class LabeledStatementMatcher extends Matcher<t.LabeledStatement> {\n constructor(\n private readonly label?: Matcher<t.Identifier>,\n private readonly body?: Matcher<t.Statement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.LabeledStatement {\n if (\n !t.isNode(node) ||\n !t.isLabeledStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.label === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.label.matchValue(node.label, [...keys, \"label\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function labeledStatement(\n label?: Matcher<t.Identifier>,\n body?: Matcher<t.Statement>,\n): Matcher<t.LabeledStatement> {\n return new LabeledStatementMatcher(\n label,\n body,\n );\n}\nexport class LogicalExpressionMatcher extends Matcher<t.LogicalExpression> {\n constructor(\n private readonly operator?: Matcher<\"||\" | \"&&\" | \"??\"> | string,\n private readonly left?: Matcher<t.Expression>,\n private readonly right?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.LogicalExpression {\n if (\n !t.isNode(node) ||\n !t.isLogicalExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.operator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.operator === \"string\") {\n if (this.operator !== node.operator) {\n return false;\n }\n } else if (\n !this.operator.matchValue(node.operator, [...keys, \"operator\"])\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function logicalExpression(\n operator?: Matcher<\"||\" | \"&&\" | \"??\"> | string,\n left?: Matcher<t.Expression>,\n right?: Matcher<t.Expression>,\n): Matcher<t.LogicalExpression> {\n return new LogicalExpressionMatcher(\n operator,\n left,\n right,\n );\n}\nexport class MemberExpressionMatcher extends Matcher<t.MemberExpression> {\n constructor(\n private readonly object?: Matcher<t.Expression | t.Super>,\n private readonly property?: Matcher<\n t.Expression | t.Identifier | t.PrivateName\n >,\n private readonly computed?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.MemberExpression {\n if (\n !t.isNode(node) ||\n !t.isMemberExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.object === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.object.matchValue(node.object, [...keys, \"object\"])) {\n return false;\n }\n\n if (typeof this.property === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.property.matchValue(node.property, [...keys, \"property\"])\n ) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function memberExpression(\n object?: Matcher<t.Expression | t.Super>,\n property?: Matcher<t.Expression | t.Identifier | t.PrivateName>,\n computed?: Matcher<boolean> | boolean,\n): Matcher<t.MemberExpression> {\n return new MemberExpressionMatcher(\n object,\n property,\n computed,\n );\n}\nexport class MetaPropertyMatcher extends Matcher<t.MetaProperty> {\n constructor(\n private readonly meta?: Matcher<t.Identifier>,\n private readonly property?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.MetaProperty {\n if (\n !t.isNode(node) ||\n !t.isMetaProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.meta === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.meta.matchValue(node.meta, [...keys, \"meta\"])) {\n return false;\n }\n\n if (typeof this.property === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.property.matchValue(node.property, [...keys, \"property\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function metaProperty(\n meta?: Matcher<t.Identifier>,\n property?: Matcher<t.Identifier>,\n): Matcher<t.MetaProperty> {\n return new MetaPropertyMatcher(\n meta,\n property,\n );\n}\nexport class MixedTypeAnnotationMatcher extends Matcher<t.MixedTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.MixedTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isMixedTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function mixedTypeAnnotation(): Matcher<t.MixedTypeAnnotation> {\n return new MixedTypeAnnotationMatcher();\n}\nexport class ModuleExpressionMatcher extends Matcher<t.ModuleExpression> {\n constructor(\n private readonly body?: Matcher<t.Program>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ModuleExpression {\n if (\n !t.isNode(node) ||\n !t.isModuleExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function moduleExpression(\n body?: Matcher<t.Program>,\n): Matcher<t.ModuleExpression> {\n return new ModuleExpressionMatcher(\n body,\n );\n}\nexport class NewExpressionMatcher extends Matcher<t.NewExpression> {\n constructor(\n private readonly callee?: Matcher<t.Expression>,\n private readonly _arguments?:\n | Matcher<Array<t.Expression | t.SpreadElement | t.ArgumentPlaceholder>>\n | Array<\n | Matcher<t.Expression>\n | Matcher<t.SpreadElement>\n | Matcher<t.ArgumentPlaceholder>\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NewExpression {\n if (\n !t.isNode(node) ||\n !t.isNewExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.callee === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.callee.matchValue(node.callee, [...keys, \"callee\"])) {\n return false;\n }\n\n if (typeof this._arguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this._arguments)) {\n if (\n !tupleOf<unknown>(...this._arguments).matchValue(node.arguments, [\n ...keys,\n \"arguments\",\n ])\n ) {\n return false;\n }\n } else if (\n !this._arguments.matchValue(node.arguments, [...keys, \"arguments\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function newExpression(\n callee?: Matcher<t.Expression>,\n _arguments?:\n | Matcher<Array<t.Expression | t.SpreadElement | t.ArgumentPlaceholder>>\n | Array<\n | Matcher<t.Expression>\n | Matcher<t.SpreadElement>\n | Matcher<t.ArgumentPlaceholder>\n >,\n): Matcher<t.NewExpression> {\n return new NewExpressionMatcher(\n callee,\n _arguments,\n );\n}\nexport class NullLiteralMatcher extends Matcher<t.NullLiteral> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NullLiteral {\n if (\n !t.isNode(node) ||\n !t.isNullLiteral(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function nullLiteral(): Matcher<t.NullLiteral> {\n return new NullLiteralMatcher();\n}\nexport class NullLiteralTypeAnnotationMatcher\n extends Matcher<t.NullLiteralTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NullLiteralTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isNullLiteralTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function nullLiteralTypeAnnotation(): Matcher<\n t.NullLiteralTypeAnnotation\n> {\n return new NullLiteralTypeAnnotationMatcher();\n}\nexport class NullableTypeAnnotationMatcher\n extends Matcher<t.NullableTypeAnnotation> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NullableTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isNullableTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function nullableTypeAnnotation(\n typeAnnotation?: Matcher<t.FlowType>,\n): Matcher<t.NullableTypeAnnotation> {\n return new NullableTypeAnnotationMatcher(\n typeAnnotation,\n );\n}\nexport class NumberLiteralTypeAnnotationMatcher\n extends Matcher<t.NumberLiteralTypeAnnotation> {\n constructor(\n private readonly value?: Matcher<number> | number,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NumberLiteralTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isNumberLiteralTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"number\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function numberLiteralTypeAnnotation(\n value?: Matcher<number> | number,\n): Matcher<t.NumberLiteralTypeAnnotation> {\n return new NumberLiteralTypeAnnotationMatcher(\n value,\n );\n}\nexport class NumberTypeAnnotationMatcher\n extends Matcher<t.NumberTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NumberTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isNumberTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function numberTypeAnnotation(): Matcher<t.NumberTypeAnnotation> {\n return new NumberTypeAnnotationMatcher();\n}\nexport class NumericLiteralMatcher extends Matcher<t.NumericLiteral> {\n constructor(\n private readonly value?: Matcher<number> | number,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NumericLiteral {\n if (\n !t.isNode(node) ||\n !t.isNumericLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"number\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function numericLiteral(\n value?: Matcher<number> | number,\n): Matcher<t.NumericLiteral> {\n return new NumericLiteralMatcher(\n value,\n );\n}\nexport class ObjectExpressionMatcher extends Matcher<t.ObjectExpression> {\n constructor(\n private readonly properties?:\n | Matcher<Array<t.ObjectMethod | t.ObjectProperty | t.SpreadElement>>\n | Array<\n | Matcher<t.ObjectMethod>\n | Matcher<t.ObjectProperty>\n | Matcher<t.SpreadElement>\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectExpression {\n if (\n !t.isNode(node) ||\n !t.isObjectExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.properties === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.properties)) {\n if (\n !tupleOf<unknown>(...this.properties).matchValue(node.properties, [\n ...keys,\n \"properties\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.properties.matchValue(node.properties, [...keys, \"properties\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectExpression(\n properties?:\n | Matcher<Array<t.ObjectMethod | t.ObjectProperty | t.SpreadElement>>\n | Array<\n | Matcher<t.ObjectMethod>\n | Matcher<t.ObjectProperty>\n | Matcher<t.SpreadElement>\n >,\n): Matcher<t.ObjectExpression> {\n return new ObjectExpressionMatcher(\n properties,\n );\n}\nexport class ObjectMethodMatcher extends Matcher<t.ObjectMethod> {\n constructor(\n private readonly kind?: Matcher<\"method\" | \"get\" | \"set\"> | string,\n private readonly key?: Matcher<\n | t.Expression\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n >,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly computed?: Matcher<boolean> | boolean,\n private readonly generator?: Matcher<boolean> | boolean,\n private readonly async?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectMethod {\n if (\n !t.isNode(node) ||\n !t.isObjectMethod(node)\n ) {\n return false;\n }\n\n if (typeof this.kind === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.kind === \"string\") {\n if (this.kind !== node.kind) {\n return false;\n }\n } else if (!this.kind.matchValue(node.kind, [...keys, \"kind\"])) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n if (typeof this.generator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.generator === \"boolean\") {\n if (this.generator !== node.generator) {\n return false;\n }\n } else if (\n !this.generator.matchValue(node.generator, [...keys, \"generator\"])\n ) {\n return false;\n }\n\n if (typeof this.async === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.async === \"boolean\") {\n if (this.async !== node.async) {\n return false;\n }\n } else if (!this.async.matchValue(node.async, [...keys, \"async\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectMethod(\n kind?: Matcher<\"method\" | \"get\" | \"set\"> | string,\n key?: Matcher<\n | t.Expression\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n >,\n params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n body?: Matcher<t.BlockStatement>,\n computed?: Matcher<boolean> | boolean,\n generator?: Matcher<boolean> | boolean,\n async?: Matcher<boolean> | boolean,\n): Matcher<t.ObjectMethod> {\n return new ObjectMethodMatcher(\n kind,\n key,\n params,\n body,\n computed,\n generator,\n async,\n );\n}\nexport class ObjectPatternMatcher extends Matcher<t.ObjectPattern> {\n constructor(\n private readonly properties?:\n | Matcher<Array<t.RestElement | t.ObjectProperty>>\n | Array<Matcher<t.RestElement> | Matcher<t.ObjectProperty>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectPattern {\n if (\n !t.isNode(node) ||\n !t.isObjectPattern(node)\n ) {\n return false;\n }\n\n if (typeof this.properties === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.properties)) {\n if (\n !tupleOf<unknown>(...this.properties).matchValue(node.properties, [\n ...keys,\n \"properties\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.properties.matchValue(node.properties, [...keys, \"properties\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectPattern(\n properties?:\n | Matcher<Array<t.RestElement | t.ObjectProperty>>\n | Array<Matcher<t.RestElement> | Matcher<t.ObjectProperty>>,\n): Matcher<t.ObjectPattern> {\n return new ObjectPatternMatcher(\n properties,\n );\n}\nexport class ObjectPropertyMatcher extends Matcher<t.ObjectProperty> {\n constructor(\n private readonly key?: Matcher<\n | t.Expression\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.PrivateName\n >,\n private readonly value?: Matcher<t.Expression | t.PatternLike>,\n private readonly computed?: Matcher<boolean> | boolean,\n private readonly shorthand?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectProperty {\n if (\n !t.isNode(node) ||\n !t.isObjectProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n if (typeof this.shorthand === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.shorthand === \"boolean\") {\n if (this.shorthand !== node.shorthand) {\n return false;\n }\n } else if (\n !this.shorthand.matchValue(node.shorthand, [...keys, \"shorthand\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectProperty(\n key?: Matcher<\n | t.Expression\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.PrivateName\n >,\n value?: Matcher<t.Expression | t.PatternLike>,\n computed?: Matcher<boolean> | boolean,\n shorthand?: Matcher<boolean> | boolean,\n): Matcher<t.ObjectProperty> {\n return new ObjectPropertyMatcher(\n key,\n value,\n computed,\n shorthand,\n );\n}\nexport class ObjectTypeAnnotationMatcher\n extends Matcher<t.ObjectTypeAnnotation> {\n constructor(\n private readonly properties?:\n | Matcher<Array<t.ObjectTypeProperty | t.ObjectTypeSpreadProperty>>\n | Array<\n Matcher<t.ObjectTypeProperty> | Matcher<t.ObjectTypeSpreadProperty>\n >,\n private readonly indexers?:\n | Matcher<Array<t.ObjectTypeIndexer>>\n | Array<Matcher<t.ObjectTypeIndexer>>,\n private readonly callProperties?:\n | Matcher<Array<t.ObjectTypeCallProperty>>\n | Array<Matcher<t.ObjectTypeCallProperty>>,\n private readonly internalSlots?:\n | Matcher<Array<t.ObjectTypeInternalSlot>>\n | Array<Matcher<t.ObjectTypeInternalSlot>>,\n private readonly exact?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isObjectTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.properties === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.properties)) {\n if (\n !tupleOf<unknown>(...this.properties).matchValue(node.properties, [\n ...keys,\n \"properties\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.properties.matchValue(node.properties, [...keys, \"properties\"])\n ) {\n return false;\n }\n\n if (typeof this.indexers === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.indexers)) {\n if (\n !tupleOf<unknown>(...this.indexers).matchValue(node.indexers, [\n ...keys,\n \"indexers\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.indexers.matchValue(node.indexers, [...keys, \"indexers\"])\n ) {\n return false;\n }\n\n if (typeof this.callProperties === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.callProperties)) {\n if (\n !tupleOf<unknown>(...this.callProperties).matchValue(\n node.callProperties,\n [...keys, \"callProperties\"],\n )\n ) {\n return false;\n }\n } else if (\n !this.callProperties.matchValue(node.callProperties, [\n ...keys,\n \"callProperties\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.internalSlots === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.internalSlots)) {\n if (\n !tupleOf<unknown>(...this.internalSlots).matchValue(\n node.internalSlots,\n [...keys, \"internalSlots\"],\n )\n ) {\n return false;\n }\n } else if (\n !this.internalSlots.matchValue(node.internalSlots, [\n ...keys,\n \"internalSlots\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.exact === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.exact === \"boolean\") {\n if (this.exact !== node.exact) {\n return false;\n }\n } else if (!this.exact.matchValue(node.exact, [...keys, \"exact\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectTypeAnnotation(\n properties?:\n | Matcher<Array<t.ObjectTypeProperty | t.ObjectTypeSpreadProperty>>\n | Array<\n Matcher<t.ObjectTypeProperty> | Matcher<t.ObjectTypeSpreadProperty>\n >,\n indexers?:\n | Matcher<Array<t.ObjectTypeIndexer>>\n | Array<Matcher<t.ObjectTypeIndexer>>,\n callProperties?:\n | Matcher<Array<t.ObjectTypeCallProperty>>\n | Array<Matcher<t.ObjectTypeCallProperty>>,\n internalSlots?:\n | Matcher<Array<t.ObjectTypeInternalSlot>>\n | Array<Matcher<t.ObjectTypeInternalSlot>>,\n exact?: Matcher<boolean> | boolean,\n): Matcher<t.ObjectTypeAnnotation> {\n return new ObjectTypeAnnotationMatcher(\n properties,\n indexers,\n callProperties,\n internalSlots,\n exact,\n );\n}\nexport class ObjectTypeCallPropertyMatcher\n extends Matcher<t.ObjectTypeCallProperty> {\n constructor(\n private readonly value?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectTypeCallProperty {\n if (\n !t.isNode(node) ||\n !t.isObjectTypeCallProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectTypeCallProperty(\n value?: Matcher<t.FlowType>,\n): Matcher<t.ObjectTypeCallProperty> {\n return new ObjectTypeCallPropertyMatcher(\n value,\n );\n}\nexport class ObjectTypeIndexerMatcher extends Matcher<t.ObjectTypeIndexer> {\n constructor(\n private readonly id?: Matcher<t.Identifier> | null,\n private readonly key?: Matcher<t.FlowType>,\n private readonly value?: Matcher<t.FlowType>,\n private readonly variance?: Matcher<t.Variance> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectTypeIndexer {\n if (\n !t.isNode(node) ||\n !t.isObjectTypeIndexer(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.id === null) {\n // null matcher means we expect null value\n if (node.id !== null) {\n return false;\n }\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.variance === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.variance === null) {\n // null matcher means we expect null value\n if (node.variance !== null) {\n return false;\n }\n } else if (\n !this.variance.matchValue(node.variance, [...keys, \"variance\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectTypeIndexer(\n id?: Matcher<t.Identifier> | null,\n key?: Matcher<t.FlowType>,\n value?: Matcher<t.FlowType>,\n variance?: Matcher<t.Variance> | null,\n): Matcher<t.ObjectTypeIndexer> {\n return new ObjectTypeIndexerMatcher(\n id,\n key,\n value,\n variance,\n );\n}\nexport class ObjectTypeInternalSlotMatcher\n extends Matcher<t.ObjectTypeInternalSlot> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly value?: Matcher<t.FlowType>,\n private readonly optional?: Matcher<boolean> | boolean,\n private readonly _static?: Matcher<boolean> | boolean,\n private readonly method?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectTypeInternalSlot {\n if (\n !t.isNode(node) ||\n !t.isObjectTypeInternalSlot(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.optional === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.optional === \"boolean\") {\n if (this.optional !== node.optional) {\n return false;\n }\n } else if (\n !this.optional.matchValue(node.optional, [...keys, \"optional\"])\n ) {\n return false;\n }\n\n if (typeof this._static === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._static === \"boolean\") {\n if (this._static !== node.static) {\n return false;\n }\n } else if (!this._static.matchValue(node.static, [...keys, \"static\"])) {\n return false;\n }\n\n if (typeof this.method === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.method === \"boolean\") {\n if (this.method !== node.method) {\n return false;\n }\n } else if (!this.method.matchValue(node.method, [...keys, \"method\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectTypeInternalSlot(\n id?: Matcher<t.Identifier>,\n value?: Matcher<t.FlowType>,\n optional?: Matcher<boolean> | boolean,\n _static?: Matcher<boolean> | boolean,\n method?: Matcher<boolean> | boolean,\n): Matcher<t.ObjectTypeInternalSlot> {\n return new ObjectTypeInternalSlotMatcher(\n id,\n value,\n optional,\n _static,\n method,\n );\n}\nexport class ObjectTypePropertyMatcher extends Matcher<t.ObjectTypeProperty> {\n constructor(\n private readonly key?: Matcher<\n t.Identifier | t.StringLiteral | t.NumericLiteral\n >,\n private readonly value?: Matcher<t.FlowType>,\n private readonly variance?: Matcher<t.Variance> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectTypeProperty {\n if (\n !t.isNode(node) ||\n !t.isObjectTypeProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.variance === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.variance === null) {\n // null matcher means we expect null value\n if (node.variance !== null) {\n return false;\n }\n } else if (\n !this.variance.matchValue(node.variance, [...keys, \"variance\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectTypeProperty(\n key?: Matcher<t.Identifier | t.StringLiteral | t.NumericLiteral>,\n value?: Matcher<t.FlowType>,\n variance?: Matcher<t.Variance> | null,\n): Matcher<t.ObjectTypeProperty> {\n return new ObjectTypePropertyMatcher(\n key,\n value,\n variance,\n );\n}\nexport class ObjectTypeSpreadPropertyMatcher\n extends Matcher<t.ObjectTypeSpreadProperty> {\n constructor(\n private readonly argument?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectTypeSpreadProperty {\n if (\n !t.isNode(node) ||\n !t.isObjectTypeSpreadProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectTypeSpreadProperty(\n argument?: Matcher<t.FlowType>,\n): Matcher<t.ObjectTypeSpreadProperty> {\n return new ObjectTypeSpreadPropertyMatcher(\n argument,\n );\n}\nexport class OpaqueTypeMatcher extends Matcher<t.OpaqueType> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly supertype?: Matcher<t.FlowType> | null,\n private readonly impltype?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.OpaqueType {\n if (\n !t.isNode(node) ||\n !t.isOpaqueType(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.supertype === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.supertype === null) {\n // null matcher means we expect null value\n if (node.supertype !== null) {\n return false;\n }\n } else if (\n !this.supertype.matchValue(node.supertype, [...keys, \"supertype\"])\n ) {\n return false;\n }\n\n if (typeof this.impltype === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.impltype.matchValue(node.impltype, [...keys, \"impltype\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function opaqueType(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n supertype?: Matcher<t.FlowType> | null,\n impltype?: Matcher<t.FlowType>,\n): Matcher<t.OpaqueType> {\n return new OpaqueTypeMatcher(\n id,\n typeParameters,\n supertype,\n impltype,\n );\n}\nexport class OptionalCallExpressionMatcher\n extends Matcher<t.OptionalCallExpression> {\n constructor(\n private readonly callee?: Matcher<t.Expression>,\n private readonly _arguments?:\n | Matcher<Array<t.Expression | t.SpreadElement | t.ArgumentPlaceholder>>\n | Array<\n | Matcher<t.Expression>\n | Matcher<t.SpreadElement>\n | Matcher<t.ArgumentPlaceholder>\n >,\n private readonly optional?: Matcher<any> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.OptionalCallExpression {\n if (\n !t.isNode(node) ||\n !t.isOptionalCallExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.callee === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.callee.matchValue(node.callee, [...keys, \"callee\"])) {\n return false;\n }\n\n if (typeof this._arguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this._arguments)) {\n if (\n !tupleOf<unknown>(...this._arguments).matchValue(node.arguments, [\n ...keys,\n \"arguments\",\n ])\n ) {\n return false;\n }\n } else if (\n !this._arguments.matchValue(node.arguments, [...keys, \"arguments\"])\n ) {\n return false;\n }\n\n if (typeof this.optional === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.optional === \"boolean\") {\n if (this.optional !== node.optional) {\n return false;\n }\n } else if (\n !this.optional.matchValue(node.optional, [...keys, \"optional\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function optionalCallExpression(\n callee?: Matcher<t.Expression>,\n _arguments?:\n | Matcher<Array<t.Expression | t.SpreadElement | t.ArgumentPlaceholder>>\n | Array<\n | Matcher<t.Expression>\n | Matcher<t.SpreadElement>\n | Matcher<t.ArgumentPlaceholder>\n >,\n optional?: Matcher<any> | boolean,\n): Matcher<t.OptionalCallExpression> {\n return new OptionalCallExpressionMatcher(\n callee,\n _arguments,\n optional,\n );\n}\nexport class OptionalIndexedAccessTypeMatcher\n extends Matcher<t.OptionalIndexedAccessType> {\n constructor(\n private readonly objectType?: Matcher<t.FlowType>,\n private readonly indexType?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.OptionalIndexedAccessType {\n if (\n !t.isNode(node) ||\n !t.isOptionalIndexedAccessType(node)\n ) {\n return false;\n }\n\n if (typeof this.objectType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.objectType.matchValue(node.objectType, [...keys, \"objectType\"])\n ) {\n return false;\n }\n\n if (typeof this.indexType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.indexType.matchValue(node.indexType, [...keys, \"indexType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function optionalIndexedAccessType(\n objectType?: Matcher<t.FlowType>,\n indexType?: Matcher<t.FlowType>,\n): Matcher<t.OptionalIndexedAccessType> {\n return new OptionalIndexedAccessTypeMatcher(\n objectType,\n indexType,\n );\n}\nexport class OptionalMemberExpressionMatcher\n extends Matcher<t.OptionalMemberExpression> {\n constructor(\n private readonly object?: Matcher<t.Expression>,\n private readonly property?: Matcher<t.Expression | t.PrivateName>,\n private readonly computed?: Matcher<boolean> | boolean,\n private readonly optional?: Matcher<any> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.OptionalMemberExpression {\n if (\n !t.isNode(node) ||\n !t.isOptionalMemberExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.object === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.object.matchValue(node.object, [...keys, \"object\"])) {\n return false;\n }\n\n if (typeof this.property === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.property.matchValue(node.property, [...keys, \"property\"])\n ) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n if (typeof this.optional === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.optional === \"boolean\") {\n if (this.optional !== node.optional) {\n return false;\n }\n } else if (\n !this.optional.matchValue(node.optional, [...keys, \"optional\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function optionalMemberExpression(\n object?: Matcher<t.Expression>,\n property?: Matcher<t.Expression | t.PrivateName>,\n computed?: Matcher<boolean> | boolean,\n optional?: Matcher<any> | boolean,\n): Matcher<t.OptionalMemberExpression> {\n return new OptionalMemberExpressionMatcher(\n object,\n property,\n computed,\n optional,\n );\n}\nexport class ParenthesizedExpressionMatcher\n extends Matcher<t.ParenthesizedExpression> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ParenthesizedExpression {\n if (\n !t.isNode(node) ||\n !t.isParenthesizedExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function parenthesizedExpression(\n expression?: Matcher<t.Expression>,\n): Matcher<t.ParenthesizedExpression> {\n return new ParenthesizedExpressionMatcher(\n expression,\n );\n}\nexport class PlaceholderMatcher extends Matcher<t.Placeholder> {\n constructor(\n private readonly expectedNode?:\n | Matcher<\n | \"Identifier\"\n | \"StringLiteral\"\n | \"Expression\"\n | \"Statement\"\n | \"Declaration\"\n | \"BlockStatement\"\n | \"ClassBody\"\n | \"Pattern\"\n >\n | string,\n private readonly name?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Placeholder {\n if (\n !t.isNode(node) ||\n !t.isPlaceholder(node)\n ) {\n return false;\n }\n\n if (typeof this.expectedNode === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.expectedNode === \"string\") {\n if (this.expectedNode !== node.expectedNode) {\n return false;\n }\n } else if (\n !this.expectedNode.matchValue(node.expectedNode, [\n ...keys,\n \"expectedNode\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function placeholder(\n expectedNode?:\n | Matcher<\n | \"Identifier\"\n | \"StringLiteral\"\n | \"Expression\"\n | \"Statement\"\n | \"Declaration\"\n | \"BlockStatement\"\n | \"ClassBody\"\n | \"Pattern\"\n >\n | string,\n name?: Matcher<t.Identifier>,\n): Matcher<t.Placeholder> {\n return new PlaceholderMatcher(\n expectedNode,\n name,\n );\n}\nexport class PrivateNameMatcher extends Matcher<t.PrivateName> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.PrivateName {\n if (\n !t.isNode(node) ||\n !t.isPrivateName(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function privateName(\n id?: Matcher<t.Identifier>,\n): Matcher<t.PrivateName> {\n return new PrivateNameMatcher(\n id,\n );\n}\nexport class ProgramMatcher extends Matcher<t.Program> {\n constructor(\n private readonly body?:\n | Matcher<Array<t.Statement>>\n | Array<Matcher<t.Statement>>,\n private readonly directives?:\n | Matcher<Array<t.Directive>>\n | Array<Matcher<t.Directive>>,\n private readonly sourceType?: Matcher<\"script\" | \"module\"> | string,\n private readonly interpreter?: Matcher<t.InterpreterDirective> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Program {\n if (\n !t.isNode(node) ||\n !t.isProgram(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.body)) {\n if (\n !tupleOf<unknown>(...this.body).matchValue(node.body, [...keys, \"body\"])\n ) {\n return false;\n }\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.directives === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.directives)) {\n if (\n !tupleOf<unknown>(...this.directives).matchValue(node.directives, [\n ...keys,\n \"directives\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.directives.matchValue(node.directives, [...keys, \"directives\"])\n ) {\n return false;\n }\n\n if (typeof this.sourceType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.sourceType === \"string\") {\n if (this.sourceType !== node.sourceType) {\n return false;\n }\n } else if (\n !this.sourceType.matchValue(node.sourceType, [...keys, \"sourceType\"])\n ) {\n return false;\n }\n\n if (typeof this.interpreter === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.interpreter === null) {\n // null matcher means we expect null value\n if (node.interpreter !== null) {\n return false;\n }\n } else if (\n !this.interpreter.matchValue(node.interpreter, [...keys, \"interpreter\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function program(\n body?: Matcher<Array<t.Statement>> | Array<Matcher<t.Statement>>,\n directives?: Matcher<Array<t.Directive>> | Array<Matcher<t.Directive>>,\n sourceType?: Matcher<\"script\" | \"module\"> | string,\n interpreter?: Matcher<t.InterpreterDirective> | null,\n): Matcher<t.Program> {\n return new ProgramMatcher(\n body,\n directives,\n sourceType,\n interpreter,\n );\n}\nexport class QualifiedTypeIdentifierMatcher\n extends Matcher<t.QualifiedTypeIdentifier> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly qualification?: Matcher<\n t.Identifier | t.QualifiedTypeIdentifier\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.QualifiedTypeIdentifier {\n if (\n !t.isNode(node) ||\n !t.isQualifiedTypeIdentifier(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.qualification === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.qualification.matchValue(node.qualification, [\n ...keys,\n \"qualification\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function qualifiedTypeIdentifier(\n id?: Matcher<t.Identifier>,\n qualification?: Matcher<t.Identifier | t.QualifiedTypeIdentifier>,\n): Matcher<t.QualifiedTypeIdentifier> {\n return new QualifiedTypeIdentifierMatcher(\n id,\n qualification,\n );\n}\nexport class RegExpLiteralMatcher extends Matcher<t.RegExpLiteral> {\n constructor(\n private readonly pattern?: Matcher<string> | string,\n private readonly flags?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.RegExpLiteral {\n if (\n !t.isNode(node) ||\n !t.isRegExpLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.pattern === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.pattern === \"string\") {\n if (this.pattern !== node.pattern) {\n return false;\n }\n } else if (!this.pattern.matchValue(node.pattern, [...keys, \"pattern\"])) {\n return false;\n }\n\n if (typeof this.flags === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.flags === \"string\") {\n if (this.flags !== node.flags) {\n return false;\n }\n } else if (!this.flags.matchValue(node.flags, [...keys, \"flags\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function regExpLiteral(\n pattern?: Matcher<string> | string,\n flags?: Matcher<string> | string,\n): Matcher<t.RegExpLiteral> {\n return new RegExpLiteralMatcher(\n pattern,\n flags,\n );\n}\nexport class RestElementMatcher extends Matcher<t.RestElement> {\n constructor(\n private readonly argument?: Matcher<\n | t.Identifier\n | t.ArrayPattern\n | t.ObjectPattern\n | t.MemberExpression\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.RestElement {\n if (\n !t.isNode(node) ||\n !t.isRestElement(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function restElement(\n argument?: Matcher<\n | t.Identifier\n | t.ArrayPattern\n | t.ObjectPattern\n | t.MemberExpression\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n): Matcher<t.RestElement> {\n return new RestElementMatcher(\n argument,\n );\n}\nexport class ReturnStatementMatcher extends Matcher<t.ReturnStatement> {\n constructor(\n private readonly argument?: Matcher<t.Expression> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ReturnStatement {\n if (\n !t.isNode(node) ||\n !t.isReturnStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.argument === null) {\n // null matcher means we expect null value\n if (node.argument !== null) {\n return false;\n }\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function returnStatement(\n argument?: Matcher<t.Expression> | null,\n): Matcher<t.ReturnStatement> {\n return new ReturnStatementMatcher(\n argument,\n );\n}\nexport class SequenceExpressionMatcher extends Matcher<t.SequenceExpression> {\n constructor(\n private readonly expressions?:\n | Matcher<Array<t.Expression>>\n | Array<Matcher<t.Expression>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.SequenceExpression {\n if (\n !t.isNode(node) ||\n !t.isSequenceExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expressions === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.expressions)) {\n if (\n !tupleOf<unknown>(...this.expressions).matchValue(node.expressions, [\n ...keys,\n \"expressions\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.expressions.matchValue(node.expressions, [...keys, \"expressions\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function sequenceExpression(\n expressions?: Matcher<Array<t.Expression>> | Array<Matcher<t.Expression>>,\n): Matcher<t.SequenceExpression> {\n return new SequenceExpressionMatcher(\n expressions,\n );\n}\nexport class SpreadElementMatcher extends Matcher<t.SpreadElement> {\n constructor(\n private readonly argument?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.SpreadElement {\n if (\n !t.isNode(node) ||\n !t.isSpreadElement(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function spreadElement(\n argument?: Matcher<t.Expression>,\n): Matcher<t.SpreadElement> {\n return new SpreadElementMatcher(\n argument,\n );\n}\nexport class StaticBlockMatcher extends Matcher<t.StaticBlock> {\n constructor(\n private readonly body?:\n | Matcher<Array<t.Statement>>\n | Array<Matcher<t.Statement>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.StaticBlock {\n if (\n !t.isNode(node) ||\n !t.isStaticBlock(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.body)) {\n if (\n !tupleOf<unknown>(...this.body).matchValue(node.body, [...keys, \"body\"])\n ) {\n return false;\n }\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function staticBlock(\n body?: Matcher<Array<t.Statement>> | Array<Matcher<t.Statement>>,\n): Matcher<t.StaticBlock> {\n return new StaticBlockMatcher(\n body,\n );\n}\nexport class StringLiteralMatcher extends Matcher<t.StringLiteral> {\n constructor(\n private readonly value?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.StringLiteral {\n if (\n !t.isNode(node) ||\n !t.isStringLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"string\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function stringLiteral(\n value?: Matcher<string> | string,\n): Matcher<t.StringLiteral> {\n return new StringLiteralMatcher(\n value,\n );\n}\nexport class StringLiteralTypeAnnotationMatcher\n extends Matcher<t.StringLiteralTypeAnnotation> {\n constructor(\n private readonly value?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.StringLiteralTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isStringLiteralTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"string\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function stringLiteralTypeAnnotation(\n value?: Matcher<string> | string,\n): Matcher<t.StringLiteralTypeAnnotation> {\n return new StringLiteralTypeAnnotationMatcher(\n value,\n );\n}\nexport class StringTypeAnnotationMatcher\n extends Matcher<t.StringTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.StringTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isStringTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function stringTypeAnnotation(): Matcher<t.StringTypeAnnotation> {\n return new StringTypeAnnotationMatcher();\n}\nexport class SuperMatcher extends Matcher<t.Super> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Super {\n if (\n !t.isNode(node) ||\n !t.isSuper(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function Super(): Matcher<t.Super> {\n return new SuperMatcher();\n}\nexport class SwitchCaseMatcher extends Matcher<t.SwitchCase> {\n constructor(\n private readonly test?: Matcher<t.Expression> | null,\n private readonly consequent?:\n | Matcher<Array<t.Statement>>\n | Array<Matcher<t.Statement>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.SwitchCase {\n if (\n !t.isNode(node) ||\n !t.isSwitchCase(node)\n ) {\n return false;\n }\n\n if (typeof this.test === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.test === null) {\n // null matcher means we expect null value\n if (node.test !== null) {\n return false;\n }\n } else if (!this.test.matchValue(node.test, [...keys, \"test\"])) {\n return false;\n }\n\n if (typeof this.consequent === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.consequent)) {\n if (\n !tupleOf<unknown>(...this.consequent).matchValue(node.consequent, [\n ...keys,\n \"consequent\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.consequent.matchValue(node.consequent, [...keys, \"consequent\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function switchCase(\n test?: Matcher<t.Expression> | null,\n consequent?: Matcher<Array<t.Statement>> | Array<Matcher<t.Statement>>,\n): Matcher<t.SwitchCase> {\n return new SwitchCaseMatcher(\n test,\n consequent,\n );\n}\nexport class SwitchStatementMatcher extends Matcher<t.SwitchStatement> {\n constructor(\n private readonly discriminant?: Matcher<t.Expression>,\n private readonly cases?:\n | Matcher<Array<t.SwitchCase>>\n | Array<Matcher<t.SwitchCase>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.SwitchStatement {\n if (\n !t.isNode(node) ||\n !t.isSwitchStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.discriminant === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.discriminant.matchValue(node.discriminant, [\n ...keys,\n \"discriminant\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.cases === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.cases)) {\n if (\n !tupleOf<unknown>(...this.cases).matchValue(node.cases, [\n ...keys,\n \"cases\",\n ])\n ) {\n return false;\n }\n } else if (!this.cases.matchValue(node.cases, [...keys, \"cases\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function switchStatement(\n discriminant?: Matcher<t.Expression>,\n cases?: Matcher<Array<t.SwitchCase>> | Array<Matcher<t.SwitchCase>>,\n): Matcher<t.SwitchStatement> {\n return new SwitchStatementMatcher(\n discriminant,\n cases,\n );\n}\nexport class SymbolTypeAnnotationMatcher\n extends Matcher<t.SymbolTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.SymbolTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isSymbolTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function symbolTypeAnnotation(): Matcher<t.SymbolTypeAnnotation> {\n return new SymbolTypeAnnotationMatcher();\n}\nexport class TSAnyKeywordMatcher extends Matcher<t.TSAnyKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSAnyKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSAnyKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsAnyKeyword(): Matcher<t.TSAnyKeyword> {\n return new TSAnyKeywordMatcher();\n}\nexport class TSArrayTypeMatcher extends Matcher<t.TSArrayType> {\n constructor(\n private readonly elementType?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSArrayType {\n if (\n !t.isNode(node) ||\n !t.isTSArrayType(node)\n ) {\n return false;\n }\n\n if (typeof this.elementType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.elementType.matchValue(node.elementType, [...keys, \"elementType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsArrayType(\n elementType?: Matcher<t.TSType>,\n): Matcher<t.TSArrayType> {\n return new TSArrayTypeMatcher(\n elementType,\n );\n}\nexport class TSAsExpressionMatcher extends Matcher<t.TSAsExpression> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSAsExpression {\n if (\n !t.isNode(node) ||\n !t.isTSAsExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsAsExpression(\n expression?: Matcher<t.Expression>,\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSAsExpression> {\n return new TSAsExpressionMatcher(\n expression,\n typeAnnotation,\n );\n}\nexport class TSBigIntKeywordMatcher extends Matcher<t.TSBigIntKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSBigIntKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSBigIntKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsBigIntKeyword(): Matcher<t.TSBigIntKeyword> {\n return new TSBigIntKeywordMatcher();\n}\nexport class TSBooleanKeywordMatcher extends Matcher<t.TSBooleanKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSBooleanKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSBooleanKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsBooleanKeyword(): Matcher<t.TSBooleanKeyword> {\n return new TSBooleanKeywordMatcher();\n}\nexport class TSCallSignatureDeclarationMatcher\n extends Matcher<t.TSCallSignatureDeclaration> {\n constructor(\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSCallSignatureDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSCallSignatureDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsCallSignatureDeclaration(\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSCallSignatureDeclaration> {\n return new TSCallSignatureDeclarationMatcher(\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSClassImplementsMatcher extends Matcher<t.TSClassImplements> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n private readonly typeArguments?:\n | Matcher<t.TSTypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSClassImplements {\n if (\n !t.isNode(node) ||\n !t.isTSClassImplements(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n if (typeof this.typeArguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeArguments === null) {\n // null matcher means we expect null value\n if (node.typeArguments !== null) {\n return false;\n }\n } else if (\n !this.typeArguments.matchValue(node.typeArguments, [\n ...keys,\n \"typeArguments\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsClassImplements(\n expression?: Matcher<t.Expression>,\n typeArguments?: Matcher<t.TSTypeParameterInstantiation> | null,\n): Matcher<t.TSClassImplements> {\n return new TSClassImplementsMatcher(\n expression,\n typeArguments,\n );\n}\nexport class TSConditionalTypeMatcher extends Matcher<t.TSConditionalType> {\n constructor(\n private readonly checkType?: Matcher<t.TSType>,\n private readonly extendsType?: Matcher<t.TSType>,\n private readonly trueType?: Matcher<t.TSType>,\n private readonly falseType?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSConditionalType {\n if (\n !t.isNode(node) ||\n !t.isTSConditionalType(node)\n ) {\n return false;\n }\n\n if (typeof this.checkType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.checkType.matchValue(node.checkType, [...keys, \"checkType\"])\n ) {\n return false;\n }\n\n if (typeof this.extendsType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.extendsType.matchValue(node.extendsType, [...keys, \"extendsType\"])\n ) {\n return false;\n }\n\n if (typeof this.trueType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.trueType.matchValue(node.trueType, [...keys, \"trueType\"])\n ) {\n return false;\n }\n\n if (typeof this.falseType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.falseType.matchValue(node.falseType, [...keys, \"falseType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsConditionalType(\n checkType?: Matcher<t.TSType>,\n extendsType?: Matcher<t.TSType>,\n trueType?: Matcher<t.TSType>,\n falseType?: Matcher<t.TSType>,\n): Matcher<t.TSConditionalType> {\n return new TSConditionalTypeMatcher(\n checkType,\n extendsType,\n trueType,\n falseType,\n );\n}\nexport class TSConstructSignatureDeclarationMatcher\n extends Matcher<t.TSConstructSignatureDeclaration> {\n constructor(\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSConstructSignatureDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSConstructSignatureDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsConstructSignatureDeclaration(\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSConstructSignatureDeclaration> {\n return new TSConstructSignatureDeclarationMatcher(\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSConstructorTypeMatcher extends Matcher<t.TSConstructorType> {\n constructor(\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSConstructorType {\n if (\n !t.isNode(node) ||\n !t.isTSConstructorType(node)\n ) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsConstructorType(\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSConstructorType> {\n return new TSConstructorTypeMatcher(\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSDeclareFunctionMatcher extends Matcher<t.TSDeclareFunction> {\n constructor(\n private readonly id?: Matcher<t.Identifier> | null,\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSDeclareFunction {\n if (\n !t.isNode(node) ||\n !t.isTSDeclareFunction(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.id === null) {\n // null matcher means we expect null value\n if (node.id !== null) {\n return false;\n }\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsDeclareFunction(\n id?: Matcher<t.Identifier> | null,\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSDeclareFunction> {\n return new TSDeclareFunctionMatcher(\n id,\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSDeclareMethodMatcher extends Matcher<t.TSDeclareMethod> {\n constructor(\n private readonly key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n >,\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter | t.TSParameterProperty>>\n | Array<Matcher<t.FunctionParameter> | Matcher<t.TSParameterProperty>>,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSDeclareMethod {\n if (\n !t.isNode(node) ||\n !t.isTSDeclareMethod(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsDeclareMethod(\n key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n >,\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<Array<t.FunctionParameter | t.TSParameterProperty>>\n | Array<Matcher<t.FunctionParameter> | Matcher<t.TSParameterProperty>>,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSDeclareMethod> {\n return new TSDeclareMethodMatcher(\n key,\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSEnumBodyMatcher extends Matcher<t.TSEnumBody> {\n constructor(\n private readonly members?:\n | Matcher<Array<t.TSEnumMember>>\n | Array<Matcher<t.TSEnumMember>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSEnumBody {\n if (\n !t.isNode(node) ||\n !t.isTSEnumBody(node)\n ) {\n return false;\n }\n\n if (typeof this.members === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.members)) {\n if (\n !tupleOf<unknown>(...this.members).matchValue(node.members, [\n ...keys,\n \"members\",\n ])\n ) {\n return false;\n }\n } else if (!this.members.matchValue(node.members, [...keys, \"members\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsEnumBody(\n members?: Matcher<Array<t.TSEnumMember>> | Array<Matcher<t.TSEnumMember>>,\n): Matcher<t.TSEnumBody> {\n return new TSEnumBodyMatcher(\n members,\n );\n}\nexport class TSEnumDeclarationMatcher extends Matcher<t.TSEnumDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly body?: Matcher<t.TSEnumBody>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSEnumDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSEnumDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsEnumDeclaration(\n id?: Matcher<t.Identifier>,\n body?: Matcher<t.TSEnumBody>,\n): Matcher<t.TSEnumDeclaration> {\n return new TSEnumDeclarationMatcher(\n id,\n body,\n );\n}\nexport class TSEnumMemberMatcher extends Matcher<t.TSEnumMember> {\n constructor(\n private readonly id?: Matcher<t.Identifier | t.StringLiteral>,\n private readonly initializer?: Matcher<t.Expression> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSEnumMember {\n if (\n !t.isNode(node) ||\n !t.isTSEnumMember(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.initializer === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.initializer === null) {\n // null matcher means we expect null value\n if (node.initializer !== null) {\n return false;\n }\n } else if (\n !this.initializer.matchValue(node.initializer, [...keys, \"initializer\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsEnumMember(\n id?: Matcher<t.Identifier | t.StringLiteral>,\n initializer?: Matcher<t.Expression> | null,\n): Matcher<t.TSEnumMember> {\n return new TSEnumMemberMatcher(\n id,\n initializer,\n );\n}\nexport class TSExportAssignmentMatcher extends Matcher<t.TSExportAssignment> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSExportAssignment {\n if (\n !t.isNode(node) ||\n !t.isTSExportAssignment(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsExportAssignment(\n expression?: Matcher<t.Expression>,\n): Matcher<t.TSExportAssignment> {\n return new TSExportAssignmentMatcher(\n expression,\n );\n}\nexport class TSExternalModuleReferenceMatcher\n extends Matcher<t.TSExternalModuleReference> {\n constructor(\n private readonly expression?: Matcher<t.StringLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSExternalModuleReference {\n if (\n !t.isNode(node) ||\n !t.isTSExternalModuleReference(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsExternalModuleReference(\n expression?: Matcher<t.StringLiteral>,\n): Matcher<t.TSExternalModuleReference> {\n return new TSExternalModuleReferenceMatcher(\n expression,\n );\n}\nexport class TSFunctionTypeMatcher extends Matcher<t.TSFunctionType> {\n constructor(\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSFunctionType {\n if (\n !t.isNode(node) ||\n !t.isTSFunctionType(node)\n ) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsFunctionType(\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSFunctionType> {\n return new TSFunctionTypeMatcher(\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSImportEqualsDeclarationMatcher\n extends Matcher<t.TSImportEqualsDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly moduleReference?: Matcher<\n t.TSEntityName | t.TSExternalModuleReference\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSImportEqualsDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSImportEqualsDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.moduleReference === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.moduleReference.matchValue(node.moduleReference, [\n ...keys,\n \"moduleReference\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsImportEqualsDeclaration(\n id?: Matcher<t.Identifier>,\n moduleReference?: Matcher<t.TSEntityName | t.TSExternalModuleReference>,\n): Matcher<t.TSImportEqualsDeclaration> {\n return new TSImportEqualsDeclarationMatcher(\n id,\n moduleReference,\n );\n}\nexport class TSImportTypeMatcher extends Matcher<t.TSImportType> {\n constructor(\n private readonly source?: Matcher<t.StringLiteral>,\n private readonly qualifier?: Matcher<t.TSEntityName> | null,\n private readonly typeArguments?:\n | Matcher<t.TSTypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSImportType {\n if (\n !t.isNode(node) ||\n !t.isTSImportType(node)\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.qualifier === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.qualifier === null) {\n // null matcher means we expect null value\n if (node.qualifier !== null) {\n return false;\n }\n } else if (\n !this.qualifier.matchValue(node.qualifier, [...keys, \"qualifier\"])\n ) {\n return false;\n }\n\n if (typeof this.typeArguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeArguments === null) {\n // null matcher means we expect null value\n if (node.typeArguments !== null) {\n return false;\n }\n } else if (\n !this.typeArguments.matchValue(node.typeArguments, [\n ...keys,\n \"typeArguments\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsImportType(\n source?: Matcher<t.StringLiteral>,\n qualifier?: Matcher<t.TSEntityName> | null,\n typeArguments?: Matcher<t.TSTypeParameterInstantiation> | null,\n): Matcher<t.TSImportType> {\n return new TSImportTypeMatcher(\n source,\n qualifier,\n typeArguments,\n );\n}\nexport class TSIndexSignatureMatcher extends Matcher<t.TSIndexSignature> {\n constructor(\n private readonly parameters?:\n | Matcher<Array<t.Identifier>>\n | Array<Matcher<t.Identifier>>,\n private readonly typeAnnotation?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSIndexSignature {\n if (\n !t.isNode(node) ||\n !t.isTSIndexSignature(node)\n ) {\n return false;\n }\n\n if (typeof this.parameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.parameters)) {\n if (\n !tupleOf<unknown>(...this.parameters).matchValue(node.parameters, [\n ...keys,\n \"parameters\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.parameters.matchValue(node.parameters, [...keys, \"parameters\"])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeAnnotation === null) {\n // null matcher means we expect null value\n if (node.typeAnnotation !== null) {\n return false;\n }\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsIndexSignature(\n parameters?: Matcher<Array<t.Identifier>> | Array<Matcher<t.Identifier>>,\n typeAnnotation?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSIndexSignature> {\n return new TSIndexSignatureMatcher(\n parameters,\n typeAnnotation,\n );\n}\nexport class TSIndexedAccessTypeMatcher extends Matcher<t.TSIndexedAccessType> {\n constructor(\n private readonly objectType?: Matcher<t.TSType>,\n private readonly indexType?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSIndexedAccessType {\n if (\n !t.isNode(node) ||\n !t.isTSIndexedAccessType(node)\n ) {\n return false;\n }\n\n if (typeof this.objectType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.objectType.matchValue(node.objectType, [...keys, \"objectType\"])\n ) {\n return false;\n }\n\n if (typeof this.indexType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.indexType.matchValue(node.indexType, [...keys, \"indexType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsIndexedAccessType(\n objectType?: Matcher<t.TSType>,\n indexType?: Matcher<t.TSType>,\n): Matcher<t.TSIndexedAccessType> {\n return new TSIndexedAccessTypeMatcher(\n objectType,\n indexType,\n );\n}\nexport class TSInferTypeMatcher extends Matcher<t.TSInferType> {\n constructor(\n private readonly typeParameter?: Matcher<t.TSTypeParameter>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSInferType {\n if (\n !t.isNode(node) ||\n !t.isTSInferType(node)\n ) {\n return false;\n }\n\n if (typeof this.typeParameter === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeParameter.matchValue(node.typeParameter, [\n ...keys,\n \"typeParameter\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsInferType(\n typeParameter?: Matcher<t.TSTypeParameter>,\n): Matcher<t.TSInferType> {\n return new TSInferTypeMatcher(\n typeParameter,\n );\n}\nexport class TSInstantiationExpressionMatcher\n extends Matcher<t.TSInstantiationExpression> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n private readonly typeArguments?:\n | Matcher<t.TSTypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSInstantiationExpression {\n if (\n !t.isNode(node) ||\n !t.isTSInstantiationExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n if (typeof this.typeArguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeArguments === null) {\n // null matcher means we expect null value\n if (node.typeArguments !== null) {\n return false;\n }\n } else if (\n !this.typeArguments.matchValue(node.typeArguments, [\n ...keys,\n \"typeArguments\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsInstantiationExpression(\n expression?: Matcher<t.Expression>,\n typeArguments?: Matcher<t.TSTypeParameterInstantiation> | null,\n): Matcher<t.TSInstantiationExpression> {\n return new TSInstantiationExpressionMatcher(\n expression,\n typeArguments,\n );\n}\nexport class TSInterfaceBodyMatcher extends Matcher<t.TSInterfaceBody> {\n constructor(\n private readonly body?:\n | Matcher<Array<t.TSTypeElement>>\n | Array<Matcher<t.TSTypeElement>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSInterfaceBody {\n if (\n !t.isNode(node) ||\n !t.isTSInterfaceBody(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.body)) {\n if (\n !tupleOf<unknown>(...this.body).matchValue(node.body, [...keys, \"body\"])\n ) {\n return false;\n }\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsInterfaceBody(\n body?: Matcher<Array<t.TSTypeElement>> | Array<Matcher<t.TSTypeElement>>,\n): Matcher<t.TSInterfaceBody> {\n return new TSInterfaceBodyMatcher(\n body,\n );\n}\nexport class TSInterfaceDeclarationMatcher\n extends Matcher<t.TSInterfaceDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly _extends?:\n | Matcher<Array<t.TSInterfaceHeritage>>\n | Array<Matcher<t.TSInterfaceHeritage>>\n | null,\n private readonly body?: Matcher<t.TSInterfaceBody>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSInterfaceDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSInterfaceDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this._extends === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._extends === null) {\n // null matcher means we expect null value\n if (node.extends !== null) {\n return false;\n }\n } else if (Array.isArray(this._extends)) {\n if (\n !tupleOf<unknown>(...this._extends).matchValue(node.extends, [\n ...keys,\n \"extends\",\n ])\n ) {\n return false;\n }\n } else if (!this._extends.matchValue(node.extends, [...keys, \"extends\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsInterfaceDeclaration(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n _extends?:\n | Matcher<Array<t.TSInterfaceHeritage>>\n | Array<Matcher<t.TSInterfaceHeritage>>\n | null,\n body?: Matcher<t.TSInterfaceBody>,\n): Matcher<t.TSInterfaceDeclaration> {\n return new TSInterfaceDeclarationMatcher(\n id,\n typeParameters,\n _extends,\n body,\n );\n}\nexport class TSInterfaceHeritageMatcher extends Matcher<t.TSInterfaceHeritage> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n private readonly typeArguments?:\n | Matcher<t.TSTypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSInterfaceHeritage {\n if (\n !t.isNode(node) ||\n !t.isTSInterfaceHeritage(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n if (typeof this.typeArguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeArguments === null) {\n // null matcher means we expect null value\n if (node.typeArguments !== null) {\n return false;\n }\n } else if (\n !this.typeArguments.matchValue(node.typeArguments, [\n ...keys,\n \"typeArguments\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsInterfaceHeritage(\n expression?: Matcher<t.Expression>,\n typeArguments?: Matcher<t.TSTypeParameterInstantiation> | null,\n): Matcher<t.TSInterfaceHeritage> {\n return new TSInterfaceHeritageMatcher(\n expression,\n typeArguments,\n );\n}\nexport class TSIntersectionTypeMatcher extends Matcher<t.TSIntersectionType> {\n constructor(\n private readonly types?:\n | Matcher<Array<t.TSType>>\n | Array<Matcher<t.TSType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSIntersectionType {\n if (\n !t.isNode(node) ||\n !t.isTSIntersectionType(node)\n ) {\n return false;\n }\n\n if (typeof this.types === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.types)) {\n if (\n !tupleOf<unknown>(...this.types).matchValue(node.types, [\n ...keys,\n \"types\",\n ])\n ) {\n return false;\n }\n } else if (!this.types.matchValue(node.types, [...keys, \"types\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsIntersectionType(\n types?: Matcher<Array<t.TSType>> | Array<Matcher<t.TSType>>,\n): Matcher<t.TSIntersectionType> {\n return new TSIntersectionTypeMatcher(\n types,\n );\n}\nexport class TSIntrinsicKeywordMatcher extends Matcher<t.TSIntrinsicKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSIntrinsicKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSIntrinsicKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsIntrinsicKeyword(): Matcher<t.TSIntrinsicKeyword> {\n return new TSIntrinsicKeywordMatcher();\n}\nexport class TSLiteralTypeMatcher extends Matcher<t.TSLiteralType> {\n constructor(\n private readonly literal?: Matcher<\n | t.NumericLiteral\n | t.StringLiteral\n | t.BooleanLiteral\n | t.BigIntLiteral\n | t.TemplateLiteral\n | t.UnaryExpression\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSLiteralType {\n if (\n !t.isNode(node) ||\n !t.isTSLiteralType(node)\n ) {\n return false;\n }\n\n if (typeof this.literal === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.literal.matchValue(node.literal, [...keys, \"literal\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsLiteralType(\n literal?: Matcher<\n | t.NumericLiteral\n | t.StringLiteral\n | t.BooleanLiteral\n | t.BigIntLiteral\n | t.TemplateLiteral\n | t.UnaryExpression\n >,\n): Matcher<t.TSLiteralType> {\n return new TSLiteralTypeMatcher(\n literal,\n );\n}\nexport class TSMappedTypeMatcher extends Matcher<t.TSMappedType> {\n constructor(\n private readonly key?: Matcher<t.Identifier>,\n private readonly constraint?: Matcher<t.TSType>,\n private readonly nameType?: Matcher<t.TSType> | null,\n private readonly typeAnnotation?: Matcher<t.TSType> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSMappedType {\n if (\n !t.isNode(node) ||\n !t.isTSMappedType(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.constraint === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.constraint.matchValue(node.constraint, [...keys, \"constraint\"])\n ) {\n return false;\n }\n\n if (typeof this.nameType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.nameType === null) {\n // null matcher means we expect null value\n if (node.nameType !== null) {\n return false;\n }\n } else if (\n !this.nameType.matchValue(node.nameType, [...keys, \"nameType\"])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeAnnotation === null) {\n // null matcher means we expect null value\n if (node.typeAnnotation !== null) {\n return false;\n }\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsMappedType(\n key?: Matcher<t.Identifier>,\n constraint?: Matcher<t.TSType>,\n nameType?: Matcher<t.TSType> | null,\n typeAnnotation?: Matcher<t.TSType> | null,\n): Matcher<t.TSMappedType> {\n return new TSMappedTypeMatcher(\n key,\n constraint,\n nameType,\n typeAnnotation,\n );\n}\nexport class TSMethodSignatureMatcher extends Matcher<t.TSMethodSignature> {\n constructor(\n private readonly key?: Matcher<t.Expression>,\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSMethodSignature {\n if (\n !t.isNode(node) ||\n !t.isTSMethodSignature(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsMethodSignature(\n key?: Matcher<t.Expression>,\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSMethodSignature> {\n return new TSMethodSignatureMatcher(\n key,\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSModuleBlockMatcher extends Matcher<t.TSModuleBlock> {\n constructor(\n private readonly body?:\n | Matcher<Array<t.Statement>>\n | Array<Matcher<t.Statement>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSModuleBlock {\n if (\n !t.isNode(node) ||\n !t.isTSModuleBlock(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.body)) {\n if (\n !tupleOf<unknown>(...this.body).matchValue(node.body, [...keys, \"body\"])\n ) {\n return false;\n }\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsModuleBlock(\n body?: Matcher<Array<t.Statement>> | Array<Matcher<t.Statement>>,\n): Matcher<t.TSModuleBlock> {\n return new TSModuleBlockMatcher(\n body,\n );\n}\nexport class TSModuleDeclarationMatcher extends Matcher<t.TSModuleDeclaration> {\n constructor(\n private readonly id?: Matcher<t.TSEntityName | t.StringLiteral>,\n private readonly body?: Matcher<t.TSModuleBlock>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSModuleDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSModuleDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsModuleDeclaration(\n id?: Matcher<t.TSEntityName | t.StringLiteral>,\n body?: Matcher<t.TSModuleBlock>,\n): Matcher<t.TSModuleDeclaration> {\n return new TSModuleDeclarationMatcher(\n id,\n body,\n );\n}\nexport class TSNamedTupleMemberMatcher extends Matcher<t.TSNamedTupleMember> {\n constructor(\n private readonly label?: Matcher<t.Identifier>,\n private readonly elementType?: Matcher<t.TSType>,\n private readonly optional?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSNamedTupleMember {\n if (\n !t.isNode(node) ||\n !t.isTSNamedTupleMember(node)\n ) {\n return false;\n }\n\n if (typeof this.label === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.label.matchValue(node.label, [...keys, \"label\"])) {\n return false;\n }\n\n if (typeof this.elementType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.elementType.matchValue(node.elementType, [...keys, \"elementType\"])\n ) {\n return false;\n }\n\n if (typeof this.optional === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.optional === \"boolean\") {\n if (this.optional !== node.optional) {\n return false;\n }\n } else if (\n !this.optional.matchValue(node.optional, [...keys, \"optional\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsNamedTupleMember(\n label?: Matcher<t.Identifier>,\n elementType?: Matcher<t.TSType>,\n optional?: Matcher<boolean> | boolean,\n): Matcher<t.TSNamedTupleMember> {\n return new TSNamedTupleMemberMatcher(\n label,\n elementType,\n optional,\n );\n}\nexport class TSNamespaceExportDeclarationMatcher\n extends Matcher<t.TSNamespaceExportDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSNamespaceExportDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSNamespaceExportDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsNamespaceExportDeclaration(\n id?: Matcher<t.Identifier>,\n): Matcher<t.TSNamespaceExportDeclaration> {\n return new TSNamespaceExportDeclarationMatcher(\n id,\n );\n}\nexport class TSNeverKeywordMatcher extends Matcher<t.TSNeverKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSNeverKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSNeverKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsNeverKeyword(): Matcher<t.TSNeverKeyword> {\n return new TSNeverKeywordMatcher();\n}\nexport class TSNonNullExpressionMatcher extends Matcher<t.TSNonNullExpression> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSNonNullExpression {\n if (\n !t.isNode(node) ||\n !t.isTSNonNullExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsNonNullExpression(\n expression?: Matcher<t.Expression>,\n): Matcher<t.TSNonNullExpression> {\n return new TSNonNullExpressionMatcher(\n expression,\n );\n}\nexport class TSNullKeywordMatcher extends Matcher<t.TSNullKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSNullKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSNullKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsNullKeyword(): Matcher<t.TSNullKeyword> {\n return new TSNullKeywordMatcher();\n}\nexport class TSNumberKeywordMatcher extends Matcher<t.TSNumberKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSNumberKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSNumberKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsNumberKeyword(): Matcher<t.TSNumberKeyword> {\n return new TSNumberKeywordMatcher();\n}\nexport class TSObjectKeywordMatcher extends Matcher<t.TSObjectKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSObjectKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSObjectKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsObjectKeyword(): Matcher<t.TSObjectKeyword> {\n return new TSObjectKeywordMatcher();\n}\nexport class TSOptionalTypeMatcher extends Matcher<t.TSOptionalType> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSOptionalType {\n if (\n !t.isNode(node) ||\n !t.isTSOptionalType(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsOptionalType(\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSOptionalType> {\n return new TSOptionalTypeMatcher(\n typeAnnotation,\n );\n}\nexport class TSParameterPropertyMatcher extends Matcher<t.TSParameterProperty> {\n constructor(\n private readonly parameter?: Matcher<t.Identifier | t.AssignmentPattern>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSParameterProperty {\n if (\n !t.isNode(node) ||\n !t.isTSParameterProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.parameter === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.parameter.matchValue(node.parameter, [...keys, \"parameter\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsParameterProperty(\n parameter?: Matcher<t.Identifier | t.AssignmentPattern>,\n): Matcher<t.TSParameterProperty> {\n return new TSParameterPropertyMatcher(\n parameter,\n );\n}\nexport class TSParenthesizedTypeMatcher extends Matcher<t.TSParenthesizedType> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSParenthesizedType {\n if (\n !t.isNode(node) ||\n !t.isTSParenthesizedType(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsParenthesizedType(\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSParenthesizedType> {\n return new TSParenthesizedTypeMatcher(\n typeAnnotation,\n );\n}\nexport class TSPropertySignatureMatcher extends Matcher<t.TSPropertySignature> {\n constructor(\n private readonly key?: Matcher<t.Expression>,\n private readonly typeAnnotation?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSPropertySignature {\n if (\n !t.isNode(node) ||\n !t.isTSPropertySignature(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeAnnotation === null) {\n // null matcher means we expect null value\n if (node.typeAnnotation !== null) {\n return false;\n }\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsPropertySignature(\n key?: Matcher<t.Expression>,\n typeAnnotation?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSPropertySignature> {\n return new TSPropertySignatureMatcher(\n key,\n typeAnnotation,\n );\n}\nexport class TSQualifiedNameMatcher extends Matcher<t.TSQualifiedName> {\n constructor(\n private readonly left?: Matcher<t.TSEntityName>,\n private readonly right?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSQualifiedName {\n if (\n !t.isNode(node) ||\n !t.isTSQualifiedName(node)\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsQualifiedName(\n left?: Matcher<t.TSEntityName>,\n right?: Matcher<t.Identifier>,\n): Matcher<t.TSQualifiedName> {\n return new TSQualifiedNameMatcher(\n left,\n right,\n );\n}\nexport class TSRestTypeMatcher extends Matcher<t.TSRestType> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSRestType {\n if (\n !t.isNode(node) ||\n !t.isTSRestType(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsRestType(\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSRestType> {\n return new TSRestTypeMatcher(\n typeAnnotation,\n );\n}\nexport class TSSatisfiesExpressionMatcher\n extends Matcher<t.TSSatisfiesExpression> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSSatisfiesExpression {\n if (\n !t.isNode(node) ||\n !t.isTSSatisfiesExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsSatisfiesExpression(\n expression?: Matcher<t.Expression>,\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSSatisfiesExpression> {\n return new TSSatisfiesExpressionMatcher(\n expression,\n typeAnnotation,\n );\n}\nexport class TSStringKeywordMatcher extends Matcher<t.TSStringKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSStringKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSStringKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsStringKeyword(): Matcher<t.TSStringKeyword> {\n return new TSStringKeywordMatcher();\n}\nexport class TSSymbolKeywordMatcher extends Matcher<t.TSSymbolKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSSymbolKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSSymbolKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsSymbolKeyword(): Matcher<t.TSSymbolKeyword> {\n return new TSSymbolKeywordMatcher();\n}\nexport class TSTemplateLiteralTypeMatcher\n extends Matcher<t.TSTemplateLiteralType> {\n constructor(\n private readonly quasis?:\n | Matcher<Array<t.TemplateElement>>\n | Array<Matcher<t.TemplateElement>>,\n private readonly types?:\n | Matcher<Array<t.TSType>>\n | Array<Matcher<t.TSType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTemplateLiteralType {\n if (\n !t.isNode(node) ||\n !t.isTSTemplateLiteralType(node)\n ) {\n return false;\n }\n\n if (typeof this.quasis === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.quasis)) {\n if (\n !tupleOf<unknown>(...this.quasis).matchValue(node.quasis, [\n ...keys,\n \"quasis\",\n ])\n ) {\n return false;\n }\n } else if (!this.quasis.matchValue(node.quasis, [...keys, \"quasis\"])) {\n return false;\n }\n\n if (typeof this.types === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.types)) {\n if (\n !tupleOf<unknown>(...this.types).matchValue(node.types, [\n ...keys,\n \"types\",\n ])\n ) {\n return false;\n }\n } else if (!this.types.matchValue(node.types, [...keys, \"types\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTemplateLiteralType(\n quasis?:\n | Matcher<Array<t.TemplateElement>>\n | Array<Matcher<t.TemplateElement>>,\n types?: Matcher<Array<t.TSType>> | Array<Matcher<t.TSType>>,\n): Matcher<t.TSTemplateLiteralType> {\n return new TSTemplateLiteralTypeMatcher(\n quasis,\n types,\n );\n}\nexport class TSThisTypeMatcher extends Matcher<t.TSThisType> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSThisType {\n if (\n !t.isNode(node) ||\n !t.isTSThisType(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsThisType(): Matcher<t.TSThisType> {\n return new TSThisTypeMatcher();\n}\nexport class TSTupleTypeMatcher extends Matcher<t.TSTupleType> {\n constructor(\n private readonly elementTypes?:\n | Matcher<Array<t.TSType | t.TSNamedTupleMember>>\n | Array<Matcher<t.TSType> | Matcher<t.TSNamedTupleMember>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTupleType {\n if (\n !t.isNode(node) ||\n !t.isTSTupleType(node)\n ) {\n return false;\n }\n\n if (typeof this.elementTypes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.elementTypes)) {\n if (\n !tupleOf<unknown>(...this.elementTypes).matchValue(node.elementTypes, [\n ...keys,\n \"elementTypes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.elementTypes.matchValue(node.elementTypes, [\n ...keys,\n \"elementTypes\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTupleType(\n elementTypes?:\n | Matcher<Array<t.TSType | t.TSNamedTupleMember>>\n | Array<Matcher<t.TSType> | Matcher<t.TSNamedTupleMember>>,\n): Matcher<t.TSTupleType> {\n return new TSTupleTypeMatcher(\n elementTypes,\n );\n}\nexport class TSTypeAliasDeclarationMatcher\n extends Matcher<t.TSTypeAliasDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeAliasDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSTypeAliasDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeAliasDeclaration(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSTypeAliasDeclaration> {\n return new TSTypeAliasDeclarationMatcher(\n id,\n typeParameters,\n typeAnnotation,\n );\n}\nexport class TSTypeAnnotationMatcher extends Matcher<t.TSTypeAnnotation> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isTSTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeAnnotation(\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSTypeAnnotation> {\n return new TSTypeAnnotationMatcher(\n typeAnnotation,\n );\n}\nexport class TSTypeAssertionMatcher extends Matcher<t.TSTypeAssertion> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TSType>,\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeAssertion {\n if (\n !t.isNode(node) ||\n !t.isTSTypeAssertion(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeAssertion(\n typeAnnotation?: Matcher<t.TSType>,\n expression?: Matcher<t.Expression>,\n): Matcher<t.TSTypeAssertion> {\n return new TSTypeAssertionMatcher(\n typeAnnotation,\n expression,\n );\n}\nexport class TSTypeLiteralMatcher extends Matcher<t.TSTypeLiteral> {\n constructor(\n private readonly members?:\n | Matcher<Array<t.TSTypeElement>>\n | Array<Matcher<t.TSTypeElement>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeLiteral {\n if (\n !t.isNode(node) ||\n !t.isTSTypeLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.members === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.members)) {\n if (\n !tupleOf<unknown>(...this.members).matchValue(node.members, [\n ...keys,\n \"members\",\n ])\n ) {\n return false;\n }\n } else if (!this.members.matchValue(node.members, [...keys, \"members\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeLiteral(\n members?: Matcher<Array<t.TSTypeElement>> | Array<Matcher<t.TSTypeElement>>,\n): Matcher<t.TSTypeLiteral> {\n return new TSTypeLiteralMatcher(\n members,\n );\n}\nexport class TSTypeOperatorMatcher extends Matcher<t.TSTypeOperator> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TSType>,\n private readonly operator?:\n | Matcher<\"keyof\" | \"readonly\" | \"unique\">\n | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeOperator {\n if (\n !t.isNode(node) ||\n !t.isTSTypeOperator(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.operator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.operator === \"string\") {\n if (this.operator !== node.operator) {\n return false;\n }\n } else if (\n !this.operator.matchValue(node.operator, [...keys, \"operator\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeOperator(\n typeAnnotation?: Matcher<t.TSType>,\n operator?: Matcher<\"keyof\" | \"readonly\" | \"unique\"> | string,\n): Matcher<t.TSTypeOperator> {\n return new TSTypeOperatorMatcher(\n typeAnnotation,\n operator,\n );\n}\nexport class TSTypeParameterMatcher extends Matcher<t.TSTypeParameter> {\n constructor(\n private readonly constraint?: Matcher<t.TSType> | null,\n private readonly _default?: Matcher<t.TSType> | null,\n private readonly name?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeParameter {\n if (\n !t.isNode(node) ||\n !t.isTSTypeParameter(node)\n ) {\n return false;\n }\n\n if (typeof this.constraint === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.constraint === null) {\n // null matcher means we expect null value\n if (node.constraint !== null) {\n return false;\n }\n } else if (\n !this.constraint.matchValue(node.constraint, [...keys, \"constraint\"])\n ) {\n return false;\n }\n\n if (typeof this._default === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._default === null) {\n // null matcher means we expect null value\n if (node.default !== null) {\n return false;\n }\n } else if (!this._default.matchValue(node.default, [...keys, \"default\"])) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeParameter(\n constraint?: Matcher<t.TSType> | null,\n _default?: Matcher<t.TSType> | null,\n name?: Matcher<t.Identifier>,\n): Matcher<t.TSTypeParameter> {\n return new TSTypeParameterMatcher(\n constraint,\n _default,\n name,\n );\n}\nexport class TSTypeParameterDeclarationMatcher\n extends Matcher<t.TSTypeParameterDeclaration> {\n constructor(\n private readonly params?:\n | Matcher<Array<t.TSTypeParameter>>\n | Array<Matcher<t.TSTypeParameter>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeParameterDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSTypeParameterDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeParameterDeclaration(\n params?:\n | Matcher<Array<t.TSTypeParameter>>\n | Array<Matcher<t.TSTypeParameter>>,\n): Matcher<t.TSTypeParameterDeclaration> {\n return new TSTypeParameterDeclarationMatcher(\n params,\n );\n}\nexport class TSTypeParameterInstantiationMatcher\n extends Matcher<t.TSTypeParameterInstantiation> {\n constructor(\n private readonly params?:\n | Matcher<Array<t.TSType>>\n | Array<Matcher<t.TSType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeParameterInstantiation {\n if (\n !t.isNode(node) ||\n !t.isTSTypeParameterInstantiation(node)\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeParameterInstantiation(\n params?: Matcher<Array<t.TSType>> | Array<Matcher<t.TSType>>,\n): Matcher<t.TSTypeParameterInstantiation> {\n return new TSTypeParameterInstantiationMatcher(\n params,\n );\n}\nexport class TSTypePredicateMatcher extends Matcher<t.TSTypePredicate> {\n constructor(\n private readonly parameterName?: Matcher<t.Identifier | t.TSThisType>,\n private readonly typeAnnotation?: Matcher<t.TSTypeAnnotation> | null,\n private readonly asserts?: Matcher<boolean> | boolean | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypePredicate {\n if (\n !t.isNode(node) ||\n !t.isTSTypePredicate(node)\n ) {\n return false;\n }\n\n if (typeof this.parameterName === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.parameterName.matchValue(node.parameterName, [\n ...keys,\n \"parameterName\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeAnnotation === null) {\n // null matcher means we expect null value\n if (node.typeAnnotation !== null) {\n return false;\n }\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.asserts === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.asserts === \"boolean\") {\n if (this.asserts !== node.asserts) {\n return false;\n }\n } else if (this.asserts === null) {\n // null matcher means we expect null value\n if (node.asserts !== null) {\n return false;\n }\n } else if (!this.asserts.matchValue(node.asserts, [...keys, \"asserts\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypePredicate(\n parameterName?: Matcher<t.Identifier | t.TSThisType>,\n typeAnnotation?: Matcher<t.TSTypeAnnotation> | null,\n asserts?: Matcher<boolean> | boolean | null,\n): Matcher<t.TSTypePredicate> {\n return new TSTypePredicateMatcher(\n parameterName,\n typeAnnotation,\n asserts,\n );\n}\nexport class TSTypeQueryMatcher extends Matcher<t.TSTypeQuery> {\n constructor(\n private readonly exprName?: Matcher<t.TSEntityName | t.TSImportType>,\n private readonly typeArguments?:\n | Matcher<t.TSTypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeQuery {\n if (\n !t.isNode(node) ||\n !t.isTSTypeQuery(node)\n ) {\n return false;\n }\n\n if (typeof this.exprName === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.exprName.matchValue(node.exprName, [...keys, \"exprName\"])\n ) {\n return false;\n }\n\n if (typeof this.typeArguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeArguments === null) {\n // null matcher means we expect null value\n if (node.typeArguments !== null) {\n return false;\n }\n } else if (\n !this.typeArguments.matchValue(node.typeArguments, [\n ...keys,\n \"typeArguments\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeQuery(\n exprName?: Matcher<t.TSEntityName | t.TSImportType>,\n typeArguments?: Matcher<t.TSTypeParameterInstantiation> | null,\n): Matcher<t.TSTypeQuery> {\n return new TSTypeQueryMatcher(\n exprName,\n typeArguments,\n );\n}\nexport class TSTypeReferenceMatcher extends Matcher<t.TSTypeReference> {\n constructor(\n private readonly typeName?: Matcher<t.TSEntityName>,\n private readonly typeArguments?:\n | Matcher<t.TSTypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeReference {\n if (\n !t.isNode(node) ||\n !t.isTSTypeReference(node)\n ) {\n return false;\n }\n\n if (typeof this.typeName === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeName.matchValue(node.typeName, [...keys, \"typeName\"])\n ) {\n return false;\n }\n\n if (typeof this.typeArguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeArguments === null) {\n // null matcher means we expect null value\n if (node.typeArguments !== null) {\n return false;\n }\n } else if (\n !this.typeArguments.matchValue(node.typeArguments, [\n ...keys,\n \"typeArguments\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeReference(\n typeName?: Matcher<t.TSEntityName>,\n typeArguments?: Matcher<t.TSTypeParameterInstantiation> | null,\n): Matcher<t.TSTypeReference> {\n return new TSTypeReferenceMatcher(\n typeName,\n typeArguments,\n );\n}\nexport class TSUndefinedKeywordMatcher extends Matcher<t.TSUndefinedKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSUndefinedKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSUndefinedKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsUndefinedKeyword(): Matcher<t.TSUndefinedKeyword> {\n return new TSUndefinedKeywordMatcher();\n}\nexport class TSUnionTypeMatcher extends Matcher<t.TSUnionType> {\n constructor(\n private readonly types?:\n | Matcher<Array<t.TSType>>\n | Array<Matcher<t.TSType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSUnionType {\n if (\n !t.isNode(node) ||\n !t.isTSUnionType(node)\n ) {\n return false;\n }\n\n if (typeof this.types === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.types)) {\n if (\n !tupleOf<unknown>(...this.types).matchValue(node.types, [\n ...keys,\n \"types\",\n ])\n ) {\n return false;\n }\n } else if (!this.types.matchValue(node.types, [...keys, \"types\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsUnionType(\n types?: Matcher<Array<t.TSType>> | Array<Matcher<t.TSType>>,\n): Matcher<t.TSUnionType> {\n return new TSUnionTypeMatcher(\n types,\n );\n}\nexport class TSUnknownKeywordMatcher extends Matcher<t.TSUnknownKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSUnknownKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSUnknownKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsUnknownKeyword(): Matcher<t.TSUnknownKeyword> {\n return new TSUnknownKeywordMatcher();\n}\nexport class TSVoidKeywordMatcher extends Matcher<t.TSVoidKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSVoidKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSVoidKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsVoidKeyword(): Matcher<t.TSVoidKeyword> {\n return new TSVoidKeywordMatcher();\n}\nexport class TaggedTemplateExpressionMatcher\n extends Matcher<t.TaggedTemplateExpression> {\n constructor(\n private readonly tag?: Matcher<t.Expression>,\n private readonly quasi?: Matcher<t.TemplateLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TaggedTemplateExpression {\n if (\n !t.isNode(node) ||\n !t.isTaggedTemplateExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.tag === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.tag.matchValue(node.tag, [...keys, \"tag\"])) {\n return false;\n }\n\n if (typeof this.quasi === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.quasi.matchValue(node.quasi, [...keys, \"quasi\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function taggedTemplateExpression(\n tag?: Matcher<t.Expression>,\n quasi?: Matcher<t.TemplateLiteral>,\n): Matcher<t.TaggedTemplateExpression> {\n return new TaggedTemplateExpressionMatcher(\n tag,\n quasi,\n );\n}\nexport class TemplateElementMatcher extends Matcher<t.TemplateElement> {\n constructor(\n private readonly value?: Matcher<any>,\n private readonly tail?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TemplateElement {\n if (\n !t.isNode(node) ||\n !t.isTemplateElement(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.tail === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.tail === \"boolean\") {\n if (this.tail !== node.tail) {\n return false;\n }\n } else if (!this.tail.matchValue(node.tail, [...keys, \"tail\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function templateElement(\n value?: Matcher<any>,\n tail?: Matcher<boolean> | boolean,\n): Matcher<t.TemplateElement> {\n return new TemplateElementMatcher(\n value,\n tail,\n );\n}\nexport class TemplateLiteralMatcher extends Matcher<t.TemplateLiteral> {\n constructor(\n private readonly quasis?:\n | Matcher<Array<t.TemplateElement>>\n | Array<Matcher<t.TemplateElement>>,\n private readonly expressions?:\n | Matcher<Array<t.Expression | t.TSType>>\n | Array<Matcher<t.Expression> | Matcher<t.TSType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TemplateLiteral {\n if (\n !t.isNode(node) ||\n !t.isTemplateLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.quasis === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.quasis)) {\n if (\n !tupleOf<unknown>(...this.quasis).matchValue(node.quasis, [\n ...keys,\n \"quasis\",\n ])\n ) {\n return false;\n }\n } else if (!this.quasis.matchValue(node.quasis, [...keys, \"quasis\"])) {\n return false;\n }\n\n if (typeof this.expressions === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.expressions)) {\n if (\n !tupleOf<unknown>(...this.expressions).matchValue(node.expressions, [\n ...keys,\n \"expressions\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.expressions.matchValue(node.expressions, [...keys, \"expressions\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function templateLiteral(\n quasis?:\n | Matcher<Array<t.TemplateElement>>\n | Array<Matcher<t.TemplateElement>>,\n expressions?:\n | Matcher<Array<t.Expression | t.TSType>>\n | Array<Matcher<t.Expression> | Matcher<t.TSType>>,\n): Matcher<t.TemplateLiteral> {\n return new TemplateLiteralMatcher(\n quasis,\n expressions,\n );\n}\nexport class ThisExpressionMatcher extends Matcher<t.ThisExpression> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ThisExpression {\n if (\n !t.isNode(node) ||\n !t.isThisExpression(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function thisExpression(): Matcher<t.ThisExpression> {\n return new ThisExpressionMatcher();\n}\nexport class ThisTypeAnnotationMatcher extends Matcher<t.ThisTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ThisTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isThisTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function thisTypeAnnotation(): Matcher<t.ThisTypeAnnotation> {\n return new ThisTypeAnnotationMatcher();\n}\nexport class ThrowStatementMatcher extends Matcher<t.ThrowStatement> {\n constructor(\n private readonly argument?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ThrowStatement {\n if (\n !t.isNode(node) ||\n !t.isThrowStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function throwStatement(\n argument?: Matcher<t.Expression>,\n): Matcher<t.ThrowStatement> {\n return new ThrowStatementMatcher(\n argument,\n );\n}\nexport class TopicReferenceMatcher extends Matcher<t.TopicReference> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TopicReference {\n if (\n !t.isNode(node) ||\n !t.isTopicReference(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function topicReference(): Matcher<t.TopicReference> {\n return new TopicReferenceMatcher();\n}\nexport class TryStatementMatcher extends Matcher<t.TryStatement> {\n constructor(\n private readonly block?: Matcher<t.BlockStatement>,\n private readonly handler?: Matcher<t.CatchClause> | null,\n private readonly finalizer?: Matcher<t.BlockStatement> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TryStatement {\n if (\n !t.isNode(node) ||\n !t.isTryStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.block === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.block.matchValue(node.block, [...keys, \"block\"])) {\n return false;\n }\n\n if (typeof this.handler === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.handler === null) {\n // null matcher means we expect null value\n if (node.handler !== null) {\n return false;\n }\n } else if (!this.handler.matchValue(node.handler, [...keys, \"handler\"])) {\n return false;\n }\n\n if (typeof this.finalizer === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.finalizer === null) {\n // null matcher means we expect null value\n if (node.finalizer !== null) {\n return false;\n }\n } else if (\n !this.finalizer.matchValue(node.finalizer, [...keys, \"finalizer\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tryStatement(\n block?: Matcher<t.BlockStatement>,\n handler?: Matcher<t.CatchClause> | null,\n finalizer?: Matcher<t.BlockStatement> | null,\n): Matcher<t.TryStatement> {\n return new TryStatementMatcher(\n block,\n handler,\n finalizer,\n );\n}\nexport class TupleTypeAnnotationMatcher extends Matcher<t.TupleTypeAnnotation> {\n constructor(\n private readonly types?:\n | Matcher<Array<t.FlowType>>\n | Array<Matcher<t.FlowType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TupleTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isTupleTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.types === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.types)) {\n if (\n !tupleOf<unknown>(...this.types).matchValue(node.types, [\n ...keys,\n \"types\",\n ])\n ) {\n return false;\n }\n } else if (!this.types.matchValue(node.types, [...keys, \"types\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tupleTypeAnnotation(\n types?: Matcher<Array<t.FlowType>> | Array<Matcher<t.FlowType>>,\n): Matcher<t.TupleTypeAnnotation> {\n return new TupleTypeAnnotationMatcher(\n types,\n );\n}\nexport class TypeAliasMatcher extends Matcher<t.TypeAlias> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly right?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeAlias {\n if (\n !t.isNode(node) ||\n !t.isTypeAlias(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeAlias(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n right?: Matcher<t.FlowType>,\n): Matcher<t.TypeAlias> {\n return new TypeAliasMatcher(\n id,\n typeParameters,\n right,\n );\n}\nexport class TypeAnnotationMatcher extends Matcher<t.TypeAnnotation> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeAnnotation(\n typeAnnotation?: Matcher<t.FlowType>,\n): Matcher<t.TypeAnnotation> {\n return new TypeAnnotationMatcher(\n typeAnnotation,\n );\n}\nexport class TypeCastExpressionMatcher extends Matcher<t.TypeCastExpression> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n private readonly typeAnnotation?: Matcher<t.TypeAnnotation>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeCastExpression {\n if (\n !t.isNode(node) ||\n !t.isTypeCastExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeCastExpression(\n expression?: Matcher<t.Expression>,\n typeAnnotation?: Matcher<t.TypeAnnotation>,\n): Matcher<t.TypeCastExpression> {\n return new TypeCastExpressionMatcher(\n expression,\n typeAnnotation,\n );\n}\nexport class TypeParameterMatcher extends Matcher<t.TypeParameter> {\n constructor(\n private readonly name?: Matcher<string> | string,\n private readonly bound?: Matcher<t.TypeAnnotation> | null,\n private readonly _default?: Matcher<t.FlowType> | null,\n private readonly variance?: Matcher<t.Variance> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeParameter {\n if (\n !t.isNode(node) ||\n !t.isTypeParameter(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.name === \"string\") {\n if (this.name !== node.name) {\n return false;\n }\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n if (typeof this.bound === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.bound === null) {\n // null matcher means we expect null value\n if (node.bound !== null) {\n return false;\n }\n } else if (!this.bound.matchValue(node.bound, [...keys, \"bound\"])) {\n return false;\n }\n\n if (typeof this._default === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._default === null) {\n // null matcher means we expect null value\n if (node.default !== null) {\n return false;\n }\n } else if (!this._default.matchValue(node.default, [...keys, \"default\"])) {\n return false;\n }\n\n if (typeof this.variance === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.variance === null) {\n // null matcher means we expect null value\n if (node.variance !== null) {\n return false;\n }\n } else if (\n !this.variance.matchValue(node.variance, [...keys, \"variance\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeParameter(\n name?: Matcher<string> | string,\n bound?: Matcher<t.TypeAnnotation> | null,\n _default?: Matcher<t.FlowType> | null,\n variance?: Matcher<t.Variance> | null,\n): Matcher<t.TypeParameter> {\n return new TypeParameterMatcher(\n name,\n bound,\n _default,\n variance,\n );\n}\nexport class TypeParameterDeclarationMatcher\n extends Matcher<t.TypeParameterDeclaration> {\n constructor(\n private readonly params?:\n | Matcher<Array<t.TypeParameter>>\n | Array<Matcher<t.TypeParameter>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeParameterDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTypeParameterDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeParameterDeclaration(\n params?: Matcher<Array<t.TypeParameter>> | Array<Matcher<t.TypeParameter>>,\n): Matcher<t.TypeParameterDeclaration> {\n return new TypeParameterDeclarationMatcher(\n params,\n );\n}\nexport class TypeParameterInstantiationMatcher\n extends Matcher<t.TypeParameterInstantiation> {\n constructor(\n private readonly params?:\n | Matcher<Array<t.FlowType>>\n | Array<Matcher<t.FlowType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeParameterInstantiation {\n if (\n !t.isNode(node) ||\n !t.isTypeParameterInstantiation(node)\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeParameterInstantiation(\n params?: Matcher<Array<t.FlowType>> | Array<Matcher<t.FlowType>>,\n): Matcher<t.TypeParameterInstantiation> {\n return new TypeParameterInstantiationMatcher(\n params,\n );\n}\nexport class TypeofTypeAnnotationMatcher\n extends Matcher<t.TypeofTypeAnnotation> {\n constructor(\n private readonly argument?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeofTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isTypeofTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeofTypeAnnotation(\n argument?: Matcher<t.FlowType>,\n): Matcher<t.TypeofTypeAnnotation> {\n return new TypeofTypeAnnotationMatcher(\n argument,\n );\n}\nexport class UnaryExpressionMatcher extends Matcher<t.UnaryExpression> {\n constructor(\n private readonly operator?:\n | Matcher<\"void\" | \"throw\" | \"delete\" | \"!\" | \"+\" | \"-\" | \"~\" | \"typeof\">\n | string,\n private readonly argument?: Matcher<t.Expression>,\n private readonly prefix?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.UnaryExpression {\n if (\n !t.isNode(node) ||\n !t.isUnaryExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.operator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.operator === \"string\") {\n if (this.operator !== node.operator) {\n return false;\n }\n } else if (\n !this.operator.matchValue(node.operator, [...keys, \"operator\"])\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n if (typeof this.prefix === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.prefix === \"boolean\") {\n if (this.prefix !== node.prefix) {\n return false;\n }\n } else if (!this.prefix.matchValue(node.prefix, [...keys, \"prefix\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function unaryExpression(\n operator?:\n | Matcher<\"void\" | \"throw\" | \"delete\" | \"!\" | \"+\" | \"-\" | \"~\" | \"typeof\">\n | string,\n argument?: Matcher<t.Expression>,\n prefix?: Matcher<boolean> | boolean,\n): Matcher<t.UnaryExpression> {\n return new UnaryExpressionMatcher(\n operator,\n argument,\n prefix,\n );\n}\nexport class UnionTypeAnnotationMatcher extends Matcher<t.UnionTypeAnnotation> {\n constructor(\n private readonly types?:\n | Matcher<Array<t.FlowType>>\n | Array<Matcher<t.FlowType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.UnionTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isUnionTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.types === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.types)) {\n if (\n !tupleOf<unknown>(...this.types).matchValue(node.types, [\n ...keys,\n \"types\",\n ])\n ) {\n return false;\n }\n } else if (!this.types.matchValue(node.types, [...keys, \"types\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function unionTypeAnnotation(\n types?: Matcher<Array<t.FlowType>> | Array<Matcher<t.FlowType>>,\n): Matcher<t.UnionTypeAnnotation> {\n return new UnionTypeAnnotationMatcher(\n types,\n );\n}\nexport class UpdateExpressionMatcher extends Matcher<t.UpdateExpression> {\n constructor(\n private readonly operator?: Matcher<\"++\" | \"--\"> | string,\n private readonly argument?: Matcher<t.Identifier | t.MemberExpression>,\n private readonly prefix?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.UpdateExpression {\n if (\n !t.isNode(node) ||\n !t.isUpdateExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.operator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.operator === \"string\") {\n if (this.operator !== node.operator) {\n return false;\n }\n } else if (\n !this.operator.matchValue(node.operator, [...keys, \"operator\"])\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n if (typeof this.prefix === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.prefix === \"boolean\") {\n if (this.prefix !== node.prefix) {\n return false;\n }\n } else if (!this.prefix.matchValue(node.prefix, [...keys, \"prefix\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function updateExpression(\n operator?: Matcher<\"++\" | \"--\"> | string,\n argument?: Matcher<t.Identifier | t.MemberExpression>,\n prefix?: Matcher<boolean> | boolean,\n): Matcher<t.UpdateExpression> {\n return new UpdateExpressionMatcher(\n operator,\n argument,\n prefix,\n );\n}\nexport class V8IntrinsicIdentifierMatcher\n extends Matcher<t.V8IntrinsicIdentifier> {\n constructor(\n private readonly name?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.V8IntrinsicIdentifier {\n if (\n !t.isNode(node) ||\n !t.isV8IntrinsicIdentifier(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.name === \"string\") {\n if (this.name !== node.name) {\n return false;\n }\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function v8IntrinsicIdentifier(\n name?: Matcher<string> | string,\n): Matcher<t.V8IntrinsicIdentifier> {\n return new V8IntrinsicIdentifierMatcher(\n name,\n );\n}\nexport class VariableDeclarationMatcher extends Matcher<t.VariableDeclaration> {\n constructor(\n private readonly kind?:\n | Matcher<\"var\" | \"let\" | \"const\" | \"using\" | \"await using\">\n | string,\n private readonly declarations?:\n | Matcher<Array<t.VariableDeclarator>>\n | Array<Matcher<t.VariableDeclarator>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.VariableDeclaration {\n if (\n !t.isNode(node) ||\n !t.isVariableDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.kind === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.kind === \"string\") {\n if (this.kind !== node.kind) {\n return false;\n }\n } else if (!this.kind.matchValue(node.kind, [...keys, \"kind\"])) {\n return false;\n }\n\n if (typeof this.declarations === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.declarations)) {\n if (\n !tupleOf<unknown>(...this.declarations).matchValue(node.declarations, [\n ...keys,\n \"declarations\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.declarations.matchValue(node.declarations, [\n ...keys,\n \"declarations\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function variableDeclaration(\n kind?: Matcher<\"var\" | \"let\" | \"const\" | \"using\" | \"await using\"> | string,\n declarations?:\n | Matcher<Array<t.VariableDeclarator>>\n | Array<Matcher<t.VariableDeclarator>>,\n): Matcher<t.VariableDeclaration> {\n return new VariableDeclarationMatcher(\n kind,\n declarations,\n );\n}\nexport class VariableDeclaratorMatcher extends Matcher<t.VariableDeclarator> {\n constructor(\n private readonly id?: Matcher<\n t.Identifier | t.ArrayPattern | t.ObjectPattern | t.VoidPattern\n >,\n private readonly init?: Matcher<t.Expression> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.VariableDeclarator {\n if (\n !t.isNode(node) ||\n !t.isVariableDeclarator(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.init === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.init === null) {\n // null matcher means we expect null value\n if (node.init !== null) {\n return false;\n }\n } else if (!this.init.matchValue(node.init, [...keys, \"init\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function variableDeclarator(\n id?: Matcher<t.Identifier | t.ArrayPattern | t.ObjectPattern | t.VoidPattern>,\n init?: Matcher<t.Expression> | null,\n): Matcher<t.VariableDeclarator> {\n return new VariableDeclaratorMatcher(\n id,\n init,\n );\n}\nexport class VarianceMatcher extends Matcher<t.Variance> {\n constructor(\n private readonly kind?: Matcher<\"minus\" | \"plus\"> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Variance {\n if (\n !t.isNode(node) ||\n !t.isVariance(node)\n ) {\n return false;\n }\n\n if (typeof this.kind === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.kind === \"string\") {\n if (this.kind !== node.kind) {\n return false;\n }\n } else if (!this.kind.matchValue(node.kind, [...keys, \"kind\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function variance(\n kind?: Matcher<\"minus\" | \"plus\"> | string,\n): Matcher<t.Variance> {\n return new VarianceMatcher(\n kind,\n );\n}\nexport class VoidPatternMatcher extends Matcher<t.VoidPattern> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.VoidPattern {\n if (\n !t.isNode(node) ||\n !t.isVoidPattern(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function voidPattern(): Matcher<t.VoidPattern> {\n return new VoidPatternMatcher();\n}\nexport class VoidTypeAnnotationMatcher extends Matcher<t.VoidTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.VoidTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isVoidTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function voidTypeAnnotation(): Matcher<t.VoidTypeAnnotation> {\n return new VoidTypeAnnotationMatcher();\n}\nexport class WhileStatementMatcher extends Matcher<t.WhileStatement> {\n constructor(\n private readonly test?: Matcher<t.Expression>,\n private readonly body?: Matcher<t.Statement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.WhileStatement {\n if (\n !t.isNode(node) ||\n !t.isWhileStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.test === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.test.matchValue(node.test, [...keys, \"test\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function whileStatement(\n test?: Matcher<t.Expression>,\n body?: Matcher<t.Statement>,\n): Matcher<t.WhileStatement> {\n return new WhileStatementMatcher(\n test,\n body,\n );\n}\nexport class WithStatementMatcher extends Matcher<t.WithStatement> {\n constructor(\n private readonly object?: Matcher<t.Expression>,\n private readonly body?: Matcher<t.Statement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.WithStatement {\n if (\n !t.isNode(node) ||\n !t.isWithStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.object === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.object.matchValue(node.object, [...keys, \"object\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function withStatement(\n object?: Matcher<t.Expression>,\n body?: Matcher<t.Statement>,\n): Matcher<t.WithStatement> {\n return new WithStatementMatcher(\n object,\n body,\n );\n}\nexport class YieldExpressionMatcher extends Matcher<t.YieldExpression> {\n constructor(\n private readonly argument?: Matcher<t.Expression> | null,\n private readonly delegate?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.YieldExpression {\n if (\n !t.isNode(node) ||\n !t.isYieldExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.argument === null) {\n // null matcher means we expect null value\n if (node.argument !== null) {\n return false;\n }\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n if (typeof this.delegate === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.delegate === \"boolean\") {\n if (this.delegate !== node.delegate) {\n return false;\n }\n } else if (\n !this.delegate.matchValue(node.delegate, [...keys, \"delegate\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function yieldExpression(\n argument?: Matcher<t.Expression> | null,\n delegate?: Matcher<boolean> | boolean,\n): Matcher<t.YieldExpression> {\n return new YieldExpressionMatcher(\n argument,\n delegate,\n );\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport class OrMatcher<T, A extends Array<Matcher<T> | T>> extends Matcher<T> {\n private readonly matchersOrValues: A;\n\n constructor(...matchersOrValues: A) {\n super();\n this.matchersOrValues = matchersOrValues;\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is T {\n for (const matcherOrValue of this.matchersOrValues) {\n if (matcherOrValue instanceof Matcher) {\n if (matcherOrValue.matchValue(value, keys)) {\n return true;\n }\n } else if (matcherOrValue === value) {\n return true;\n }\n }\n return false;\n }\n}\n\nexport function or(): Matcher<never>;\nexport function or<T>(first: Matcher<T> | T): Matcher<T>;\nexport function or<T, U>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n): Matcher<T | U>;\nexport function or<T, U, V>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n): Matcher<T | U | V>;\nexport function or<T, U, V, W>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n): Matcher<T | U | V | W>;\nexport function or<T, U, V, W, X>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n): Matcher<T | U | V | W | X>;\nexport function or<T, U, V, W, X, Y>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n): Matcher<T | U | V | W | X | Y>;\nexport function or<T, U, V, W, X, Y, Z>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n): Matcher<T | U | V | W | X | Y | Z>;\nexport function or<T, U, V, W, X, Y, Z, A>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n eighth: Matcher<A> | A,\n): Matcher<T | U | V | W | X | Y | Z | A>;\nexport function or<T, U, V, W, X, Y, Z, A, B>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n eighth: Matcher<A> | A,\n nineth: Matcher<B> | B,\n): Matcher<T | U | V | W | X | Y | Z | A | B>;\nexport function or<T, U, V, W, X, Y, Z, A, B, C>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n eighth: Matcher<A> | A,\n nineth: Matcher<B> | B,\n tenth: Matcher<C> | C,\n): Matcher<T | U | V | W | X | Y | Z | A | B | C>;\nexport function or<T, U, V, W, X, Y, Z, A, B, C, D>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n eighth: Matcher<A> | A,\n nineth: Matcher<B> | B,\n tenth: Matcher<C> | C,\n eleventh: Matcher<D> | D,\n): Matcher<T | U | V | W | X | Y | Z | A | B | C | D>;\nexport function or<T, U, V, W, X, Y, Z, A, B, C, D, E>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n eighth: Matcher<A> | A,\n nineth: Matcher<B> | B,\n tenth: Matcher<C> | C,\n eleventh: Matcher<D> | D,\n twelveth: Matcher<E> | E,\n): Matcher<T | U | V | W | X | Y | Z | A | B | C | D | E>;\nexport function or<T, U, V, W, X, Y, Z, A, B, C, D, E, F>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n eighth: Matcher<A> | A,\n nineth: Matcher<B> | B,\n tenth: Matcher<C> | C,\n eleventh: Matcher<D> | D,\n twelveth: Matcher<E> | E,\n thirteenth: Matcher<F> | F,\n): Matcher<T | U | V | W | X | Y | Z | A | B | C | D | E | F>;\nexport function or<T, A extends Array<Matcher<T> | T>>(\n ...matchersOrValues: A\n): Matcher<T> {\n return new OrMatcher(...matchersOrValues);\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport type Predicate = (value: unknown) => boolean;\n\nexport class PredicateMatcher<T> extends Matcher<T> {\n constructor(private readonly predicate: Predicate) {\n super();\n }\n\n override matchValue(value: unknown): value is T {\n return this.predicate(value);\n }\n}\n\nexport function predicate<T>(predicate: Predicate): Matcher<T> {\n return new PredicateMatcher(predicate);\n}\n", "import type { Binding, NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\n/**\n * Matches any literal except for template literals with expressions (that could have side effects)\n */\nexport const safeLiteral: m.Matcher<t.Literal> = m.matcher(\n (node) =>\n t.isNode(node) &&\n t.isLiteral(node) &&\n (!t.isTemplateLiteral(node) || node.expressions.length === 0),\n);\n\nexport function infiniteLoop(\n body?: m.Matcher<t.Statement>,\n): m.Matcher<t.ForStatement | t.WhileStatement> {\n return m.or(\n m.forStatement(undefined, null, undefined, body),\n m.forStatement(undefined, truthyMatcher, undefined, body),\n m.whileStatement(truthyMatcher, body),\n );\n}\n\nexport function constKey(\n name?: string | m.Matcher<string>,\n): m.Matcher<t.Identifier | t.StringLiteral> {\n return m.or(m.identifier(name), m.stringLiteral(name));\n}\n\nexport function constObjectProperty(\n value?: m.Matcher<t.Expression>,\n): m.Matcher<t.ObjectProperty> {\n return m.or(\n m.objectProperty(m.identifier(), value, false),\n m.objectProperty(m.or(m.stringLiteral(), m.numericLiteral()), value),\n );\n}\n\nexport function anonymousFunction(\n params?:\n | m.Matcher<(t.Identifier | t.RestElement | t.Pattern)[]>\n | (\n | m.Matcher<t.Identifier>\n | m.Matcher<t.Pattern>\n | m.Matcher<t.RestElement>\n )[],\n body?: m.Matcher<t.BlockStatement>,\n): m.Matcher<t.FunctionExpression | t.ArrowFunctionExpression> {\n return m.or(\n m.functionExpression(null, params, body, false),\n m.arrowFunctionExpression(params, body),\n );\n}\n\nexport function iife(\n params?:\n | m.Matcher<(t.Identifier | t.RestElement | t.Pattern)[]>\n | (\n | m.Matcher<t.Identifier>\n | m.Matcher<t.Pattern>\n | m.Matcher<t.RestElement>\n )[],\n body?: m.Matcher<t.BlockStatement>,\n): m.Matcher<t.CallExpression> {\n return m.callExpression(anonymousFunction(params, body));\n}\n\n/**\n * Matches either `object.property` and `object[\"property\"]`\n */\nexport function constMemberExpression(\n object: string | m.Matcher<t.Expression>,\n property?: string | m.Matcher<string>,\n): m.Matcher<t.MemberExpression> {\n if (typeof object === \"string\") object = m.identifier(object);\n return m.or(\n m.memberExpression(object, m.identifier(property), false),\n m.memberExpression(object, m.stringLiteral(property), true),\n );\n}\n\nexport const undefinedMatcher = m.or(\n m.identifier(\"undefined\"),\n m.unaryExpression(\"void\", m.numericLiteral(0)),\n);\n\nexport const trueMatcher = m.or(\n m.booleanLiteral(true),\n m.unaryExpression(\"!\", m.numericLiteral(0)),\n m.unaryExpression(\"!\", m.unaryExpression(\"!\", m.numericLiteral(1))),\n m.unaryExpression(\"!\", m.unaryExpression(\"!\", m.arrayExpression([]))),\n);\n\nexport const falseMatcher = m.or(\n m.booleanLiteral(false),\n m.unaryExpression(\"!\", m.arrayExpression([])),\n);\n\nexport const truthyMatcher = m.or(trueMatcher, m.arrayExpression([]));\n\n/**\n * Starting at the parent path of the current `NodePath` and going up the\n * tree, return the first `NodePath` that causes the provided `matcher`\n * to return true, or `null` if the `matcher` never returns true.\n */\nexport function findParent<T extends t.Node>(\n path: NodePath,\n matcher: m.Matcher<T>,\n): NodePath<T> | null {\n return path.findParent((path) => matcher.match(path.node)) as\n | NodePath<T>\n | null;\n}\n\n/**\n * Starting at current `NodePath` and going up the tree, return the first\n * `NodePath` that causes the provided `matcher` to return true,\n * or `null` if the `matcher` never returns true.\n */\nexport function findPath<T extends t.Node>(\n path: NodePath,\n matcher: m.Matcher<T>,\n): NodePath<T> | null {\n return path.find((path) => matcher.match(path.node)) as NodePath<T> | null;\n}\n\n/**\n * Function expression matcher that captures the parameters\n * and allows them to be referenced in the body.\n */\nexport function createFunctionMatcher(\n params: number,\n body: (\n ...captures: m.Matcher<t.Identifier>[]\n ) => m.Matcher<t.Statement[]> | m.Matcher<t.Statement>[],\n): m.Matcher<t.FunctionExpression> {\n const captures = Array.from(\n { length: params },\n () => m.capture(m.anyString()),\n );\n\n return m.functionExpression(\n undefined,\n captures.map(m.identifier),\n m.blockStatement(\n body(...captures.map((c) => m.identifier(m.fromCapture(c)))),\n ),\n );\n}\n\n/**\n * `function <id>(<params>) { <body> }` or `var <id> = function(<params>) { <body> }`\n */\nexport function varFunctionOrDeclaration(\n id?: m.Matcher<t.Identifier>,\n params?:\n | m.Matcher<Array<t.Identifier | t.Pattern | t.RestElement>>\n | Array<\n | m.Matcher<t.Identifier>\n | m.Matcher<t.Pattern>\n | m.Matcher<t.RestElement>\n >,\n body?: m.Matcher<t.BlockStatement>,\n generator?: m.Matcher<boolean> | boolean,\n async?: m.Matcher<boolean> | boolean,\n): m.Matcher<t.FunctionDeclaration | t.VariableDeclaration> {\n return m.or(\n m.functionDeclaration(id, params, body, generator, async),\n m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n id,\n m.functionExpression(null, params, body, generator, async),\n ),\n ]),\n );\n}\n\n/**\n * Returns true if every reference is a member expression whose value is read\n */\nexport function isReadonlyObject(\n binding: Binding,\n memberAccess: m.Matcher<t.MemberExpression>,\n): boolean {\n // Workaround because sometimes babel treats the VariableDeclarator/binding itself as a violation\n if (!binding.constant && binding.constantViolations[0] !== binding.path) {\n return false;\n }\n\n function isPatternAssignment(member: NodePath<t.Node>) {\n const { parentPath } = member;\n return (\n // [obj.property] = [1];\n parentPath?.isArrayPattern() ||\n // ({ property: obj.property } = {})\n // ({ ...obj.property } = {})\n (parentPath?.parentPath?.isObjectPattern() &&\n (parentPath.isObjectProperty({ value: member.node }) ||\n parentPath.isRestElement())) ||\n // ([obj.property = 1] = [])\n // ({ property: obj.property = 1 } = {})\n parentPath?.isAssignmentPattern({ left: member.node })\n );\n }\n\n return binding.referencePaths.every(\n (path) =>\n // obj.property\n memberAccess.match(path.parent) &&\n // obj.property = 1\n !path.parentPath?.parentPath?.isAssignmentExpression({\n left: path.parent,\n }) &&\n // obj.property++\n !path.parentPath?.parentPath?.isUpdateExpression({\n argument: path.parent,\n }) &&\n // delete obj.property\n !path.parentPath?.parentPath?.isUnaryExpression({\n argument: path.parent,\n operator: \"delete\",\n }) &&\n !isPatternAssignment(path.parentPath!),\n );\n}\n\n/**\n * Checks if the binding is a temporary variable that is only assigned\n * once and has limited references. Often created by transpilers.\n *\n * Example with 1 reference to `_tmp`:\n * ```js\n * var _tmp; x[_tmp = y] || (x[_tmp] = z);\n * ```\n */\nexport function isTemporaryVariable(\n binding: Binding | undefined,\n references: number,\n kind: \"var\" | \"param\" = \"var\",\n): binding is Binding {\n return (\n binding !== undefined &&\n binding.references === references &&\n binding.constantViolations.length === 1 &&\n (kind === \"var\"\n ? binding.path.isVariableDeclarator() && binding.path.node.init === null\n : binding.path.listKey === \"params\" && binding.path.isIdentifier())\n );\n}\n\nexport class AnySubListMatcher<T> extends m.Matcher<T[]> {\n constructor(private readonly matchers: m.Matcher<T>[]) {\n super();\n }\n\n override matchValue(\n array: unknown,\n keys: readonly PropertyKey[],\n ): array is T[] {\n if (!Array.isArray(array)) return false;\n if (this.matchers.length === 0 && array.length === 0) return true;\n\n let j = 0;\n for (let i = 0; i < array.length; i++) {\n const matches = this.matchers[j].matchValue(array[i], [...keys, i]);\n\n if (matches) {\n j++;\n\n if (j === this.matchers.length) {\n return true;\n }\n }\n }\n\n return false;\n }\n}\n\n/**\n * Greedy matches elements in the specified order, allowing for any number of elements in between\n */\nexport function anySubList<T>(\n ...elements: Array<m.Matcher<T>>\n): m.Matcher<Array<T>> {\n return new AnySubListMatcher(elements);\n}\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { constMemberExpression } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"default-parameters\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const defaultExpression = m.capture(m.anyExpression());\n const index = m.capture(m.numericLiteral());\n const varName = m.capture(m.identifier());\n const varId = m.capture(\n m.or(m.identifier(), m.arrayPattern(), m.objectPattern()),\n );\n\n // Example: arguments.length > 0 && arguments[0] !== undefined\n const argumentCheckAnd = m.logicalExpression(\n \"&&\",\n m.binaryExpression(\n \">\",\n constMemberExpression(\"arguments\", \"length\"),\n index,\n ),\n m.binaryExpression(\n \"!==\",\n m.memberExpression(\n m.identifier(\"arguments\"),\n m.fromCapture(index),\n true,\n ),\n m.identifier(\"undefined\"),\n ),\n );\n // Example: arguments.length > 0 && arguments[0] !== undefined\n const argumentCheckOr = m.logicalExpression(\n \"||\",\n m.binaryExpression(\n \"<=\",\n constMemberExpression(\"arguments\", \"length\"),\n index,\n ),\n m.binaryExpression(\n \"===\",\n m.memberExpression(\n m.identifier(\"arguments\"),\n m.fromCapture(index),\n true,\n ),\n m.identifier(\"undefined\"),\n ),\n );\n // Example: arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n const defaultParam = m.variableDeclaration(undefined, [\n m.variableDeclarator(\n varId,\n m.conditionalExpression(\n argumentCheckAnd,\n m.memberExpression(\n m.identifier(\"arguments\"),\n m.fromCapture(index),\n true,\n ),\n defaultExpression,\n ),\n ),\n ]);\n // Example: arguments.length > 0 && arguments[0] !== undefined && arguments[0];\n const defaultFalseParam = m.variableDeclaration(undefined, [\n m.variableDeclarator(\n varId,\n m.logicalExpression(\n \"&&\",\n argumentCheckAnd,\n m.memberExpression(\n m.identifier(\"arguments\"),\n m.fromCapture(index),\n true,\n ),\n ),\n ),\n ]);\n // Example: arguments.length <= 0 || arguments[0] === undefined || arguments[0]\n const defaultTrueParam = m.variableDeclaration(undefined, [\n m.variableDeclarator(\n varId,\n m.logicalExpression(\n \"||\",\n argumentCheckOr,\n m.memberExpression(\n m.identifier(\"arguments\"),\n m.fromCapture(index),\n true,\n ),\n ),\n ),\n ]);\n\n // Example: if (x === undefined) { x = 1; }\n const defaultParamLoose = m.ifStatement(\n m.binaryExpression(\"===\", varName, m.identifier(\"undefined\")),\n m.blockStatement([\n m.expressionStatement(\n m.assignmentExpression(\n \"=\",\n m.fromCapture(varName),\n defaultExpression,\n ),\n ),\n ]),\n );\n // Example: var y = arguments.length > 1 ? arguments[1] : undefined;\n const normalParam = m.variableDeclaration(undefined, [\n m.variableDeclarator(\n varId,\n m.conditionalExpression(\n m.binaryExpression(\n \">\",\n constMemberExpression(\"arguments\", \"length\"),\n index,\n ),\n m.memberExpression(\n m.identifier(\"arguments\"),\n m.fromCapture(index),\n true,\n ),\n m.identifier(\"undefined\"),\n ),\n ),\n ]);\n\n return {\n VariableDeclaration: {\n exit(path) {\n const fn = path.parentPath.parent;\n if (!t.isFunction(fn) || path.key !== 0) return;\n\n const newParam = defaultParam.match(path.node)\n ? t.assignmentPattern(varId.current!, defaultExpression.current!)\n : defaultFalseParam.match(path.node)\n ? t.assignmentPattern(varId.current!, t.booleanLiteral(false))\n : defaultTrueParam.match(path.node)\n ? t.assignmentPattern(varId.current!, t.booleanLiteral(true))\n : normalParam.match(path.node)\n ? varId.current!\n : null;\n if (!newParam) return;\n\n for (let i = fn.params.length; i < index.current!.value; i++) {\n fn.params[i] = t.identifier(path.scope.generateUid(\"param\"));\n }\n fn.params[index.current!.value] = newParam;\n path.remove();\n this.changes++;\n },\n },\n IfStatement: {\n exit(path) {\n const fn = path.parentPath.parent;\n if (!t.isFunction(fn) || path.key !== 0) return;\n if (!defaultParamLoose.match(path.node)) return;\n\n const binding = path.scope.getOwnBinding(varName.current!.name);\n if (!binding) return;\n const isFunctionParam = binding.path.listKey === \"params\" &&\n binding.path.parent === fn;\n if (!isFunctionParam) return;\n\n binding.path.replaceWith(\n t.assignmentPattern(varName.current!, defaultExpression.current!),\n );\n path.remove();\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { isTemporaryVariable } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"logical-assignments\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const operator = m.capture(m.or(\"||\" as const, \"&&\" as const));\n\n const left = m.capture(m.or(m.identifier(), m.memberExpression()));\n const right = m.capture(m.anyExpression());\n // Example: left || (left = right)\n const idMatcher = m.logicalExpression(\n operator,\n left,\n m.assignmentExpression(\"=\", m.fromCapture(left), right),\n );\n\n const object = m.capture(m.anyExpression());\n const property = m.capture(m.anyExpression());\n const tmpVar = m.capture(m.identifier());\n const member = m.capture(\n m.memberExpression(m.fromCapture(tmpVar), m.fromCapture(property)),\n );\n // Example: var _tmp; (_tmp = x.y()).property || (_tmp.property = right);\n const memberMatcher = m.logicalExpression(\n operator,\n m.memberExpression(m.assignmentExpression(\"=\", tmpVar, object), property),\n m.assignmentExpression(\"=\", member, right),\n );\n\n // Example: var _tmp; x[_tmp = y()] || (x[_tmp] = z);\n const computedMemberMatcher = m.logicalExpression(\n operator,\n m.memberExpression(\n object,\n m.assignmentExpression(\"=\", tmpVar, property),\n true,\n ),\n m.assignmentExpression(\n \"=\",\n m.memberExpression(m.fromCapture(object), m.fromCapture(tmpVar), true),\n right,\n ),\n );\n\n const tmpVar2 = m.capture(m.identifier());\n // Example: var _tmp, _tmp2; (_tmp = x)[_tmp2 = y] || (_tmp[_tmp2] = z);\n const multiComputedMemberMatcher = m.logicalExpression(\n operator,\n m.memberExpression(\n m.assignmentExpression(\"=\", tmpVar, object),\n m.assignmentExpression(\"=\", tmpVar2, property),\n true,\n ),\n m.assignmentExpression(\n \"=\",\n m.memberExpression(m.fromCapture(tmpVar), m.fromCapture(tmpVar2), true),\n right,\n ),\n );\n\n return {\n LogicalExpression: {\n exit(path) {\n if (idMatcher.match(path.node)) {\n path.replaceWith(\n t.assignmentExpression(\n `${operator.current!}=`,\n left.current!,\n right.current!,\n ),\n );\n this.changes++;\n } else if (memberMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n if (!isTemporaryVariable(binding, 1)) return;\n\n binding.path.remove();\n member.current!.object = object.current!;\n path.replaceWith(\n t.assignmentExpression(\n `${operator.current!}=`,\n member.current!,\n right.current!,\n ),\n );\n this.changes++;\n } else if (computedMemberMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n if (!isTemporaryVariable(binding, 1)) return;\n\n binding.path.remove();\n path.replaceWith(\n t.assignmentExpression(\n `${operator.current!}=`,\n t.memberExpression(object.current!, property.current!, true),\n right.current!,\n ),\n );\n this.changes++;\n } else if (multiComputedMemberMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n const binding2 = path.scope.getBinding(tmpVar2.current!.name);\n if (\n !isTemporaryVariable(binding, 1) ||\n !isTemporaryVariable(binding2, 1)\n ) {\n return;\n }\n\n binding.path.remove();\n binding2.path.remove();\n path.replaceWith(\n t.assignmentExpression(\n `${operator.current!}=`,\n t.memberExpression(object.current!, property.current!, true),\n right.current!,\n ),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { isTemporaryVariable } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"nullish-coalescing-assignment\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const tmpVar = m.capture(m.identifier());\n const leftId = m.capture(m.identifier());\n const property = m.capture(m.identifier());\n const right = m.capture(m.anyExpression());\n const computed = m.capture<boolean>(m.anything());\n // Example (Babel): var tmp; (tmp = left).b ?? (tmp.b = c);\n const memberMatcher = m.logicalExpression(\n \"??\",\n m.memberExpression(\n m.assignmentExpression(\"=\", tmpVar, leftId),\n property,\n computed,\n ),\n m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.fromCapture(tmpVar),\n m.fromCapture(property),\n computed,\n ),\n right,\n ),\n );\n\n // Example (Babel): left ?? (left = right);\n const left = m.capture(m.or(m.identifier(), m.memberExpression()));\n const simpleMatcher = m.logicalExpression(\n \"??\",\n left,\n m.assignmentExpression(\"=\", m.fromCapture(left), right),\n );\n\n return {\n LogicalExpression: {\n exit(path) {\n if (memberMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n if (!isTemporaryVariable(binding, 1)) return;\n\n binding.path.remove();\n path.replaceWith(\n t.assignmentExpression(\n \"??=\",\n t.memberExpression(\n leftId.current!,\n property.current!,\n computed.current,\n ),\n right.current!,\n ),\n );\n this.changes++;\n } else if (simpleMatcher.match(path.node)) {\n path.replaceWith(\n t.assignmentExpression(\"??=\", left.current!, right.current!),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { isTemporaryVariable } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"nullish-coalescing\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const tmpVar = m.capture(m.identifier());\n const left = m.capture(m.anyExpression());\n const right = m.capture(m.anyExpression());\n // Example (Babel): var _tmp; (_tmp = left) !== null && _tmp !== undefined ? _tmp : right;\n const idMatcher = m.conditionalExpression(\n m.logicalExpression(\n \"&&\",\n m.binaryExpression(\n \"!==\",\n m.assignmentExpression(\"=\", tmpVar, left),\n m.nullLiteral(),\n ),\n m.binaryExpression(\n \"!==\",\n m.fromCapture(tmpVar),\n m.identifier(\"undefined\"),\n ),\n ),\n m.fromCapture(tmpVar),\n right,\n );\n\n const idLooseMatcher = m.conditionalExpression(\n m.binaryExpression(\n \"!=\",\n m.assignmentExpression(\"=\", tmpVar, left),\n m.nullLiteral(),\n ),\n m.fromCapture(tmpVar),\n right,\n );\n\n // Example (SWC/esbuild): left != null ? left : (left = right);\n // Example (TS): left !== null && left !== undefined ? left : (left = right);\n const simpleIdMatcher = m.conditionalExpression(\n m.or(\n m.logicalExpression(\n \"&&\",\n m.binaryExpression(\"!==\", left, m.nullLiteral()),\n m.binaryExpression(\n \"!==\",\n m.fromCapture(left),\n m.identifier(\"undefined\"),\n ),\n ),\n m.binaryExpression(\"!=\", left, m.nullLiteral()),\n ),\n m.fromCapture(left),\n right,\n );\n\n const iifeMatcher = m.callExpression(\n m.arrowFunctionExpression(\n [m.fromCapture(tmpVar)],\n m.anyExpression(),\n false,\n ),\n [],\n );\n\n return {\n ConditionalExpression: {\n exit(path) {\n if (idMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n\n if (\n iifeMatcher.match(path.parentPath.parent) &&\n isTemporaryVariable(binding, 2, \"param\")\n ) {\n path.parentPath.parentPath!.replaceWith(\n t.logicalExpression(\"??\", left.current!, right.current!),\n );\n this.changes++;\n } else if (isTemporaryVariable(binding, 2, \"var\")) {\n binding.path.remove();\n path.replaceWith(\n t.logicalExpression(\"??\", left.current!, right.current!),\n );\n this.changes++;\n }\n } else if (idLooseMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n if (!isTemporaryVariable(binding, 1)) return;\n\n binding.path.remove();\n path.replaceWith(\n t.logicalExpression(\"??\", left.current!, right.current!),\n );\n this.changes++;\n } else if (simpleIdMatcher.match(path.node)) {\n path.replaceWith(\n t.logicalExpression(\"??\", left.current!, right.current!),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { isTemporaryVariable } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"optional-chaining\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const object = m.capture(m.anyExpression());\n const member = m.capture(m.memberExpression(m.fromCapture(object)));\n // Example (TS): object === null || object === undefined ? undefined : object.property;\n const simpleMatcher = m.conditionalExpression(\n m.logicalExpression(\n \"||\",\n m.binaryExpression(\"===\", object, m.nullLiteral()),\n m.binaryExpression(\n \"===\",\n m.fromCapture(object),\n m.identifier(\"undefined\"),\n ),\n ),\n m.identifier(\"undefined\"),\n member,\n );\n\n const tmpVar = m.capture(m.identifier());\n const tmpMember = m.capture(m.memberExpression(m.fromCapture(tmpVar)));\n // Example (Babel): var _tmp; (_tmp = object) === null || _tmp === undefined ? undefined : _tmp.property;\n const tmpMatcher = m.conditionalExpression(\n m.logicalExpression(\n \"||\",\n m.binaryExpression(\n \"===\",\n m.assignmentExpression(\"=\", tmpVar, object),\n m.nullLiteral(),\n ),\n m.binaryExpression(\n \"===\",\n m.fromCapture(tmpVar),\n m.identifier(\"undefined\"),\n ),\n ),\n m.identifier(\"undefined\"),\n tmpMember,\n );\n\n return {\n ConditionalExpression: {\n exit(path) {\n if (simpleMatcher.match(path.node)) {\n path.replaceWith(\n t.optionalMemberExpression(\n object.current!,\n member.current!.property as t.Expression,\n member.current!.computed,\n true,\n ),\n );\n this.changes++;\n } else if (tmpMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n if (!isTemporaryVariable(binding, 2)) return;\n\n binding.path.remove();\n path.replaceWith(\n t.optionalMemberExpression(\n object.current!,\n tmpMember.current!.property as t.Expression,\n tmpMember.current!.computed,\n true,\n ),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { constMemberExpression } from \"../ast-utils/matcher.ts\";\n\n// https://github.com/babel/babel/pull/5791\n// https://github.com/babel/babel/blob/cce807f1eb638ee3030112dc190cbee032760888/packages/babel-plugin-transform-template-literals/src/index.ts\n\n// TODO: option ignoreToPrimitiveHint (uses `+` instead of concat)\n\nfunction escape(str: string) {\n return (\n str\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll(\"`\", \"\\\\`\")\n .replaceAll(\"$\", \"\\\\$\")\n .replaceAll(\"\\0\", \"\\\\0\")\n .replaceAll(\"\\b\", \"\\\\b\")\n .replaceAll(\"\\f\", \"\\\\f\")\n // .replaceAll('\\n', '\\\\n') // not escaped because multiline strings are preferred\n .replaceAll(\"\\r\", \"\\\\r\")\n .replaceAll(\"\\t\", \"\\\\t\")\n .replaceAll(\"\\v\", \"\\\\v\")\n );\n}\n\nfunction push(template: t.TemplateLiteral, value: t.Expression) {\n if (value.type === \"StringLiteral\") {\n const lastQuasi = template.quasis.at(-1)!;\n lastQuasi.value.raw += escape(value.value);\n } else if (value.type === \"TemplateLiteral\") {\n const lastQuasi = template.quasis.at(-1)!;\n const firstQuasi = value.quasis[0];\n lastQuasi.value.raw += firstQuasi.value.raw;\n template.expressions.push(...value.expressions);\n template.quasis.push(...value.quasis.slice(1));\n } else {\n template.expressions.push(value);\n template.quasis.push(t.templateElement({ raw: \"\" }));\n }\n}\n\nfunction unshift(template: t.TemplateLiteral, value: t.Expression) {\n if (value.type === \"StringLiteral\") {\n const firstQuasi = template.quasis[0];\n firstQuasi.value.raw = escape(value.value) + firstQuasi.value.raw;\n } else {\n template.expressions.unshift(value);\n template.quasis.unshift(t.templateElement({ raw: \"\" }));\n }\n}\n\nexport default {\n name: \"template-literals\",\n tags: [\"unsafe\"],\n visitor() {\n const string = m.capture(m.or(m.stringLiteral(), m.templateLiteral()));\n const concatMatcher = m.callExpression(\n constMemberExpression(string, \"concat\"),\n m.arrayOf(m.anyExpression()),\n );\n\n return {\n BinaryExpression: {\n exit(path) {\n if (path.node.operator !== \"+\") return;\n\n if (t.isTemplateLiteral(path.node.left)) {\n push(path.node.left, path.node.right);\n path.replaceWith(path.node.left);\n this.changes++;\n } else if (\n t.isTemplateLiteral(path.node.right) &&\n t.isExpression(path.node.left)\n ) {\n unshift(path.node.right, path.node.left);\n path.replaceWith(path.node.right);\n this.changes++;\n }\n },\n },\n CallExpression: {\n exit(path) {\n if (concatMatcher.match(path.node)) {\n const template = t.templateLiteral(\n [t.templateElement({ raw: \"\" })],\n [],\n );\n push(template, string.current!);\n\n for (const arg of path.node.arguments) {\n push(template, arg as t.Expression);\n }\n\n path.replaceWith(template);\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import { mergeTransforms } from \"../ast-utils/transform.ts\";\nimport defaultParameters from \"./default-parameters.ts\";\nimport logicalAssignments from \"./logical-assignments.ts\";\nimport nullishCoalescingAssignment from \"./nullish-coalescing-assignment.ts\";\nimport nullishCoalescing from \"./nullish-coalescing.ts\";\nimport optionalChaining from \"./optional-chaining.ts\";\nimport templateLiterals from \"./template-literals.ts\";\n\nexport default mergeTransforms({\n name: \"transpile\",\n tags: [\"safe\"],\n transforms: [\n defaultParameters,\n logicalAssignments,\n nullishCoalescingAssignment,\n nullishCoalescing,\n optionalChaining,\n templateLiterals,\n ],\n});\n", "export * from \"npm:@babel/template@^8.0.0-rc.5\";\nexport { default } from \"npm:@babel/template@^8.0.0-rc.5\";\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\nconst mod = m.capture(m.identifier());\nconst exp = m.capture(m.identifier());\nconst req = m.capture(m.identifier());\n\n/** Required hack for typings to work. */\nconst functionExpr = (args: Array<m.Matcher<t.Identifier>>) =>\n m.or(\n m.functionExpression(\n null,\n args,\n m.blockStatement(),\n false,\n false,\n ),\n m.arrowFunctionExpression(\n args,\n m.blockStatement(),\n false,\n ),\n );\n\n/** Match a webpack module chunk, optionally by ID. */\nfunction webpackChunk(id?: number) {\n return m.objectProperty(\n m.numericLiteral(id), // Module ID\n m.or( // Module body\n functionExpr([]),\n functionExpr([mod]),\n functionExpr([mod, exp]),\n functionExpr([mod, exp, req]),\n ),\n );\n}\n\n/** Match a rspack module chunk, optionally by ID. */\nfunction rspackChunk(id?: number) {\n return m.objectMethod(\n m.matcher((x) => x === \"method\"),\n m.numericLiteral(id),\n m.or(\n m.tupleOf(),\n m.tupleOf(mod),\n m.tupleOf(mod, exp),\n m.tupleOf(mod, exp, req),\n ),\n m.anything(),\n false,\n false,\n false,\n );\n}\n\n/** Match a module chunk, optionally by ID. */\nexport function chunk(id?: number) {\n return m.or(\n webpackChunk(id),\n rspackChunk(id),\n );\n}\n\n/** Match a list of module chunks. */\nexport const chunks = m.objectExpression(m.anyList(m.oneOrMore(chunk())));\n\n/** Match any module chunk. */\nexport default chunk();\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type { Transform } from \"../../webcrack/ast-utils/transform.ts\";\nimport tmpl from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport chunk from \"../../utils/matchers/chunk.ts\";\nimport { assert } from \"jsr:@std/assert@^1.0.19\";\n\nconst entry = m.capture(m.numericLiteral());\nconst requireEntry = m.callExpression(\n m.identifier(\"_require\"),\n [entry],\n);\nconst main = m.callExpression(\n m.memberExpression(\n m.or(\n requireEntry,\n m.identifier(),\n ),\n m.identifier(\"main\"),\n false,\n ),\n [m.booleanLiteral(true)],\n);\nconst inlinedMain = m.expressionStatement(m.callExpression(\n m.identifier(),\n [m.booleanLiteral(true)],\n));\nconst verifyClient = m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.identifier(\"exports\"),\n m.identifier(\"verifyClient\"),\n ),\n m.or(\n m.functionExpression(\n null,\n [m.identifier()],\n ),\n m.identifier(),\n ),\n);\nconst inlinedVerifyClient = m.callExpression(\n m.functionExpression(\n null,\n [m.identifier()],\n m.blockStatement(),\n false,\n false,\n ),\n [m.memberExpression(\n m.identifier(),\n m.identifier(\"clientVerification\"),\n false,\n )],\n);\nconst invalidClient = m.memberExpression(\n m.memberExpression(\n m.identifier(),\n m.identifier(\"EventName\"),\n ),\n m.identifier(\"LANGUAGE_SERVER_INVALID_CLIENT\"),\n);\nconst setNoDeprecation = m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.identifier(\"process\"),\n m.identifier(\"noDeprecation\"),\n false,\n ),\n m.booleanLiteral(true),\n));\nconst environChecks = m.arrayExpression([\n m.stringLiteral(\"ELECTRON_RUN_AS_NODE\"),\n m.stringLiteral(\"VSCODE_NLS_CONFIG\"),\n]);\nconst setStackTraceLimit = m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.identifier(\"Error\"),\n m.identifier(\"stackTraceLimit\"),\n false,\n ),\n m.numericLiteral(),\n));\n\n// TODO: remove telemetry\n// See `vendor.bundle.js` & npm.im/applicationinsights\n/** Remove unwanted features e.g. License check and Telemetry */\nexport default {\n name: \"anti-feature\",\n tags: [\"unsafe\"],\n visitor: () => ({\n CallExpression: {\n exit($) {\n if (inlinedVerifyClient.match($.node)) {\n $.remove();\n this.changes++;\n return;\n }\n\n if (!main.match($.node)) {\n return;\n }\n\n const $callee = $.get(\"callee\");\n if ($callee.isMemberExpression()) {\n const $main = $callee.get(\"object\");\n let $path: NodePath = $main;\n if ($main.isIdentifier()) {\n const $binding = $.scope.getBinding($main.node.name);\n if (!$binding) {\n return;\n }\n\n $path = $binding.path;\n }\n\n $path.traverse({\n CallExpression: {\n exit($call) {\n requireEntry.match($call.node);\n },\n },\n });\n }\n\n t.assertNumericLiteral(entry.current);\n\n const _target = $.findParent((p) => chunk.match(p.node));\n if (!_target) {\n throw new Error(\"Could not find module chunk\");\n }\n\n let $target: NodePath<t.Function>;\n\n if (_target.isObjectProperty()) {\n const $func = _target.get(\"value\");\n assert($func.isFunction());\n $target = $func;\n } else {\n const $func = _target;\n assert($func.isObjectMethod());\n $target = $func;\n }\n\n $target.get(\"body\").replaceWith(tmpl.statement.ast`{\n\t\t\t\t\trequire(${entry.current}).main(Boolean(process.env[\"VSCODE_NLS_CONFIG\"]));\n\t\t\t\t}`);\n\n $.stop();\n this.changes++;\n },\n },\n AssignmentExpression: {\n exit($) {\n if (!verifyClient.match($.node)) {\n return;\n }\n\n const $value = $.get(\"right\");\n let $function: NodePath<t.BlockStatement>;\n\n if ($value.isIdentifier()) {\n const $binding = $.scope.getBinding($value.node.name);\n if (!$binding) {\n return;\n }\n\n const $path = $binding.path;\n assert($path.isFunction());\n const $body = $path.get(\n \"body\",\n );\n assert($body.isBlockStatement());\n $function = $body;\n } else if ($value.isFunction()) {\n const $body = $value.get(\n \"body\",\n );\n assert($body.isBlockStatement());\n $function = $body;\n } else {\n return;\n }\n\n $function.replaceWith(tmpl.statement.ast`{\n\t\t\t\t\treturn;\n\t\t\t\t}`);\n\n this.changes++;\n },\n },\n MemberExpression: {\n exit($) {\n if (!invalidClient.match($.node)) {\n return;\n }\n\n const _target = $.findParent((p) => p.isIfStatement());\n if (!_target) {\n throw new Error(\"Could not find parent if\");\n }\n\n const $target = _target;\n assert($target.isIfStatement());\n\n $target.remove();\n this.changes++;\n },\n },\n ArrayExpression: {\n exit($) {\n if (!environChecks.match($.node)) {\n return;\n }\n\n const _chunk = $.findParent((p) => chunk.match(p.node));\n if (!_chunk) {\n throw new Error(\"verifyClient not in a valid chunk\");\n }\n\n let $target: NodePath<t.Function>;\n\n if (_chunk.isObjectProperty()) {\n const $func = _chunk.get(\"value\");\n assert($func.isFunction());\n $target = $func;\n } else {\n const $func = _chunk;\n assert($func.isObjectMethod());\n $target = $func;\n }\n\n const _body = $target.get(\"body\");\n assert(_body.isBlockStatement());\n\n const $body = _body.get(\"body\");\n const _invokeMain = $body.at(-1);\n if (_invokeMain === undefined || !inlinedMain.match(_invokeMain.node)) {\n return;\n }\n\n const _setNoDeprecation = $body.at(-4)!;\n const _check = $body.at(-3)!;\n const _setStackTraceLimit = $body.at(-2)!;\n\n if (\n !setNoDeprecation.match(_setNoDeprecation.node) ||\n !_check.isIfStatement() ||\n !setStackTraceLimit.match(_setStackTraceLimit.node)\n ) {\n // Theoretically the patch could success, but we want to be pedantic\n throw new Error(\"Unfamillar entrypoint chunk\");\n }\n\n _setNoDeprecation.remove();\n _check.remove();\n _setStackTraceLimit.remove();\n\n const $invokeMain = _invokeMain.get(\n \"expression\",\n );\n assert($invokeMain.isCallExpression());\n\n const $hasVSCodeExtension = $invokeMain.get(\"arguments.0\");\n $hasVSCodeExtension.replaceWith(\n tmpl.expression.ast`Boolean(process.env[\"VSCODE_NLS_CONFIG\"])`,\n );\n\n this.changes++;\n },\n },\n }),\n} satisfies Transform;\n", "import nodeCrypto from \"node:crypto\";\nimport { decodeHex, encodeHex } from \"jsr:@std/encoding@^1.0.10\";\n\n/* 🥺 don't sue me\n ⠁⠒⠲⠤⠤⠀⢀⣀⣀⡀⠀⠀⠀⠀pwease…⠀⠀⢀⡠⠔⠈\n ⠀⠀⠀⠀⠀⣀⣠⣤⢤⣉⣛⣿⣿⣿⣿⣾⣧⣻⣻⠛⣁⣀⣦⠥⣀⡀\n ⠀⢀⣤⢶⣫⣵⣾⣶⣾⣭⣿⣿⣿⣿⣿⣿⢿⣿⣵⣿⣿⣿⣿⣿⣷⣮⣷\n ⡴⢟⣵⣿⣿⣿⣿⣿⢿⣍⣘⢿⣿⣿⣿⢫⣕⢮⡿⣿⣿⣿⣿⣿⣿⣿⢿\n ⣏⠻⢿⣿⣿⣿⣿⢇⣿⣿⣿⡾⣿⣿⣿⢿⣿⢸⣿⣸⣿⢻⡉⡉⠓⠛⠉\n ⠙⠳⢮⣭⣿⠟⣿⢸⣿⣏⠿⣣⡿⠿⣿⣜⣋⣾⣿⢛⢿⡟⣵⠁\n ⠀⠀⠀⠸⣦⡟⣿⣳⣻⣿⣿⣿⣿⠿⣿⢿⣿⣿⣿⣷⣿⠷⡛\n ⠀⠀⠀⠀⠻⣧⣭⣿⠽⠛⠿⠿⢾⣾⣿⡟⠛⠛⠉⠚⠉⢩⠁\n ⠀⠀⠀⠀⠀⠀⠀⠸⣦⠀⡐⠀⠺⠿⠿⠃⢀⠂⠄⠀⠁⠓⡄\n ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⡆👉⠀⠀👈⣰⣽⠐⠚⠁⠀ */\n\nexport class CryptoHelper {\n static readonly #defaultSalt = \"SEE\\u0020\\u0020LICENSE.txt\";\n static readonly #defaultLic = [ // The \"etilqs\" trick\n \",oidutS lausiV tfosorciM htiw ylno erawtfos eht fo seipoc fo rebmun yna esu dna llatsni yam uoY\",\n \"stcudorp tfosorciM rosseccus dna ,revreS noitadnuoF maeT ,spOveD eruzA ,edoC oidutS lausiV ,caM rof oidutS lausiV\",\n \".snoitacilppa ruoy tset dna poleved ot )”secivreS dna stcudorP oidutS lausiV“ eht ,ylevitcelloc( secivres dna\",\n \".sthgir rehto lla sevreser tfosorciM .erawtfos eht esu ot sthgir emos uoy sevig ylno tnemeerga sihT .dlos ton ,desnecil si erawtfos ehT\",\n \":ton yam uoY\",\n \";syaw niatrec ni ti esu ot uoy wolla ylno taht erawtfos eht ni snoitatimil lacinhcet yna dnuora krow\",\n \",erawtfos eht rof edoc ecruos eht evired ot tpmetta esiwrehto ro ,erawtfos eht elbmessasid ro elipmoced ,reenigne esrever\",\n \";erawtfos eht ni dedulcni eb yam taht stnenopmoc ecruos nepo niatrec fo esu gninrevog smret gnisnecil ytrap driht yb deriuqer tnetxe eht ot dna tpecxe\",\n \";erawtfos eht ni sreilppus sti ro tfosorciM fo seciton yna yfidom ro ,kcolb ,eziminim ,evomer\",\n \"ro ;erawlam etagaporp ro etaerc ot ro wal eht tsniaga si taht yaw yna ni erawtfos eht esu\",\n \",)evoba smret eht ot tcejbus ,edoc elbatubirtsid yna rof tpecxe( erawtfos eht esael ro ,etubirtsid ,hsilbup ,erahs\",\n \".ytrap driht yna ot tnemeerga siht ro erawtfos eht refsnart ro ,esu ot srehto rof gnireffo enola-dnats a sa erawtfos eht edivorp\",\n ]\n .map((x) => [...x].toReversed().join(\"\"))\n .join(\" \");\n\n key: CryptoKey;\n iv: Uint8Array<ArrayBuffer>;\n\n constructor(key: CryptoKey, iv: Uint8Array<ArrayBuffer>) {\n this.key = key;\n this.iv = iv;\n }\n\n static async from(\n lic: string = CryptoHelper.#defaultLic,\n salt: string = CryptoHelper.#defaultSalt,\n ) {\n return new CryptoHelper(\n await crypto.subtle.importKey(\n \"raw\",\n new Uint8Array(nodeCrypto.scryptSync(lic, salt, 24)),\n \"AES-CBC\",\n false,\n [\"encrypt\", \"decrypt\"],\n ),\n new Uint8Array(new TextEncoder().encode(salt)),\n );\n }\n\n async decrypt(ct: string) {\n const pt = await crypto.subtle.decrypt(\n { name: \"AES-CBC\", iv: this.iv },\n this.key,\n decodeHex(ct),\n );\n return new TextDecoder().decode(pt);\n }\n\n async encrypt(pt: string) {\n const ct = await crypto.subtle.encrypt(\n { name: \"AES-CBC\", iv: this.iv },\n this.key,\n new TextEncoder().encode(pt),\n );\n return encodeHex(ct);\n }\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n\nconst encoder = new TextEncoder();\n\nfunction getTypeName(value: unknown): string {\n const type = typeof value;\n if (type !== \"object\") {\n return type;\n } else if (value === null) {\n return \"null\";\n } else {\n return value?.constructor?.name ?? \"object\";\n }\n}\n\nexport function validateBinaryLike(source: unknown): Uint8Array {\n if (typeof source === \"string\") {\n return encoder.encode(source);\n } else if (source instanceof Uint8Array) {\n return source;\n } else if (source instanceof ArrayBuffer) {\n return new Uint8Array(source);\n }\n throw new TypeError(\n `Cannot validate the input as it must be a Uint8Array, a string, or an ArrayBuffer: received a value of the type ${\n getTypeName(source)\n }`,\n );\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nexport const padding = \"=\".charCodeAt(0);\nexport const alphabet: Record<Base32Alphabet, Uint8Array> = {\n base32: new TextEncoder().encode(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\"),\n base32hex: new TextEncoder().encode(\"0123456789ABCDEFGHIJKLMNOPQRSTUV\"),\n base32crockford: new TextEncoder().encode(\"0123456789ABCDEFGHJKMNPQRSTVWXYZ\"),\n};\nexport const rAlphabet: Record<Base32Alphabet, Uint8Array> = {\n base32: new Uint8Array(128).fill(32), // alphabet.base32.length\n base32hex: new Uint8Array(128).fill(32),\n base32crockford: new Uint8Array(128).fill(32),\n};\nalphabet.base32\n .forEach((byte, i) => rAlphabet.base32[byte] = i);\nalphabet.base32hex\n .forEach((byte, i) => rAlphabet.base32hex[byte] = i);\nalphabet.base32crockford\n .forEach((byte, i) => rAlphabet.base32crockford[byte] = i);\n\n/**\n * Options for encoding and decoding base32 strings.\n */\nexport interface Base32Options {\n /** The base32 alphabet. Defaults to \"base32\" */\n alphabet?: Base32Alphabet;\n}\n\n/**\n * The base32 alphabets.\n */\nexport type Base32Alphabet = \"base32\" | \"base32hex\" | \"base32crockford\";\n\n/**\n * Calculate the output size needed to encode a given input size for\n * {@linkcode encodeIntoBase32}.\n *\n * @param rawSize The size of the input buffer.\n * @returns The size of the output buffer.\n *\n * @example Basic Usage\n * ```ts\n * import { assertEquals } from \"@std/assert\";\n * import { calcSizeBase32 } from \"@std/encoding/unstable-base32\";\n *\n * assertEquals(calcSizeBase32(1), 8);\n * ```\n */\nexport function calcSizeBase32(rawSize: number): number {\n return ((rawSize + 4) / 5 | 0) * 8;\n}\n\nexport function encode(\n buffer: Uint8Array_,\n i: number,\n o: number,\n alphabet: Uint8Array,\n padding: number,\n): number {\n i += 4;\n for (; i < buffer.length; i += 5) {\n let x = (buffer[i - 4]! << 16) | (buffer[i - 3]! << 8) | buffer[i - 2]!;\n buffer[o++] = alphabet[x >> 19]!;\n buffer[o++] = alphabet[x >> 14 & 0x1F]!;\n buffer[o++] = alphabet[x >> 9 & 0x1F]!;\n buffer[o++] = alphabet[x >> 4 & 0x1F]!;\n x = (x << 16) | (buffer[i - 1]! << 8) | buffer[i]!;\n buffer[o++] = alphabet[x >> 15 & 0x1F]!;\n buffer[o++] = alphabet[x >> 10 & 0x1F]!;\n buffer[o++] = alphabet[x >> 5 & 0x1F]!;\n buffer[o++] = alphabet[x & 0x1F]!;\n }\n switch (i) {\n case buffer.length + 3: {\n const x = buffer[i - 4]! << 16;\n buffer[o++] = alphabet[x >> 19]!;\n buffer[o++] = alphabet[x >> 14 & 0x1F]!;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n break;\n }\n case buffer.length + 2: {\n const x = (buffer[i - 4]! << 16) | (buffer[i - 3]! << 8);\n buffer[o++] = alphabet[x >> 19]!;\n buffer[o++] = alphabet[x >> 14 & 0x1F]!;\n buffer[o++] = alphabet[x >> 9 & 0x1F]!;\n buffer[o++] = alphabet[x >> 4 & 0x1F]!;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n break;\n }\n case buffer.length + 1: {\n let x = (buffer[i - 4]! << 16) | (buffer[i - 3]! << 8) | buffer[i - 2]!;\n buffer[o++] = alphabet[x >> 19]!;\n buffer[o++] = alphabet[x >> 14 & 0x1F]!;\n buffer[o++] = alphabet[x >> 9 & 0x1F]!;\n buffer[o++] = alphabet[x >> 4 & 0x1F]!;\n x <<= 16;\n buffer[o++] = alphabet[x >> 15 & 0x1F]!;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n break;\n }\n case buffer.length: {\n let x = (buffer[i - 4]! << 16) | (buffer[i - 3]! << 8) | buffer[i - 2]!;\n buffer[o++] = alphabet[x >> 19]!;\n buffer[o++] = alphabet[x >> 14 & 0x1F]!;\n buffer[o++] = alphabet[x >> 9 & 0x1F]!;\n buffer[o++] = alphabet[x >> 4 & 0x1F]!;\n x = (x << 16) | (buffer[i - 1]! << 8);\n buffer[o++] = alphabet[x >> 15 & 0x1F]!;\n buffer[o++] = alphabet[x >> 10 & 0x1F]!;\n buffer[o++] = alphabet[x >> 5 & 0x1F]!;\n buffer[o++] = padding;\n break;\n }\n }\n return o;\n}\n\nexport function decode(\n buffer: Uint8Array_,\n i: number,\n o: number,\n alphabet: Uint8Array,\n padding: number,\n): number {\n for (let x = buffer.length - 6; x < buffer.length; ++x) {\n if (buffer[x] === padding) {\n for (let y = x + 1; y < buffer.length; ++y) {\n if (buffer[y] !== padding) {\n throw new TypeError(\n `Cannot decode input as base32: Invalid character (${\n String.fromCharCode(buffer[y]!)\n })`,\n );\n }\n }\n buffer = buffer.subarray(0, x);\n break;\n }\n }\n switch ((buffer.length - o) % 8) {\n case 6:\n case 3:\n case 1:\n throw new RangeError(\n `Cannot decode input as base32: Length (${\n buffer.length - o\n }), excluding padding, must not have a remainder of 1, 3, or 6 when divided by 8`,\n );\n }\n\n i += 7;\n for (; i < buffer.length; i += 8) {\n let x = (getByte(buffer[i - 7]!, alphabet) << 19) |\n (getByte(buffer[i - 6]!, alphabet) << 14) |\n (getByte(buffer[i - 5]!, alphabet) << 9) |\n (getByte(buffer[i - 4]!, alphabet) << 4);\n buffer[o++] = x >> 16;\n buffer[o++] = x >> 8 & 0xFF;\n x = (x << 16) |\n (getByte(buffer[i - 3]!, alphabet) << 15) |\n (getByte(buffer[i - 2]!, alphabet) << 10) |\n (getByte(buffer[i - 1]!, alphabet) << 5) |\n getByte(buffer[i]!, alphabet);\n buffer[o++] = x >> 16 & 0xFF;\n buffer[o++] = x >> 8 & 0xFF;\n buffer[o++] = x & 0xFF;\n }\n switch (i) {\n case buffer.length + 5: {\n const x = (getByte(buffer[i - 7]!, alphabet) << 19) |\n (getByte(buffer[i - 6]!, alphabet) << 14);\n buffer[o++] = x >> 16;\n break;\n }\n case buffer.length + 3: {\n const x = (getByte(buffer[i - 7]!, alphabet) << 19) |\n (getByte(buffer[i - 6]!, alphabet) << 14) |\n (getByte(buffer[i - 5]!, alphabet) << 9) |\n (getByte(buffer[i - 4]!, alphabet) << 4);\n buffer[o++] = x >> 16;\n buffer[o++] = x >> 8 & 0xFF;\n break;\n }\n case buffer.length + 2: {\n let x = (getByte(buffer[i - 7]!, alphabet) << 19) |\n (getByte(buffer[i - 6]!, alphabet) << 14) |\n (getByte(buffer[i - 5]!, alphabet) << 9) |\n (getByte(buffer[i - 4]!, alphabet) << 4);\n buffer[o++] = x >> 16;\n buffer[o++] = x >> 8 & 0xFF;\n x = (x << 16) |\n (getByte(buffer[i - 3]!, alphabet) << 15);\n buffer[o++] = x >> 16 & 0xFF;\n break;\n }\n case buffer.length: {\n let x = (getByte(buffer[i - 7]!, alphabet) << 19) |\n (getByte(buffer[i - 6]!, alphabet) << 14) |\n (getByte(buffer[i - 5]!, alphabet) << 9) |\n (getByte(buffer[i - 4]!, alphabet) << 4);\n buffer[o++] = x >> 16;\n buffer[o++] = x >> 8 & 0xFF;\n x = (x << 16) |\n (getByte(buffer[i - 3]!, alphabet) << 15) |\n (getByte(buffer[i - 2]!, alphabet) << 10) |\n (getByte(buffer[i - 1]!, alphabet) << 5);\n buffer[o++] = x >> 16 & 0xFF;\n buffer[o++] = x >> 8 & 0xFF;\n break;\n }\n }\n return o;\n}\n\nfunction getByte(char: number, alphabet: Uint8Array): number {\n const byte = alphabet[char] ?? 32;\n if (byte === 32) { // alphabet.Base32.length\n throw new TypeError(\n `Cannot decode input as base32: Invalid character (${\n String.fromCharCode(char)\n })`,\n );\n }\n return byte;\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nexport function detach(\n buffer: Uint8Array_,\n maxSize: number,\n): [Uint8Array_, number] {\n const originalSize = buffer.length;\n if (buffer.byteOffset) {\n const b = new Uint8Array(buffer.buffer);\n b.set(buffer);\n buffer = b.subarray(0, originalSize);\n }\n // deno-lint-ignore no-explicit-any\n buffer = new Uint8Array((buffer.buffer as any).transfer(maxSize));\n buffer.set(buffer.subarray(0, originalSize), maxSize - originalSize);\n return [buffer, maxSize - originalSize];\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// Copyright (c) 2014 Jameson Little. MIT License.\n// This module is browser compatible.\n\n/**\n * Utilities for\n * {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-6 | base32}\n * encoding and decoding.\n *\n * Modified from {@link https://github.com/beatgammit/base64-js}.\n *\n * ```ts\n * import { encodeBase32, decodeBase32 } from \"@std/encoding/base32\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeBase32(\"foobar\"), \"MZXW6YTBOI======\");\n *\n * assertEquals(\n * decodeBase32(\"MZXW6YTBOI======\"),\n * new TextEncoder().encode(\"foobar\")\n * );\n * ```\n *\n * @module\n */\n\nimport { calcSizeBase32, decode, encode } from \"./_common32.ts\";\nimport { detach } from \"./_common_detach.ts\";\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nconst padding = \"=\".charCodeAt(0);\nconst alphabet = new TextEncoder()\n .encode(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\");\nconst rAlphabet = new Uint8Array(128).fill(32); //alphabet.length\nalphabet.forEach((byte, i) => rAlphabet[byte] = i);\n\n/**\n * Converts data into a base32-encoded string.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-6}\n *\n * @param data The data to encode.\n * @returns The base32-encoded string.\n *\n * @example Usage\n * ```ts\n * import { encodeBase32 } from \"@std/encoding/base32\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeBase32(\"6c60c0\"), \"GZRTMMDDGA======\");\n * ```\n */\nexport function encodeBase32(data: ArrayBuffer | Uint8Array | string): string {\n if (typeof data === \"string\") {\n data = new TextEncoder().encode(data) as Uint8Array_;\n } else if (data instanceof ArrayBuffer) data = new Uint8Array(data).slice();\n else data = data.slice();\n const [output, i] = detach(\n data as Uint8Array_,\n calcSizeBase32((data as Uint8Array_).length),\n );\n encode(output, i, 0, alphabet, padding);\n return new TextDecoder().decode(output);\n}\n\n/**\n * Decodes a base32-encoded string.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-6}\n *\n * @param b32 The base32-encoded string to decode.\n * @returns The decoded data.\n *\n * @example Usage\n * ```ts\n * import { decodeBase32 } from \"@std/encoding/base32\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * decodeBase32(\"GZRTMMDDGA======\"),\n * new TextEncoder().encode(\"6c60c0\"),\n * );\n * ```\n */\nexport function decodeBase32(b32: string): Uint8Array_ {\n const output = new TextEncoder().encode(b32) as Uint8Array_;\n if (output.length % 8) {\n throw new TypeError(\n `Invalid base32 string: length (${output.length}) must be a multiple of 8`,\n );\n }\n // deno-lint-ignore no-explicit-any\n return new Uint8Array((output.buffer as any)\n .transfer(decode(output, 0, 0, rAlphabet, padding)));\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/**\n * Utilities for\n * {@link https://datatracker.ietf.org/doc/html/draft-msporny-base58-03 | base58}\n * encoding and decoding.\n *\n * ```ts\n * import { encodeBase58, decodeBase58 } from \"@std/encoding/base58\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const hello = new TextEncoder().encode(\"Hello World!\");\n *\n * assertEquals(encodeBase58(hello), \"2NEpo7TZRRrLZSi2U\");\n *\n * assertEquals(decodeBase58(\"2NEpo7TZRRrLZSi2U\"), hello);\n * ```\n *\n * @module\n */\n\nimport { validateBinaryLike } from \"./_validate_binary_like.ts\";\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\n// deno-fmt-ignore\nconst mapBase58: Record<string, number> = {\n \"1\": 0, \"2\": 1, \"3\": 2, \"4\": 3, \"5\": 4, \"6\": 5, \"7\": 6, \"8\": 7, \"9\": 8, A: 9,\n B: 10, C: 11, D: 12, E: 13, F: 14, G: 15, H: 16, J: 17, K: 18, L: 19, M: 20,\n N: 21, P: 22, Q: 23, R: 24, S: 25, T: 26, U: 27, V: 28, W: 29, X: 30, Y: 31,\n Z: 32, a: 33, b: 34, c: 35, d: 36, e: 37, f: 38, g: 39, h: 40, i: 41, j: 42,\n k: 43, m: 44, n: 45, o: 46, p: 47, q: 48, r: 49, s: 50, t: 51, u: 52, v: 53,\n w: 54, x: 55, y: 56, z: 57\n};\n\nconst base58alphabet =\n \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\".split(\"\");\n\n/**\n * Converts data into a base58-encoded string.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/draft-msporny-base58-03#section-3}\n *\n * @param data The data to encode.\n * @returns The base58-encoded string.\n *\n * @example Usage\n * ```ts\n * import { encodeBase58 } from \"@std/encoding/base58\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeBase58(\"Hello World!\"), \"2NEpo7TZRRrLZSi2U\");\n * ```\n */\nexport function encodeBase58(data: ArrayBuffer | Uint8Array | string): string {\n const uint8tData = validateBinaryLike(data);\n\n let length = 0;\n let zeroes = 0;\n\n // Counting leading zeroes\n let index = 0;\n while (uint8tData[index] === 0) {\n zeroes++;\n index++;\n }\n\n const notZeroUint8Data = uint8tData.slice(index);\n\n const size = Math.round((uint8tData.length * 138) / 100 + 1);\n const b58Encoding: number[] = [];\n\n notZeroUint8Data.forEach((byte) => {\n let i = 0;\n let carry = byte;\n\n for (\n let reverseIterator = size - 1;\n (carry > 0 || i < length) && reverseIterator !== -1;\n reverseIterator--, i++\n ) {\n carry += (b58Encoding[reverseIterator] ?? 0) * 256;\n b58Encoding[reverseIterator] = Math.round(carry % 58);\n carry = Math.floor(carry / 58);\n }\n\n length = i;\n });\n\n const strResult: string[] = Array.from({\n length: b58Encoding.length + zeroes,\n });\n\n if (zeroes > 0) {\n strResult.fill(\"1\", 0, zeroes);\n }\n\n b58Encoding.forEach((byteValue) =>\n strResult.push(base58alphabet[byteValue]!)\n );\n\n return strResult.join(\"\");\n}\n\n/**\n * Decodes a base58-encoded string.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/draft-msporny-base58-03#section-4}\n *\n * @param b58 The base58-encoded string to decode.\n * @returns The decoded data.\n *\n * @example Usage\n * ```ts\n * import { decodeBase58 } from \"@std/encoding/base58\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * decodeBase58(\"2NEpo7TZRRrLZSi2U\"),\n * new TextEncoder().encode(\"Hello World!\")\n * );\n * ```\n */\nexport function decodeBase58(b58: string): Uint8Array_ {\n const splitInput = b58.trim().split(\"\");\n\n let length = 0;\n let ones = 0;\n\n // Counting leading ones\n let index = 0;\n while (splitInput[index] === \"1\") {\n ones++;\n index++;\n }\n\n const notZeroData = splitInput.slice(index);\n\n const size = Math.round((b58.length * 733) / 1000 + 1);\n const output: number[] = [];\n\n notZeroData.forEach((char, idx) => {\n let carry = mapBase58[char];\n let i = 0;\n\n if (carry === undefined) {\n throw new TypeError(\n `Invalid base58 char at index ${idx} with value ${char}`,\n );\n }\n\n for (\n let reverseIterator = size - 1;\n (carry > 0 || i < length) && reverseIterator !== -1;\n reverseIterator--, i++\n ) {\n carry += 58 * (output[reverseIterator] ?? 0);\n output[reverseIterator] = Math.round(carry % 256);\n carry = Math.floor(carry / 256);\n }\n\n length = i;\n });\n\n const validOutput = output.filter((item) => item !== undefined);\n\n if (ones > 0) {\n const onesResult = Array.from({ length: ones }).fill(0, 0, ones);\n\n return new Uint8Array([...onesResult, ...validOutput] as number[]);\n }\n\n return new Uint8Array(validOutput);\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nexport const padding = \"=\".charCodeAt(0);\nexport const alphabet: Record<Base64Alphabet, Uint8Array> = {\n base64: new TextEncoder()\n .encode(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"),\n base64url: new TextEncoder()\n .encode(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\"),\n};\nexport const rAlphabet: Record<Base64Alphabet, Uint8Array> = {\n base64: new Uint8Array(128).fill(64), // alphabet.base64.length\n base64url: new Uint8Array(128).fill(64),\n};\nalphabet.base64\n .forEach((byte, i) => rAlphabet.base64[byte] = i);\nalphabet.base64url\n .forEach((byte, i) => rAlphabet.base64url[byte] = i);\n\n/**\n * Options for encoding and decoding base64 strings.\n */\nexport interface Base64Options {\n /** The base64 alphabet. Defaults to \"base64\" */\n alphabet?: Base64Alphabet;\n}\n\n/**\n * The base64 alphabets.\n */\nexport type Base64Alphabet = \"base64\" | \"base64url\";\n\n/**\n * Calculate the output size needed to encode a given input size for\n * {@linkcode encodeIntoBase64}.\n *\n * @param originalSize The size of the input buffer.\n * @returns The size of the output buffer.\n *\n * @example Basic Usage\n * ```ts\n * import { assertEquals } from \"@std/assert\";\n * import { calcSizeBase64 } from \"@std/encoding/unstable-base64\";\n *\n * assertEquals(calcSizeBase64(1), 4);\n * ```\n */\nexport function calcSizeBase64(originalSize: number): number {\n return ((originalSize + 2) / 3 | 0) * 4;\n}\n\nexport function encode(\n buffer: Uint8Array_,\n i: number,\n o: number,\n alphabet: Uint8Array,\n padding: number,\n): number {\n i += 2;\n for (; i < buffer.length; i += 3) {\n const x = (buffer[i - 2]! << 16) | (buffer[i - 1]! << 8) | buffer[i]!;\n buffer[o++] = alphabet[x >> 18]!;\n buffer[o++] = alphabet[x >> 12 & 0x3F]!;\n buffer[o++] = alphabet[x >> 6 & 0x3F]!;\n buffer[o++] = alphabet[x & 0x3F]!;\n }\n switch (i) {\n case buffer.length + 1: {\n const x = buffer[i - 2]! << 16;\n buffer[o++] = alphabet[x >> 18]!;\n buffer[o++] = alphabet[x >> 12 & 0x3F]!;\n buffer[o++] = padding;\n buffer[o++] = padding;\n break;\n }\n case buffer.length: {\n const x = (buffer[i - 2]! << 16) | (buffer[i - 1]! << 8);\n buffer[o++] = alphabet[x >> 18]!;\n buffer[o++] = alphabet[x >> 12 & 0x3F]!;\n buffer[o++] = alphabet[x >> 6 & 0x3F]!;\n buffer[o++] = padding;\n break;\n }\n }\n return o;\n}\n\nexport function decode(\n buffer: Uint8Array_,\n i: number,\n o: number,\n alphabet: Uint8Array,\n padding: number,\n): number {\n for (let x = buffer.length - 2; x < buffer.length; ++x) {\n if (buffer[x] === padding) {\n for (let y = x + 1; y < buffer.length; ++y) {\n if (buffer[y] !== padding) {\n throw new TypeError(\n `Cannot decode input as base64: Invalid character (${\n String.fromCharCode(buffer[y]!)\n })`,\n );\n }\n }\n buffer = buffer.subarray(0, x);\n break;\n }\n }\n if ((buffer.length - o) % 4 === 1) {\n throw new RangeError(\n `Cannot decode input as base64: Length (${\n buffer.length - o\n }), excluding padding, must not have a remainder of 1 when divided by 4`,\n );\n }\n\n i += 3;\n for (; i < buffer.length; i += 4) {\n const x = (getByte(buffer[i - 3]!, alphabet) << 18) |\n (getByte(buffer[i - 2]!, alphabet) << 12) |\n (getByte(buffer[i - 1]!, alphabet) << 6) |\n getByte(buffer[i]!, alphabet);\n buffer[o++] = x >> 16;\n buffer[o++] = x >> 8 & 0xFF;\n buffer[o++] = x & 0xFF;\n }\n switch (i) {\n case buffer.length + 1: {\n const x = (getByte(buffer[i - 3]!, alphabet) << 18) |\n (getByte(buffer[i - 2]!, alphabet) << 12);\n buffer[o++] = x >> 16;\n break;\n }\n case buffer.length: {\n const x = (getByte(buffer[i - 3]!, alphabet) << 18) |\n (getByte(buffer[i - 2]!, alphabet) << 12) |\n (getByte(buffer[i - 1]!, alphabet) << 6);\n buffer[o++] = x >> 16;\n buffer[o++] = x >> 8 & 0xFF;\n break;\n }\n }\n return o;\n}\n\nfunction getByte(char: number, alphabet: Uint8Array): number {\n const byte = alphabet[char] ?? 64;\n if (byte === 64) { // alphabet.Base64.length\n throw new TypeError(\n `Cannot decode input as base64: Invalid character (${\n String.fromCharCode(char)\n })`,\n );\n }\n return byte;\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/**\n * Utilities for\n * {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-4 | base64}\n * encoding and decoding.\n *\n * ```ts\n * import {\n * encodeBase64,\n * decodeBase64,\n * } from \"@std/encoding/base64\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const foobar = new TextEncoder().encode(\"foobar\");\n *\n * assertEquals(encodeBase64(foobar), \"Zm9vYmFy\");\n * assertEquals(decodeBase64(\"Zm9vYmFy\"), foobar);\n * ```\n *\n * @module\n */\n\nimport { calcSizeBase64, decode, encode } from \"./_common64.ts\";\nimport { detach } from \"./_common_detach.ts\";\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nconst padding = \"=\".charCodeAt(0);\nconst alphabet = new TextEncoder()\n .encode(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\");\nconst rAlphabet = new Uint8Array(128).fill(64); // alphabet.length\nalphabet.forEach((byte, i) => rAlphabet[byte] = i);\n\n/**\n * Converts data into a base64-encoded string.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-4}\n *\n * @param data The data to encode.\n * @returns The base64-encoded string.\n *\n * @example Usage\n * ```ts\n * import { encodeBase64 } from \"@std/encoding/base64\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeBase64(\"foobar\"), \"Zm9vYmFy\");\n * ```\n */\nexport function encodeBase64(data: ArrayBuffer | Uint8Array | string): string {\n if (typeof data === \"string\") {\n data = new TextEncoder().encode(data) as Uint8Array_;\n } else if (data instanceof ArrayBuffer) data = new Uint8Array(data).slice();\n else data = data.slice();\n const [output, i] = detach(\n data as Uint8Array_,\n calcSizeBase64((data as Uint8Array_).length),\n );\n encode(output, i, 0, alphabet, padding);\n return new TextDecoder().decode(output);\n}\n\n/**\n * Decodes a base64-encoded string.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-4}\n *\n * @param b64 The base64-encoded string to decode.\n * @returns The decoded data.\n *\n * @example Usage\n * ```ts\n * import { decodeBase64 } from \"@std/encoding/base64\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * decodeBase64(\"Zm9vYmFy\"),\n * new TextEncoder().encode(\"foobar\")\n * );\n * ```\n */\nexport function decodeBase64(b64: string): Uint8Array_ {\n const output = new TextEncoder().encode(b64) as Uint8Array_;\n // deno-lint-ignore no-explicit-any\n return new Uint8Array((output.buffer as any)\n .transfer(decode(output, 0, 0, rAlphabet, padding)));\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/**\n * Utilities for\n * {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-5 | base64url}\n * encoding and decoding.\n *\n * @module\n */\n\nimport { calcSizeBase64, decode, encode } from \"./_common64.ts\";\nimport { detach } from \"./_common_detach.ts\";\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nconst padding = \"=\".charCodeAt(0);\nconst alphabet = new TextEncoder()\n .encode(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\");\nconst rAlphabet = new Uint8Array(128).fill(64); // alphabet.length\nalphabet.forEach((byte, i) => rAlphabet[byte] = i);\n\n/**\n * Convert data into a base64url-encoded string.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-5}\n *\n * @param data The data to encode.\n * @returns The base64url-encoded string.\n *\n * @example Usage\n * ```ts\n * import { encodeBase64Url } from \"@std/encoding/base64url\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeBase64Url(\"foobar\"), \"Zm9vYmFy\");\n * ```\n */\nexport function encodeBase64Url(\n data: ArrayBuffer | Uint8Array | string,\n): string {\n if (typeof data === \"string\") {\n data = new TextEncoder().encode(data) as Uint8Array_;\n } else if (data instanceof ArrayBuffer) data = new Uint8Array(data).slice();\n else data = data.slice();\n const [output, i] = detach(\n data as Uint8Array_,\n calcSizeBase64((data as Uint8Array_).length),\n );\n let o = encode(output, i, 0, alphabet, padding);\n o = output.indexOf(padding, o - 2);\n return new TextDecoder().decode(\n // deno-lint-ignore no-explicit-any\n o > 0 ? new Uint8Array((output.buffer as any).transfer(o)) : output,\n );\n}\n\n/**\n * Decodes a given base64url-encoded string.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-5}\n *\n * @param b64url The base64url-encoded string to decode.\n * @returns The decoded data.\n *\n * @example Usage\n * ```ts\n * import { decodeBase64Url } from \"@std/encoding/base64url\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * decodeBase64Url(\"Zm9vYmFy\"),\n * new TextEncoder().encode(\"foobar\")\n * );\n * ```\n */\nexport function decodeBase64Url(b64url: string): Uint8Array_ {\n const output = new TextEncoder().encode(b64url) as Uint8Array_;\n // deno-lint-ignore no-explicit-any\n return new Uint8Array((output.buffer as any)\n .transfer(decode(output, 0, 0, rAlphabet, padding)));\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nexport const alphabet = new TextEncoder().encode(\"0123456789abcdef\");\nexport const rAlphabet = new Uint8Array(128).fill(16); // alphabet.Hex.length\nalphabet.forEach((byte, i) => rAlphabet[byte] = i);\nnew TextEncoder()\n .encode(\"ABCDEF\")\n .forEach((byte, i) => rAlphabet[byte] = i + 10);\n\n/**\n * Calculate the output size needed to encode a given input size for\n * {@linkcode encodeIntoHex}.\n *\n * @param originalSize The size of the input buffer.\n * @returns The size of the output buffer.\n *\n * @example Basic Usage\n * ```ts\n * import { assertEquals } from \"@std/assert\";\n * import { calcSizeHex } from \"@std/encoding/unstable-hex\";\n *\n * assertEquals(calcSizeHex(1), 2);\n * ```\n */\nexport function calcSizeHex(originalSize: number): number {\n return originalSize * 2;\n}\n\nexport function encode(\n buffer: Uint8Array_,\n i: number,\n o: number,\n alphabet: Uint8Array,\n): number {\n for (; i < buffer.length; ++i) {\n const x = buffer[i]!;\n buffer[o++] = alphabet[x >> 4]!;\n buffer[o++] = alphabet[x & 0xF]!;\n }\n return o;\n}\n\nexport function decode(\n buffer: Uint8Array_,\n i: number,\n o: number,\n alphabet: Uint8Array,\n): number {\n if ((buffer.length - o) % 2 === 1) {\n throw new RangeError(\n `Cannot decode input as hex: Length (${\n buffer.length - o\n }) must be divisible by 2`,\n );\n }\n\n i += 1;\n for (; i < buffer.length; i += 2) {\n buffer[o++] = (getByte(buffer[i - 1]!, alphabet) << 4) |\n getByte(buffer[i]!, alphabet);\n }\n return o;\n}\n\nfunction getByte(char: number, alphabet: Uint8Array): number {\n const byte = alphabet[char] ?? 16;\n if (byte === 16) { // alphabet.Hex.length\n throw new TypeError(\n `Cannot decode input as hex: Invalid character (${\n String.fromCharCode(char)\n })`,\n );\n }\n return byte;\n}\n", "// Copyright 2009 The Go Authors. All rights reserved.\n// https://github.com/golang/go/blob/master/LICENSE\n// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/**\n * Port of the Go\n * {@link https://github.com/golang/go/blob/go1.12.5/src/encoding/hex/hex.go | encoding/hex}\n * library.\n *\n * ```ts\n * import {\n * decodeHex,\n * encodeHex,\n * } from \"@std/encoding/hex\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeHex(\"abc\"), \"616263\");\n *\n * assertEquals(\n * decodeHex(\"616263\"),\n * new TextEncoder().encode(\"abc\"),\n * );\n * ```\n *\n * @module\n */\n\nimport { calcSizeHex, decode, encode } from \"./_common16.ts\";\nimport { detach } from \"./_common_detach.ts\";\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nconst alphabet = new TextEncoder()\n .encode(\"0123456789abcdef\");\nconst rAlphabet = new Uint8Array(128).fill(16); // alphabet.length\nalphabet.forEach((byte, i) => rAlphabet[byte] = i);\nnew TextEncoder()\n .encode(\"ABCDEF\")\n .forEach((byte, i) => rAlphabet[byte] = i + 10);\n\n/**\n * Converts data into a hex-encoded string.\n *\n * @param src The data to encode.\n *\n * @returns The hex-encoded string.\n *\n * @example Usage\n * ```ts\n * import { encodeHex } from \"@std/encoding/hex\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeHex(\"abc\"), \"616263\");\n * ```\n */\nexport function encodeHex(src: string | Uint8Array | ArrayBuffer): string {\n if (typeof src === \"string\") {\n src = new TextEncoder().encode(src) as Uint8Array_;\n } else if (src instanceof ArrayBuffer) src = new Uint8Array(src).slice();\n else src = src.slice();\n const [output, i] = detach(\n src as Uint8Array_,\n calcSizeHex((src as Uint8Array_).length),\n );\n encode(output, i, 0, alphabet);\n return new TextDecoder().decode(output);\n}\n\n/**\n * Decodes the given hex-encoded string. If the input is malformed, an error is\n * thrown.\n *\n * @param src The hex-encoded string to decode.\n *\n * @returns The decoded data.\n *\n * @example Usage\n * ```ts\n * import { decodeHex } from \"@std/encoding/hex\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * decodeHex(\"616263\"),\n * new TextEncoder().encode(\"abc\"),\n * );\n * ```\n */\nexport function decodeHex(src: string): Uint8Array_ {\n const output = new TextEncoder().encode(src) as Uint8Array_;\n // deno-lint-ignore no-explicit-any\n return new Uint8Array((output.buffer as any)\n .transfer(decode(output, 0, 0, rAlphabet)));\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// Copyright 2020 Keith Cirkel. All rights reserved. MIT license.\n// Copyright 2023 Skye \"MierenManz\". All rights reserved. MIT license.\n/**\n * Utilities for {@link https://protobuf.dev/programming-guides/encoding/#varints Varint} encoding\n * of typed integers. Varint encoding represents integers using a variable number of bytes, with\n * smaller values requiring fewer bytes.\n *\n * ```ts\n * import { encodeVarint, decodeVarint } from \"@std/encoding/varint\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const buf = new Uint8Array(10);\n * assertEquals(\n * encodeVarint(42n, buf),\n * [new Uint8Array([42]), 1]\n * );\n *\n * assertEquals(\n * decodeVarint(new Uint8Array([42])),\n * [ 42n, 1 ]\n * );\n * ```\n *\n * @module\n */\n\n// This implementation is a port of https://deno.land/x/varint@v2.0.0 by @keithamus\n// This module is browser compatible.\n\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\n/**\n * The maximum value of an unsigned 64-bit integer.\n * Equivalent to `2n**64n - 1n`\n */\nexport const MaxUint64 = 18446744073709551615n;\n\n/**\n * The maximum length, in bytes, of a Varint encoded 64-bit integer.\n */\nexport const MaxVarintLen64 = 10;\n/**\n * The maximum length, in bytes, of a Varint encoded 32-bit integer.\n */\nexport const MaxVarintLen32 = 5;\n\nconst MSB = 0x80;\nconst REST = 0x7f;\nconst SHIFT = 7;\nconst MSBN = 0x80n;\nconst SHIFTN = 7n;\n\n// ArrayBuffer and TypedArray's for \"pointer casting\"\nconst AB = new ArrayBuffer(8);\nconst U32_VIEW = new Uint32Array(AB);\nconst U64_VIEW = new BigUint64Array(AB);\n\n/**\n * Given a non empty `buf`, starting at `offset` (default: 0), begin decoding bytes as\n * Varint encoded bytes, for a maximum of 10 bytes (offset + 10). The returned\n * tuple is of the decoded varint 32-bit number, and the new offset with which\n * to continue decoding other data.\n *\n * If a `bigint` in return is undesired, the `decode32` function will return a\n * `number`, but this should only be used in cases where the varint is\n * _assured_ to be 32-bits. If in doubt, use `decode()`.\n *\n * To know how many bytes the Varint took to encode, simply negate `offset`\n * from the returned new `offset`.\n *\n * @param buf The buffer to decode from.\n * @param offset The offset to start decoding from.\n * @returns A tuple of the decoded varint 64-bit number, and the new offset.\n *\n * @example Usage\n * ```ts\n * import { decodeVarint } from \"@std/encoding/varint\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const buf = new Uint8Array([0x8E, 0x02]);\n * assertEquals(decodeVarint(buf), [270n, 2]);\n * ```\n */\nexport function decodeVarint(buf: Uint8Array, offset = 0): [bigint, number] {\n // Clear the last result from the Two's complement view\n U64_VIEW[0] = 0n;\n\n // Setup the initiat state of the function\n let intermediate = 0;\n let position = 0;\n let i = offset;\n\n // If the buffer is empty Throw\n if (buf.length === 0) throw new RangeError(\"Cannot read empty buffer\");\n\n let byte;\n do {\n // Get a single byte from the buffer\n byte = buf[i]!;\n\n // 1. Take the lower 7 bits of the byte.\n // 2. Shift the bits into the correct position.\n // 3. Bitwise OR it with the intermediate value\n // QUIRK: in the 5th (and 10th) iteration of this loop it will overflow on the shift.\n // This causes only the lower 4 bits to be shifted into place and removing the upper 3 bits\n intermediate |= (byte & 0b01111111) << position;\n\n // If position is 28\n // it means that this iteration needs to be written the the two's complement view\n // This only happens once due to the `-4` in this branch\n if (position === 28) {\n // Write to the view\n U32_VIEW[0] = intermediate;\n // set `intermediate` to the remaining 3 bits\n // We only want the remaining three bits because the other 4 have been \"consumed\" on line 21\n intermediate = (byte & 0b01110000) >>> 4;\n // set `position` to -4 because later 7 will be added, making it 3\n position = -4;\n }\n\n // Increment the shift position by 7\n position += 7;\n // Increment the iterator by 1\n i++;\n // Keep going while there is a continuation bit\n } while ((byte & 0b10000000) === 0b10000000);\n // subtract the initial offset from `i` to get the bytes read\n const nRead = i - offset;\n\n // If 10 bytes have been read and intermediate has overflown\n // it means that the varint is malformed\n // If 11 bytes have been read it means that the varint is malformed\n // If `i` is bigger than the buffer it means we overread the buffer and the varint is malformed\n if ((nRead === 10 && intermediate > -1) || nRead === 11 || i > buf.length) {\n throw new RangeError(\n \"Cannot decode the varint input: Malformed or overflow varint\",\n );\n }\n\n // Write the intermediate value to the \"empty\" slot\n // if the first slot is taken. Take the second slot\n U32_VIEW[Number(nRead > 4)] = intermediate;\n\n return [U64_VIEW[0], i];\n}\n\n/**\n * Given a `buf`, starting at `offset` (default: 0), begin decoding bytes as\n * Varint encoded bytes, for a maximum of 5 bytes (offset + 5). The returned\n * tuple is of the decoded varint 32-bit number, and the new offset with which\n * to continue decoding other data.\n *\n * Varints are _not 32-bit by default_ so this should only be used in cases\n * where the varint is _assured_ to be 32-bits. If in doubt, use `decode()`.\n *\n * To know how many bytes the Varint took to encode, simply negate `offset`\n * from the returned new `offset`.\n *\n * @param buf The buffer to decode from.\n * @param offset The offset to start decoding from.\n * @returns A tuple of the decoded varint 32-bit number, and the new offset.\n *\n * @example Usage\n * ```ts\n * import { decodeVarint32 } from \"@std/encoding/varint\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const buf = new Uint8Array([0x8E, 0x02]);\n * assertEquals(decodeVarint32(buf), [270, 2]);\n * ```\n */\nexport function decodeVarint32(buf: Uint8Array, offset = 0): [number, number] {\n let shift = 0;\n let decoded = 0;\n for (\n let i = offset;\n i <= Math.min(buf.length, offset + MaxVarintLen32);\n i += 1, shift += SHIFT\n ) {\n const byte = buf[i]!;\n decoded += (byte & REST) * Math.pow(2, shift);\n if (!(byte & MSB)) return [decoded, i + 1];\n }\n throw new RangeError(\n \"Cannot decode the varint input: Malformed or overflow varint\",\n );\n}\n\n/**\n * Takes unsigned number `num` and converts it into a Varint encoded\n * `Uint8Array`, returning a tuple consisting of a `Uint8Array` slice of the\n * encoded Varint, and an offset where the Varint encoded bytes end within the\n * `Uint8Array`.\n *\n * If `buf` is not given then a Uint8Array will be created.\n * `offset` defaults to `0`.\n *\n * If passed `buf` then that will be written into, starting at `offset`. The\n * resulting returned `Uint8Array` will be a slice of `buf`. The resulting\n * returned number is effectively `offset + bytesWritten`.\n *\n * @param num The number to encode.\n * @param buf The buffer to write into.\n * @param offset The offset to start writing at.\n * @returns A tuple of the encoded Varint `Uint8Array` and the new offset.\n *\n * @example Usage\n * ```ts\n * import { encodeVarint } from \"@std/encoding/varint\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const buf = new Uint8Array(10);\n * assertEquals(encodeVarint(42n, buf), [new Uint8Array([42]), 1]);\n * ```\n */\nexport function encodeVarint(\n num: bigint | number,\n buf: Uint8Array = new Uint8Array(MaxVarintLen64),\n offset = 0,\n): [Uint8Array_, number] {\n num = BigInt(num);\n if (num < 0n) {\n throw new RangeError(\n `Cannot encode the input into varint as it should be non-negative integer: received ${num}`,\n );\n }\n for (\n let i = offset;\n i <= Math.min(buf.length, MaxVarintLen64);\n i += 1\n ) {\n if (num < MSBN) {\n buf[i] = Number(num);\n i += 1;\n return [buf.slice(offset, i), i];\n }\n buf[i] = Number((num & 0xFFn) | MSBN);\n num >>= SHIFTN;\n }\n throw new RangeError(\n `Cannot encode the input ${num} into varint as it overflows uint64`,\n );\n}\n", "import type {\n AsyncTransform,\n Transform,\n} from \"../../webcrack/ast-utils/transform.ts\";\nimport traverse, { type NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { CryptoHelper } from \"../../utils/crypto.ts\";\nimport { assert, assertExists, assertInstanceOf } from \"jsr:@std/assert@^1.0.19\";\n\n/** Find call to `scryptSync`. */\nconst scrypt = m.callExpression(\n m.memberExpression(\n m.identifier(),\n m.identifier(\"scryptSync\"),\n false,\n ),\n [\n // Password\n m.or(\n m.memberExpression(\n m.identifier(),\n m.identifier(\"licenseErrorText\"),\n false,\n ),\n m.identifier(),\n ),\n // Salt\n m.identifier(),\n m.numericLiteral(24),\n ],\n);\n\n/** Find `exports.licenseErrorText`. */\nconst licenseText = m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.identifier(),\n m.identifier(\"licenseErrorText\"),\n ),\n m.callExpression(\n m.memberExpression(\n m.arrayExpression(m.anyList(m.oneOrMore(m.stringLiteral()))),\n m.identifier(\"join\"),\n false,\n ),\n [m.stringLiteral(\" \")],\n ),\n);\n\n/** Find `crypto.createDecipheriv()`. */\nconst createDecipheriv = m.callExpression(\n m.memberExpression(m.identifier(), m.identifier(\"createDecipheriv\"), false),\n [m.stringLiteral(\"aes-192-cbc\"), m.identifier(), m.identifier()],\n);\n\n/** Find `.decrypt(\"<encoded string>\")`. */\nconst encryptedString = m.callExpression(\n m.or(\n m.memberExpression(\n m.identifier(),\n m.identifier(\"decrypt\"),\n false,\n ),\n m.identifier(\"__delance_decrypt\"),\n ),\n [m.stringLiteral()],\n);\n\nexport function createCryptoHelper(ast: t.Node): Promise<CryptoHelper> {\n let salt: string | undefined = undefined;\n let key: string | undefined = undefined;\n\n traverse(ast, {\n CallExpression: {\n exit($) {\n if (salt !== null || !scrypt.match($.node)) {\n return;\n }\n\n const $saltId = $.get(\"arguments.1\");\n assert($saltId.isIdentifier());\n\n const _saltDecl = $.scope.getBinding($saltId.node.name)?.path;\n if (!_saltDecl) {\n throw new Error(\"Could not find declaration\");\n }\n\n const $saltDecl = _saltDecl;\n assert($saltDecl.isVariableDeclarator());\n\n const $salt = $saltDecl.get(\"init\");\n if (!$salt.isStringLiteral()) {\n throw new Error(\"Salt not initialized\");\n }\n\n salt = $salt.node.value;\n\n if (key !== null) {\n return;\n }\n\n const $keyId = $.get(\"arguments.0\");\n if ($keyId.isIdentifier()) {\n const _keyDecl = $.scope.getBinding($keyId.node.name)?.path;\n if (!_keyDecl) {\n throw new Error(\"Could not find declaration\");\n }\n\n const $keyDecl = _keyDecl;\n assert($keyDecl.isVariableDeclarator());\n\n const $key = $keyDecl.get(\"init\");\n if ($key.isStringLiteral()) {\n key = $key.node.value;\n }\n }\n },\n },\n AssignmentExpression: {\n exit($) {\n if (key || !licenseText.match($.node)) {\n return;\n }\n\n const $strs = $.get(\"right.callee.object.elements\");\n assertInstanceOf($strs, Array);\n key = $strs.map(($_) => {\n assert($_.isStringLiteral());\n return $_.node.value;\n }).join(\" \");\n },\n },\n });\n\n return CryptoHelper.from(key, salt);\n}\n\nexport const collectDecryptCalls: Transform = {\n name: \"string-aes-collect\",\n tags: [\"safe\"],\n visitor() {\n return {\n CallExpression: {\n exit($) {\n if (createDecipheriv.match($.node)) {\n const _function = $.findParent((path) =>\n path.isFunctionDeclaration()\n );\n if (_function === null) {\n return;\n }\n\n const $function = _function;\n assert($function.isFunctionDeclaration());\n\n if ($function.node.params.length !== 1) {\n throw new Error(\"unexcepted location of createDecipheriv\");\n }\n\n const $id = $function.get(\"id\");\n assert($id.isIdentifier());\n\n $function.scope.rename($id.node.name, \"__delance_decrypt\");\n this.changes++;\n }\n },\n },\n };\n },\n};\n\nexport const decryptStrings: AsyncTransform<CryptoHelper> = {\n name: \"string-aes-decrypt\",\n tags: [\"safe\"],\n async run(ast, state, helper) {\n assertExists(helper);\n\n const calls: NodePath<t.CallExpression>[] = [];\n\n traverse(\n ast,\n {\n CallExpression: {\n exit($) {\n if (!encryptedString.match($.node)) {\n return;\n }\n\n const $string = $.get(\"arguments.0\");\n assert($string.isStringLiteral());\n\n calls.push($);\n },\n },\n },\n );\n\n for (const call of calls) {\n const $string = call.get(\"arguments.0\");\n assert($string.isStringLiteral());\n\n call.replaceWith(\n t.stringLiteral(await helper.decrypt($string.node.value)),\n );\n }\n state.changes += calls.length;\n },\n};\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport { applyTransform as webcrackApplyTransform } from \"../../webcrack/ast-utils/transform.ts\";\nimport transpile from \"../../webcrack/transpile/mod.ts\";\nimport { applyTransform, applyTransformAsync } from \"../../utils/ast.ts\";\nimport antifeature from \"./antifeature.ts\";\nimport {\n collectDecryptCalls,\n createCryptoHelper,\n decryptStrings,\n} from \"./stringaes.ts\";\n\n/**\n * Delance specific transforms.\n */\nexport default async function transform(ast: t.Node) {\n applyTransform(ast, collectDecryptCalls);\n await applyTransformAsync(ast, decryptStrings, await createCryptoHelper(ast));\n applyTransform(ast, antifeature);\n webcrackApplyTransform(ast, transpile);\n\n return ast;\n}\n", "import type { Transform } from \"../../webcrack/ast-utils/transform.ts\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\n\n/**\n * Simplify function calls between modules that discard reference bindings\n *\n * @example\n * `(0, someModule.someFunction)(args)` -> `someModule.someFunction(args)`\n *\n * @link <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_operator#discarding_reference_binding>\n * @link <https://github.com/pionxzh/wakaru/blob/main/packages/unminify/src/transformations/un-indirect-call.ts>\n */\nexport default {\n name: \"indirect-call\",\n tags: [\"unsafe\"],\n visitor: () => ({\n CallExpression: {\n exit($) {\n const { callee, arguments: _arguments } = $.node;\n if (!t.isSequenceExpression(callee)) {\n return;\n }\n\n const exprs = [...callee.expressions];\n const _function = exprs.pop();\n if (!t.isMemberExpression(_function)) {\n return;\n }\n\n // Ensure no side effects in the sequence\n if (exprs.every((expr) => t.isPureish(expr))) {\n $.replaceWith(t.callExpression(_function, _arguments));\n this.changes++;\n }\n },\n },\n }),\n} satisfies Transform;\n", "import tmpl from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\nexport const __createBinding = tmpl.expression.ast`\n(this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n\tif (k2 === undefined) k2 = k;\n\tvar desc = Object.getOwnPropertyDescriptor(m, k);\n\tif (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n\t\tdesc = { enumerable: true, get: function() { return m[k]; } };\n\t}\n\tObject.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n\tif (k2 === undefined) k2 = k;\n\to[k2] = m[k];\n}))\n`;\n\nconst obj = m.capture(m.identifier());\nconst mod = m.capture(m.identifier());\nconst k = m.capture(m.identifier());\nconst k2 = m.capture(m.identifier());\nconst desc = m.capture(m.identifier());\nconst descMiddle = m.capture(m.identifier());\n\nconst descObj = m.objectExpression([\n m.objectProperty(\n m.identifier(\"enumerable\"),\n m.booleanLiteral(true),\n ),\n m.objectProperty(\n m.identifier(\"get\"),\n m.functionExpression(\n null,\n [],\n m.blockStatement([\n m.returnStatement(m.memberExpression(\n m.fromCapture(mod),\n m.fromCapture(k),\n true,\n )),\n ]),\n ),\n ),\n]);\n\nconst cond = m.conditionalExpression(\n m.binaryExpression(\n \"in\",\n m.stringLiteral(\"get\"),\n m.fromCapture(desc),\n ),\n m.unaryExpression(\n \"!\",\n m.memberExpression(\n m.fromCapture(mod),\n m.identifier(\"__esModule\"),\n false,\n ),\n ),\n m.logicalExpression(\n \"||\",\n m.memberExpression(\n m.fromCapture(desc),\n m.identifier(\"writable\"),\n false,\n ),\n m.memberExpression(\n m.fromCapture(desc),\n m.identifier(\"configurable\"),\n false,\n ),\n ),\n);\n\n/**\n * Match `__createBinding`.\n * @example\n * ```javascript\n * var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n * \tif (k2 === undefined) k2 = k;\n * \tvar desc = Object.getOwnPropertyDescriptor(m, k);\n * \tif (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n * \t\tdesc = { enumerable: true, get: function() { return m[k]; } };\n * \t}\n * \tObject.defineProperty(o, k2, desc);\n * }) : (function(o, m, k, k2) {\n * \tif (k2 === undefined) k2 = k;\n * \to[k2] = m[k];\n * }));\n * ```\n * @example\n * ```javascript\n * var _v183 = this && this.__createBinding || (Object.create ? function (_a171, _a172, _a173, _a174) {\n * \tif (_a174 === undefined) {\n * \t\t_a174 = _a173;\n * \t}\n * \tObject.defineProperty(_a171, _a174, {\n * \t\tenumerable: true,\n * \t\tget: function () {\n * \t\t\treturn _a172[_a173];\n * \t\t}\n * \t});\n * } : function (_a175, _a176, _a177, _a178) {\n * \tif (_a178 === undefined) {\n * \t\t_a178 = _a177;\n * \t}\n * \t_a175[_a178] = _a176[_a177];\n * });\n * ```\n */\nexport default m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n m.identifier(),\n m.logicalExpression(\n \"||\",\n m.logicalExpression(\n \"&&\",\n m.thisExpression(),\n m.memberExpression(\n m.thisExpression(),\n m.identifier(\"__createBinding\"),\n ),\n ),\n m.conditionalExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"create\"),\n ),\n m.functionExpression(\n null,\n [obj, mod, k, k2],\n m.or(\n m.blockStatement([\n m.ifStatement(\n m.binaryExpression(\n \"===\",\n k2,\n m.identifier(\"undefined\"),\n ),\n m.containerOf(m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.fromCapture(k2),\n m.fromCapture(k),\n ))),\n null,\n ),\n m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n desc,\n m.callExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"getOwnPropertyDescriptor\"),\n false,\n ),\n [\n m.fromCapture(mod),\n m.fromCapture(k),\n ],\n ),\n ),\n ]),\n m.ifStatement(\n m.logicalExpression(\n \"||\",\n m.unaryExpression(\n \"!\",\n m.fromCapture(desc),\n true,\n ),\n m.or(\n cond,\n m.unaryExpression(\n \"!\",\n m.unaryExpression(\n \"!\",\n cond,\n true,\n ),\n true,\n ),\n ),\n ),\n m.or(\n m.blockStatement([\n m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.fromCapture(desc),\n descObj,\n )),\n ]),\n m.blockStatement([\n m.variableDeclaration(\"const\", [\n m.variableDeclarator(descMiddle, descObj),\n ]),\n m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.fromCapture(desc),\n m.fromCapture(descMiddle),\n )),\n ]),\n ),\n null,\n ),\n m.expressionStatement(m.callExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"defineProperty\"),\n false,\n ),\n [\n m.fromCapture(obj),\n m.fromCapture(k2),\n m.fromCapture(desc),\n ],\n )),\n ]),\n m.blockStatement([\n m.ifStatement(\n m.binaryExpression(\n \"===\",\n k2,\n m.identifier(\"undefined\"),\n ),\n m.containerOf(m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.fromCapture(k2),\n m.fromCapture(k),\n ))),\n null,\n ),\n m.expressionStatement(m.callExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"defineProperty\"),\n false,\n ),\n [\n m.fromCapture(obj),\n m.fromCapture(k2),\n descObj,\n ],\n )),\n ]),\n ),\n ),\n m.functionExpression(\n null,\n [obj, mod, k, k2],\n m.blockStatement([\n m.ifStatement(\n m.binaryExpression(\n \"===\",\n k2,\n m.identifier(\"undefined\"),\n ),\n m.containerOf(m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.fromCapture(k2),\n m.fromCapture(k),\n ))),\n null,\n ),\n m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.fromCapture(obj),\n m.fromCapture(k2),\n true,\n ),\n m.memberExpression(\n m.fromCapture(mod),\n m.fromCapture(k),\n true,\n ),\n )),\n ]),\n ),\n ),\n ),\n ),\n]);\n", "import tmpl from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\nexport const __exportStar = tmpl.expression.ast`\n(this && this.__exportStar) || function(m, exports) {\n\tfor (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n}\n`;\n\nconst mod = m.capture(m.identifier());\nconst exp = m.capture(m.identifier());\nconst p = m.capture(m.identifier());\n\n/**\n * Match `__exportStar`.\n * @example\n * ```javascript\n * var __exportStar = (this && this.__exportStar) || function(m, exports) {\n * \tfor (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n * };\n * ```\n */\nexport default m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n m.identifier(),\n m.logicalExpression(\n \"||\",\n m.logicalExpression(\n \"&&\",\n m.thisExpression(),\n m.memberExpression(\n m.thisExpression(),\n m.identifier(\"__exportStar\"),\n false,\n ),\n ),\n m.functionExpression(\n null,\n [mod, exp],\n m.blockStatement([\n m.forInStatement(\n m.variableDeclaration(\"var\", [\n m.variableDeclarator(p),\n ]),\n m.fromCapture(mod),\n m.containerOf(m.ifStatement(\n m.logicalExpression(\n \"&&\",\n m.binaryExpression(\n \"!==\",\n m.fromCapture(p),\n m.stringLiteral(\"default\"),\n ),\n m.unaryExpression(\n \"!\",\n m.callExpression(\n m.memberExpression(\n m.memberExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"prototype\"),\n false,\n ),\n m.identifier(\"hasOwnProperty\"),\n false,\n ),\n m.identifier(\"call\"),\n false,\n ),\n [\n m.fromCapture(exp),\n m.fromCapture(p),\n ],\n ),\n true,\n ),\n ),\n m.containerOf(m.expressionStatement(m.callExpression(\n m.identifier(),\n [\n m.fromCapture(exp),\n m.fromCapture(mod),\n m.fromCapture(p),\n ],\n ))),\n )),\n ),\n ]),\n ),\n ),\n ),\n]);\n", "import tmpl from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\nexport const __importDefault = tmpl.expression.ast`\n(this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n}\n`;\n\nconst mod = m.capture(m.identifier());\nconst isEsm = m.logicalExpression(\n \"&&\",\n m.fromCapture(mod),\n m.memberExpression(\n m.fromCapture(mod),\n m.identifier(\"__esModule\"),\n false,\n ),\n);\n\n/**\n * Match `__importDefault`.\n * @example\n * ```javascript\n * var __importDefault = (this && this.__importDefault) || function (mod) {\n * \treturn (mod && mod.__esModule) ? mod : { \"default\": mod };\n * };\n * ```\n * @example\n * ```javascript\n * var data_55311B = this && this.__importDefault || function (_a1) {\n * \tif (_a1 && _a1.__esModule) {\n * \t\treturn _a1;\n * \t} else {\n * \t\treturn {\n * \t\t\tdefault: _a1\n * \t\t};\n * \t}\n * };\n * ```\n */\nexport default m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n m.identifier(),\n m.logicalExpression(\n \"||\",\n m.logicalExpression(\n \"&&\",\n m.thisExpression(),\n m.memberExpression(\n m.thisExpression(),\n m.identifier(\"__importDefault\"),\n ),\n ),\n m.functionExpression(\n null,\n [mod],\n m.blockStatement([\n m.or(\n m.returnStatement(m.conditionalExpression(\n isEsm,\n m.fromCapture(mod),\n m.objectExpression([\n m.objectProperty(\n m.stringLiteral(\"default\"),\n m.fromCapture(mod),\n false,\n ),\n ]),\n )),\n m.ifStatement(\n isEsm,\n m.containerOf(m.returnStatement(m.fromCapture(mod))),\n m.containerOf(m.returnStatement(m.objectExpression([\n m.objectProperty(\n m.identifier(\"default\"),\n m.fromCapture(mod),\n false,\n ),\n ]))),\n ),\n ),\n ]),\n ),\n ),\n ),\n]);\n", "import tmpl from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\nexport const __importStar = tmpl.expression.ast`\n(this && this.__importStar) || function (mod) {\n\tif (mod && mod.__esModule) return mod;\n\tvar result = {};\n\tif (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n\t__setModuleDefault(result, mod);\n\treturn result;\n}\n`;\n\nconst mod = m.capture(m.identifier());\nconst k = m.capture(m.identifier());\nconst result = m.capture(m.identifier());\n\n/**\n * Match `__importStar`.\n * @example\n * ```javascript\n * var __importStar = (this && this.__importStar) || function (mod) {\n * \tif (mod && mod.__esModule) return mod;\n * \tvar result = {};\n * \tif (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n * \t__setModuleDefault(result, mod);\n * \treturn result;\n * };\n * ```\n */\nexport default m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n m.identifier(),\n m.logicalExpression(\n \"||\",\n m.logicalExpression(\n \"&&\",\n m.thisExpression(),\n m.memberExpression(\n m.thisExpression(),\n m.identifier(\"__importStar\"),\n false,\n ),\n ),\n m.functionExpression(\n null,\n [mod],\n m.or(m.blockStatement([\n m.ifStatement(\n m.logicalExpression(\n \"&&\",\n m.fromCapture(mod),\n m.memberExpression(\n m.fromCapture(mod),\n m.identifier(\"__esModule\"),\n ),\n ),\n m.containerOf(m.returnStatement(m.fromCapture(mod))),\n null,\n ),\n m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n result,\n m.objectExpression([]),\n ),\n ]),\n m.ifStatement(\n m.binaryExpression(\"!=\", m.fromCapture(mod), m.nullLiteral()),\n m.containerOf(m.forInStatement(\n m.variableDeclaration(\n \"var\",\n [\n m.variableDeclarator(\n k,\n null,\n ),\n ],\n ),\n m.fromCapture(mod),\n m.containerOf(m.ifStatement(\n m.logicalExpression(\n \"&&\",\n m.binaryExpression(\n \"!==\",\n m.fromCapture(k),\n m.stringLiteral(\"default\"),\n ),\n m.callExpression(\n m.memberExpression(\n m.memberExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"prototype\"),\n false,\n ),\n m.identifier(\"hasOwnProperty\"),\n false,\n ),\n m.identifier(\"call\"),\n false,\n ),\n [\n m.fromCapture(mod),\n m.fromCapture(k),\n ],\n ),\n ),\n m.containerOf(m.callExpression(\n m.identifier(),\n [\n m.fromCapture(result),\n m.fromCapture(mod),\n m.fromCapture(k),\n ],\n )),\n )),\n )),\n null,\n ),\n m.expressionStatement(m.callExpression(\n m.identifier(),\n [\n m.fromCapture(result),\n m.fromCapture(mod),\n ],\n )),\n m.returnStatement(m.fromCapture(result)),\n ])),\n ),\n ),\n ),\n]);\n", "import tmpl from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\nexport const __setModuleDefault = tmpl.expression.ast`\n(this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n\tObject.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n\to[\"default\"] = v;\n})\n`;\n\nconst leftParamObj = m.capture(m.identifier());\nconst leftParamVal = m.capture(m.identifier());\nconst leftObjIdentifier = m.capture(m.identifier());\nconst leftObj = m.objectExpression([\n m.objectProperty(\n m.identifier(\"enumerable\"),\n m.booleanLiteral(true),\n ),\n m.objectProperty(\n m.identifier(\"value\"),\n leftParamVal,\n ),\n]);\n\nconst rightParamObj = m.capture(m.identifier());\nconst rightParamVal = m.capture(m.identifier());\n\n/**\n * Match `__setModuleDefault`.\n * @example\n * ```javascript\n * var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n * \t// this inline ObjectExpression could be emitted as an isolated VariableDeclarator in the scope\n * \tObject.defineProperty(o, \"default\", { enumerable: true, value: v });\n * }) : function(o, v) {\n * \to[\"default\"] = v;\n * });\n * ```\n */\nexport default m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n m.identifier(),\n m.logicalExpression(\n \"||\",\n m.logicalExpression(\n \"&&\",\n m.thisExpression(),\n m.memberExpression(\n m.thisExpression(),\n m.identifier(\"__setModuleDefault\"),\n ),\n ),\n m.conditionalExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"create\"),\n ),\n m.functionExpression(\n null,\n [\n leftParamObj,\n leftParamVal,\n ],\n m.or(\n m.blockStatement([\n m.variableDeclaration(\n \"const\",\n [m.variableDeclarator(\n leftObjIdentifier,\n leftObj,\n )],\n ),\n m.expressionStatement(m.callExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"defineProperty\"),\n ),\n [\n leftParamObj,\n m.stringLiteral(\"default\"),\n leftObjIdentifier,\n ],\n )),\n ]),\n m.blockStatement([\n m.expressionStatement(m.callExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"defineProperty\"),\n ),\n [\n leftParamObj,\n m.stringLiteral(\"default\"),\n leftObj,\n ],\n )),\n ]),\n ),\n false,\n false,\n ),\n m.functionExpression(\n null,\n [\n rightParamObj,\n rightParamVal,\n ],\n m.blockStatement([\n m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.memberExpression(\n rightParamObj,\n m.identifier(\"default\"),\n ),\n rightParamVal,\n )),\n ]),\n ),\n ),\n ),\n ),\n]);\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type { Transform } from \"../../webcrack/ast-utils/transform.ts\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { chunks } from \"../../utils/matchers/chunk.ts\";\nimport createBinding, {\n __createBinding,\n} from \"../../utils/matchers/createBinding.ts\";\nimport exportStar, { __exportStar } from \"../../utils/matchers/exportStar.ts\";\nimport importDefault, {\n __importDefault,\n} from \"../../utils/matchers/importDefault.ts\";\nimport importStar, { __importStar } from \"../../utils/matchers/importStar.ts\";\nimport setModuleDefault, {\n __setModuleDefault,\n} from \"../../utils/matchers/setModuleDefault.ts\";\nimport { assert } from \"jsr:@std/assert@^1.0.19\";\n\nconst preExport = m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.identifier(\"exports\"),\n m.identifier(),\n false,\n ),\n m.identifier(\"undefined\"),\n);\n\nconst undefinedExpr = m.expressionStatement(m.identifier(\"undefined\"));\n\n/**\n * Rename webpack RequireJS shims and tsc esmodule helpers.\n * @link <https://www.typescriptlang.org/tsconfig#esModuleInterop>\n */\nexport default {\n name: \"module-helper\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n let level = 0;\n return {\n ObjectExpression: {\n enter($) {\n if (!chunks.match($.node)) {\n return;\n }\n\n level++;\n const unders = \"_\".repeat(level);\n\n const $chunks = $.get(\"properties\");\n\n for (const $chunk of $chunks) {\n let $function: NodePath<t.Function>;\n\n if ($chunk.isObjectProperty()) {\n const $func = $chunk.get(\"value\");\n assert($func.isFunction());\n $function = $func;\n } else {\n assert($chunk.isObjectMethod());\n $function = $chunk;\n }\n\n const $p = $function.get(\"params\");\n\n $p.forEach(($parameter, i) => {\n assert($parameter.isIdentifier());\n\n switch (i) {\n case 0: {\n $function.scope.rename(\n $parameter.node.name,\n `${unders}module`,\n );\n break;\n }\n\n case 1: {\n $function.scope.rename(\n $parameter.node.name,\n `${unders}exports`,\n );\n break;\n }\n\n case 2: {\n $function.scope.rename(\n $parameter.node.name,\n `${unders}require`,\n );\n break;\n }\n\n default: {\n throw new Error(\"Unexpected param\");\n }\n }\n });\n\n $function.traverse({\n // Find `esModuleInterop` helpers\n VariableDeclaration: {\n exit(p) {\n const $decl = p.get(\"declarations.0\");\n\n const $id = $decl.get(\"id\");\n if (!$id.isIdentifier()) {\n return;\n }\n\n /** @link <https://github.com/microsoft/TypeScript/tree/main/src/compiler/factory/emitHelpers.ts> */\n if (importStar.match(t.cloneNode(p.node))) {\n $id.scope.rename($id.node.name, \"__importStar\");\n $decl.get(\"init\").replaceWith(__importStar);\n } else if (setModuleDefault.match(t.cloneNode(p.node))) {\n $id.scope.rename($id.node.name, \"__setModuleDefault\");\n $decl.get(\"init\").replaceWith(__setModuleDefault);\n } else if (importDefault.match(t.cloneNode(p.node))) {\n $id.scope.rename($id.node.name, \"__importDefault\");\n $decl.get(\"init\").replaceWith(__importDefault);\n } else if (createBinding.match(t.cloneNode(p.node))) {\n $id.scope.rename($id.node.name, \"__createBinding\");\n $decl.get(\"init\").replaceWith(__createBinding);\n } else if (exportStar.match(t.cloneNode(p.node))) {\n $id.scope.rename($id.node.name, \"__exportStar\");\n $decl.get(\"init\").replaceWith(__exportStar);\n } else {\n return;\n }\n\n this.changes++;\n },\n },\n // Remove early export declarations\n AssignmentExpression: {\n exit(p) {\n // In some cases, `exports` is a getter/setter, so disable for now.\n if (true as boolean) return;\n\n if (!preExport.match(p.node)) {\n return;\n }\n\n // Why not `buildUndefinedNode`?\n // That method generates `void 0` instead of plain `undefined`,\n // which is not what we want.\n p.replaceWith(t.identifier(\"undefined\"));\n if (undefinedExpr.match(p.parent)) {\n p.parentPath.remove();\n this.changes++;\n }\n },\n },\n }, this);\n }\n },\n exit($) {\n if (chunks.match($.node)) {\n level--;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport { applyTransform } from \"../../utils/ast.ts\";\nimport indirectCall from \"./indirect-call.ts\";\nimport moduleHelper from \"./module-helper.ts\";\n\n/**\n * Restore minified webpack-style ESM helpers.\n */\nexport default function transform(ast: t.Node) {\n applyTransform(ast, moduleHelper);\n applyTransform(ast, indirectCall);\n\n return ast;\n}\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport { getQuickJS, shouldInterruptAfterDeadline } from \"npm:quickjs-emscripten@^0.32.0\";\nimport {\n applyTransform,\n applyTransformAsync,\n applyTransforms,\n} from \"../webcrack/ast-utils/transform.ts\";\nimport deobfuscate from \"../webcrack/deobfuscate/mod.ts\";\nimport mergeObjectAssignments from \"../webcrack/deobfuscate/merge-object-assignments.ts\";\nimport selfDefending from \"../webcrack/deobfuscate/self-defending.ts\";\nimport unminify from \"../webcrack/unminify/mod.ts\";\nimport blockStatements from \"../webcrack/unminify/block-statements.ts\";\nimport sequence from \"../webcrack/unminify/sequence.ts\";\nimport splitVariableDeclarations from \"../webcrack/unminify/split-variable-declarations.ts\";\nimport transpile from \"../webcrack/transpile/mod.ts\";\nimport evaluateGlobals from \"../webcrack/deobfuscate/evaluate-globals.ts\";\n\n/**\n * Run webcrack passes.\n */\nexport default async function transform(ast: t.Node) {\n applyTransforms(\n ast,\n [blockStatements, sequence, splitVariableDeclarations],\n {\n name: \"prepare\",\n },\n );\n\n await applyTransformAsync(\n ast,\n deobfuscate,\n async (code: string) =>\n (await getQuickJS()).evalCode(code, {\n shouldInterrupt: shouldInterruptAfterDeadline(Date.now() + 2000),\n memoryLimitBytes: 4 * 1024 * 1024,\n }),\n );\n\n applyTransforms(ast, [transpile, unminify]);\n applyTransform(ast, selfDefending);\n applyTransforms(ast, [mergeObjectAssignments, evaluateGlobals]);\n\n return ast;\n}\n", "import { createDebug } from \"npm:obug@^2.1.1\";\nimport {\n applyTransform,\n applyTransformAsync,\n applyTransforms,\n type AsyncTransform,\n} from \"../ast-utils/transform.ts\";\nimport mergeStrings from \"../unminify/merge-strings.ts\";\nimport { findArrayRotator } from \"./array-rotator.ts\";\nimport controlFlowObject from \"./control-flow-object.ts\";\nimport controlFlowSwitch from \"./control-flow-switch.ts\";\nimport deadCode from \"./dead-code.ts\";\nimport { findDecoders } from \"./decoder.ts\";\nimport inlineDecodedStrings from \"./inline-decoded-strings.ts\";\nimport inlineDecoderWrappers from \"./inline-decoder-wrappers.ts\";\nimport inlineObjectProps from \"./inline-object-props.ts\";\nimport { findStringArray } from \"./string-array.ts\";\nimport { type Sandbox, VMDecoder } from \"./vm.ts\";\n\n// https://astexplorer.net/#/gist/b1018df4a8daebfcb1daf9d61fe17557/4ff9ad0e9c40b9616956f17f59a2d9888cd62a4f\n\nexport default {\n name: \"deobfuscate\",\n tags: [\"unsafe\"],\n scope: true,\n async run(ast, state, sandbox) {\n if (!sandbox) return;\n\n const logger = createDebug(\"webcrack:deobfuscate\");\n const stringArray = findStringArray(ast);\n logger(\n stringArray\n ? `String Array: ${stringArray.originalName}, length ${stringArray.length}`\n : \"String Array: no\",\n );\n if (!stringArray) return;\n\n const rotator = findArrayRotator(stringArray);\n logger(`String Array Rotate: ${rotator ? \"yes\" : \"no\"}`);\n\n const decoders = findDecoders(stringArray);\n logger(\n `String Array Decoders: ${\n decoders\n .map((d) => d.originalName)\n .join(\", \")\n }`,\n );\n\n state.changes += applyTransform(ast, inlineObjectProps).changes;\n\n for (const decoder of decoders) {\n state.changes += applyTransform(\n ast,\n inlineDecoderWrappers,\n decoder,\n ).changes;\n }\n\n const vm = new VMDecoder(sandbox, stringArray, decoders, rotator);\n state.changes += (\n await applyTransformAsync(ast, inlineDecodedStrings, { vm })\n ).changes;\n\n if (decoders.length > 0) {\n stringArray.path.remove();\n rotator?.remove();\n decoders.forEach((decoder) => decoder.path.remove());\n state.changes += 2 + decoders.length;\n }\n\n state.changes += applyTransforms(\n ast,\n [mergeStrings, deadCode, controlFlowObject, controlFlowSwitch],\n { noScope: true },\n ).changes;\n },\n} satisfies AsyncTransform<Sandbox>;\n", "import * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\n// \"a\" + \"b\" -> \"ab\"\n// (a + \"b\") + \"c\" -> a + \"bc\"\n// left ^ ^ right (path)\nexport default {\n name: \"merge-strings\",\n tags: [\"safe\"],\n visitor() {\n const left = m.capture(m.stringLiteral());\n const right = m.capture(m.stringLiteral());\n\n const matcher = m.binaryExpression(\n \"+\",\n m.or(left, m.binaryExpression(\"+\", m.anything(), left)),\n right,\n );\n\n return {\n BinaryExpression: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n left.current!.value += right.current!.value;\n right.current!.value = \"\"; // Otherwise it concatenates multiple times for some reason\n path.replaceWith(path.node.left);\n path.skip();\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { callExpression } from \"jsr:@codemod/matchers@^2.0.2\";\nimport {\n constMemberExpression,\n findParent,\n iife,\n infiniteLoop,\n} from \"../ast-utils/matcher.ts\";\nimport type { StringArray } from \"./string-array.ts\";\n\nexport type ArrayRotator = NodePath<t.ExpressionStatement>;\n\n/**\n * Structure:\n * ```\n * iife (>= 2 parameters, called with 0 or 2 arguments)\n * 2 variable declarations (array and decoder)\n * endless loop:\n * try:\n * if/break/parseInt/array.push(array.shift())\n * catch:\n * array.push(array.shift())\n * ```\n */\nexport function findArrayRotator(\n stringArray: StringArray,\n): ArrayRotator | undefined {\n // e.g. 'array'\n const arrayIdentifier = m.capture(m.identifier());\n\n // e.g. array.push(array.shift())\n const pushShift = m.callExpression(\n constMemberExpression(arrayIdentifier, \"push\"),\n [\n m.callExpression(\n constMemberExpression(m.fromCapture(arrayIdentifier), \"shift\"),\n ),\n ],\n );\n\n const callMatcher = iife(\n m.anything(),\n m.blockStatement(\n m.anyList(\n m.zeroOrMore(),\n infiniteLoop(\n m.matcher((node) => {\n return (\n m\n .containerOf(callExpression(m.identifier(\"parseInt\")))\n .match(node) &&\n m\n .blockStatement([\n m.tryStatement(\n m.containerOf(pushShift),\n m.containerOf(pushShift),\n ),\n ])\n .match(node)\n );\n }),\n ),\n ),\n ),\n );\n\n const matcher = m.expressionStatement(\n m.or(callMatcher, m.unaryExpression(\"!\", callMatcher)),\n );\n\n for (const ref of stringArray.references) {\n const rotator = findParent(ref, matcher);\n if (rotator) {\n return rotator;\n }\n }\n}\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\n\nexport function getPropName(node: t.Node): string | undefined {\n if (t.isIdentifier(node)) {\n return node.name;\n }\n if (t.isStringLiteral(node)) {\n return node.value;\n }\n if (t.isNumericLiteral(node)) {\n return node.value.toString();\n }\n}\n", "import type { Binding, NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport traverse from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { getPropName } from \"./ast.ts\";\nimport { findParent, varFunctionOrDeclaration } from \"./matcher.ts\";\n\nfunction getNearestAssignment(\n assignments: t.AssignmentExpression[],\n location: number,\n) {\n return assignments.findLast((assignment) => assignment.start! < location);\n}\n\n/**\n * Replace all references of a variable with the initializer.\n * Example:\n * `const a = 1; console.log(a);` -> `console.log(1);`\n *\n * Example with `unsafeAssignments` being `true`:\n * `let a; a = 2; console.log(a);` -> `console.log(2);`\n *\n * @param unsafeAssignments Also inline assignments to the variable (not guaranteed to be the final value)\n */\nexport function inlineVariable(\n binding: Binding,\n value = m.anyExpression(),\n unsafeAssignments = false,\n) {\n const varDeclarator = binding.path.node;\n const varMatcher = m.variableDeclarator(\n m.identifier(binding.identifier.name),\n value,\n );\n const assignmentMatcher = m.assignmentExpression(\n \"=\",\n m.identifier(binding.identifier.name),\n value,\n );\n\n if (binding.constant && varMatcher.match(varDeclarator)) {\n binding.referencePaths.forEach((ref) => {\n ref.replaceWith(varDeclarator.init!);\n });\n binding.path.remove();\n } else if (unsafeAssignments && binding.constantViolations.length >= 1) {\n const assignments = binding.constantViolations\n .map((path) => path.node)\n .filter((node) => assignmentMatcher.match(node));\n if (!assignments.length) return;\n\n for (const ref of binding.referencePaths) {\n const assignment = getNearestAssignment(assignments, ref.node.start!);\n if (assignment) ref.replaceWith(assignment.right);\n }\n\n for (const path of binding.constantViolations) {\n if (path.parentPath?.isExpressionStatement()) {\n path.remove();\n } else if (path.isAssignmentExpression()) {\n path.replaceWith(path.node.right);\n }\n }\n\n binding.path.remove();\n }\n}\n\n/**\n * Make sure the array is immutable and references are valid before using!\n *\n * Example:\n * `const arr = [\"foo\", \"bar\"]; console.log(arr[0]);` -> `console.log(\"foo\");`\n */\nexport function inlineArrayElements(\n array: t.ArrayExpression,\n references: NodePath[],\n): void {\n for (const reference of references) {\n const memberPath = reference.parentPath! as NodePath<t.MemberExpression>;\n const property = memberPath.node.property as t.NumericLiteral;\n const index = property.value;\n const replacement = array.elements[index]!;\n memberPath.replaceWith(t.cloneNode(replacement));\n }\n}\n\nexport function inlineObjectProperties(\n binding: Binding,\n property = m.objectProperty(),\n): void {\n const varDeclarator = binding.path.node;\n const objectProperties = m.capture(m.arrayOf(property));\n const varMatcher = m.variableDeclarator(\n m.identifier(binding.identifier.name),\n m.objectExpression(objectProperties),\n );\n if (!varMatcher.match(varDeclarator)) return;\n\n const propertyMap = new Map(\n objectProperties.current!.map((p) => [getPropName(p.key), p.value]),\n );\n if (\n !binding.referencePaths.every((ref) => {\n const member = ref.parent as t.MemberExpression;\n const propName = getPropName(member.property)!;\n return propertyMap.has(propName);\n })\n ) {\n return;\n }\n\n binding.referencePaths.forEach((ref) => {\n const memberPath = ref.parentPath as NodePath<t.MemberExpression>;\n const propName = getPropName(memberPath.node.property)!;\n const value = propertyMap.get(propName)!;\n\n memberPath.replaceWith(value);\n });\n\n binding.path.remove();\n}\n\n/**\n * Inline function used in control flow flattening (that only returns an expression)\n * Example:\n * fn: `function (a, b) { return a(b) }`\n * caller: `fn(a, 1)`\n * ->\n * `a(1)`\n */\nexport function inlineFunctionCall(\n fn: t.FunctionExpression | t.FunctionDeclaration,\n caller: NodePath<t.CallExpression>,\n): void {\n if (t.isRestElement(fn.params[1])) {\n caller.replaceWith(\n t.callExpression(\n caller.node.arguments[0] as t.Identifier,\n caller.node.arguments.slice(1),\n ),\n );\n return;\n }\n\n const returnedValue = (fn.body.body[0] as t.ReturnStatement).argument!;\n const clone = t.cloneNode(returnedValue, true);\n\n // Inline all arguments\n traverse(clone, {\n Identifier(path) {\n const paramIndex = fn.params.findIndex(\n (p) => (p as t.Identifier).name === path.node.name,\n );\n if (paramIndex !== -1) {\n path.replaceWith(\n caller.node.arguments[paramIndex] ??\n t.unaryExpression(\"void\", t.numericLiteral(0)),\n );\n path.skip();\n }\n },\n noScope: true,\n });\n\n caller.replaceWith(clone);\n}\n\n/**\n * Example:\n * `function alias(a, b) { return decode(b - 938, a); } alias(1071, 1077);`\n * or\n * `var alias = function(a, b) { return decode(b - 938, a); }; alias(1071, 1077);`\n * ->\n * `decode(1077 - 938, 1071)`\n */\nexport function inlineFunctionAliases(binding: Binding): { changes: number } {\n const state = { changes: 0 };\n const refs = [...binding.referencePaths];\n\n // E.g. alias\n const fnName = m.capture(m.anyString());\n // E.g. decode(b - 938, a)\n const returnedCall = m.capture(\n m.callExpression(\n m.identifier(binding.identifier.name),\n m.anyList(m.slice({ min: 2 })),\n ),\n );\n const matcher = varFunctionOrDeclaration(\n m.identifier(fnName),\n m.anyList(m.slice({ min: 2, matcher: m.identifier() })),\n m.blockStatement([m.returnStatement(returnedCall)]),\n );\n\n for (const ref of refs) {\n const decl = findParent(ref, matcher);\n if (!decl) continue;\n\n const fnPath = decl.isFunctionDeclaration()\n ? decl\n : (decl.get(\"declarations.0.init\") as NodePath<t.FunctionExpression>);\n\n // Avoid false positives of functions that return a string\n // It's only a wrapper if the function's params are used in the decode call\n const paramUsedInDecodeCall = fnPath.node.params.some((param) => {\n const binding = fnPath.scope.getBinding((param as t.Identifier).name);\n return binding?.referencePaths.some((ref) =>\n ref.findParent((p) => p.node === returnedCall.current)\n );\n });\n if (!paramUsedInDecodeCall) continue;\n\n const fnBinding = fnPath.scope.parent!.getBinding(fnName.current!);\n if (!fnBinding) continue;\n // Check all further aliases (`function alias2(a, b) { return alias(a - 1, b + 3); }`)\n const fnRefs = fnBinding.referencePaths;\n refs.push(...fnRefs);\n\n // E.g. [alias(1071, 1077), alias(1, 2)]\n const callRefs = fnRefs\n .filter(\n (ref) =>\n t.isCallExpression(ref.parent) &&\n t.isIdentifier(ref.parent.callee, { name: fnName.current! }),\n )\n .map((ref) => ref.parentPath!) as NodePath<t.CallExpression>[];\n\n for (const callRef of callRefs) {\n inlineFunctionCall(fnPath.node, callRef);\n state.changes++;\n }\n\n decl.remove();\n state.changes++;\n }\n\n // Have to crawl again because renaming messed up the references\n binding.scope.crawl();\n return state;\n}\n\n/**\n * Recursively renames all references to the binding.\n * Make sure the binding name isn't shadowed anywhere!\n *\n * Example: `var alias = decoder; alias(1);` -> `decoder(1);`\n */\n\nexport function inlineVariableAliases(\n binding: Binding,\n targetName = binding.identifier.name,\n): { changes: number } {\n const state = { changes: 0 };\n const refs = [...binding.referencePaths];\n const varName = m.capture(m.anyString());\n const matcher = m.or(\n m.variableDeclarator(\n m.identifier(varName),\n m.identifier(binding.identifier.name),\n ),\n m.assignmentExpression(\n \"=\",\n m.identifier(varName),\n m.identifier(binding.identifier.name),\n ),\n );\n\n for (const ref of refs) {\n if (matcher.match(ref.parent)) {\n const varScope = ref.scope;\n const varBinding = varScope.getBinding(varName.current!);\n if (!varBinding) continue;\n // Avoid infinite loop from `alias = alias;` (caused by dead code injection?)\n if (ref.isIdentifier({ name: varBinding.identifier.name })) continue;\n\n // Check all further aliases (`var alias2 = alias;`)\n state.changes += inlineVariableAliases(varBinding, targetName).changes;\n\n if (ref.parentPath?.isAssignmentExpression()) {\n // Remove `var alias;` when the assignment happens separately\n varBinding.path.remove();\n\n if (t.isExpressionStatement(ref.parentPath.parent)) {\n // Remove `alias = decoder;`\n ref.parentPath.remove();\n } else {\n // Replace `(alias = decoder)(1);` with `decoder(1);`\n ref.parentPath.replaceWith(t.identifier(targetName));\n }\n } else if (ref.parentPath?.isVariableDeclarator()) {\n // Remove `alias = decoder;` of declarator\n ref.parentPath.remove();\n }\n state.changes++;\n } else {\n // Rename the reference\n ref.replaceWith(t.identifier(targetName));\n state.changes++;\n }\n }\n\n return state;\n}\n", "import type { Binding, NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { applyTransform, type Transform } from \"../ast-utils/transform.ts\";\nimport {\n constKey,\n constMemberExpression,\n createFunctionMatcher,\n findParent,\n isReadonlyObject,\n} from \"../ast-utils/matcher.ts\";\nimport { getPropName } from \"../ast-utils/ast.ts\";\nimport { inlineFunctionCall } from \"../ast-utils/inline.ts\";\nimport mergeStrings from \"../unminify/merge-strings.ts\";\n\n/**\n * Explanation: https://excalidraw.com/#json=0vehUdrfSS635CNPEQBXl,hDOd-UO9ETfSDWT9MxVX-A\n */\n\nexport default {\n name: \"control-flow-object\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const varId = m.capture(m.identifier());\n const propertyName = m.matcher<string>((name) =>\n typeof name === \"string\" && /^[a-z]{5}$/i.test(name)\n );\n const propertyKey = constKey(propertyName);\n const propertyValue = m.or(\n // E.g. \"6|0|4|3|1|5|2\"\n m.stringLiteral(),\n // E.g. function (a, b) { return a + b }\n createFunctionMatcher(2, (left, right) => [\n m.returnStatement(\n m.or(\n m.binaryExpression(undefined, left, right),\n m.logicalExpression(undefined, left, right),\n m.binaryExpression(undefined, right, left),\n m.logicalExpression(undefined, right, left),\n ),\n ),\n ]),\n // E.g. function (a, b, c) { return a(b, c) } with an arbitrary number of arguments\n m.matcher<t.FunctionExpression>((node) => {\n return (\n t.isNode(node) &&\n t.isFunctionExpression(node) &&\n createFunctionMatcher(node.params.length, (...params) => [\n m.returnStatement(m.callExpression(params[0], params.slice(1))),\n ]).match(node)\n );\n }),\n // E.g. function (a, ...b) { return a(...b) }\n (() => {\n const fnName = m.capture(m.identifier());\n const restName = m.capture(m.identifier());\n\n return m.functionExpression(\n undefined,\n [fnName, m.restElement(restName)],\n m.blockStatement([\n m.returnStatement(\n m.callExpression(m.fromCapture(fnName), [\n m.spreadElement(m.fromCapture(restName)),\n ]),\n ),\n ]),\n );\n })(),\n );\n // E.g. \"rLxJs\": \"6|0|4|3|1|5|2\"\n const objectProperties = m.capture(\n m.arrayOf(m.objectProperty(propertyKey, propertyValue)),\n );\n const aliasId = m.capture(m.identifier());\n const aliasVar = m.variableDeclaration(m.anything(), [\n m.variableDeclarator(aliasId, m.fromCapture(varId)),\n ]);\n // E.g. \"rLxJs\"\n const assignedKey = m.capture(propertyName);\n // E.g. \"6|0|4|3|1|5|2\"\n const assignedValue = m.capture(propertyValue);\n // E.g. obj.rLxJs = \"6|0|4|3|1|5|2\"\n const assignment = m.expressionStatement(\n m.assignmentExpression(\n \"=\",\n constMemberExpression(m.fromCapture(varId), assignedKey),\n assignedValue,\n ),\n );\n const looseAssignment = m.expressionStatement(\n m.assignmentExpression(\n \"=\",\n constMemberExpression(m.fromCapture(varId), assignedKey),\n ),\n );\n // E.g. obj.rLxJs\n const memberAccess = constMemberExpression(\n m.or(m.fromCapture(varId), m.fromCapture(aliasId)),\n propertyName,\n );\n const varMatcher = m.variableDeclarator(\n varId,\n m.objectExpression(objectProperties),\n );\n // Example: { YhxvC: \"default\" }.YhxvC\n const inlineMatcher = constMemberExpression(\n m.objectExpression(objectProperties),\n propertyName,\n );\n\n function isConstantBinding(binding: Binding) {\n // Workaround because sometimes babel treats the VariableDeclarator/binding itself as a violation\n return binding.constant || binding.constantViolations[0] === binding.path;\n }\n\n function transform(path: NodePath<t.VariableDeclarator>) {\n let changes = 0;\n if (varMatcher.match(path.node)) {\n // Verify all references to make sure they match how the obfuscator\n // would have generated the code (no reassignments, etc.)\n const binding = path.scope.getBinding(varId.current!.name);\n if (!binding) return changes;\n if (!isConstantBinding(binding)) return changes;\n if (!transformObjectKeys(binding)) return changes;\n if (!isReadonlyObject(binding, memberAccess)) return changes;\n\n const props = new Map(\n objectProperties.current!.map((p) => [\n getPropName(p.key),\n p.value as t.FunctionExpression | t.StringLiteral,\n ]),\n );\n if (!props.size) return changes;\n\n const oldRefs = [...binding.referencePaths];\n\n // Have to loop backwards because we might replace a node that\n // contains another reference to the binding (https://github.com/babel/babel/issues/12943)\n [...binding.referencePaths].reverse().forEach((ref) => {\n const memberPath = ref.parentPath as NodePath<t.MemberExpression>;\n const propName = getPropName(memberPath.node.property)!;\n const value = props.get(propName);\n if (!value) {\n ref.addComment(\"leading\", \"webcrack:control_flow_missing_prop\");\n return;\n }\n\n if (t.isStringLiteral(value)) {\n memberPath.replaceWith(value);\n } else {\n inlineFunctionCall(\n value,\n memberPath.parentPath as NodePath<t.CallExpression>,\n );\n }\n changes++;\n });\n\n oldRefs.forEach((ref) => {\n const varDeclarator = findParent(ref, m.variableDeclarator());\n if (varDeclarator) changes += transform(varDeclarator);\n });\n\n path.remove();\n changes++;\n }\n return changes;\n }\n\n /**\n * When the `Transform Object Keys` option is enabled, the obfuscator generates an empty\n * object, assigns the properties later and adds an alias variable to the object.\n * This function undoes that by converting the assignments to inline object properties.\n *\n * In some forked versions of the obfuscator, some properties may be in the object\n * and others are assigned later.\n */\n function transformObjectKeys(objBinding: Binding): boolean {\n const container = objBinding.path.parentPath!.container as t.Statement[];\n const startIndex = (objBinding.path.parentPath!.key as number) + 1;\n const properties: t.ObjectProperty[] = [];\n\n for (let i = startIndex; i < container.length; i++) {\n const statement = container[i];\n\n // Example: _0x29d709[\"kHAOU\"] = \"5|1|2\" + \"|4|3|\" + \"0|6\";\n // For performance reasons, only traverse if it is a potential match (value doesn't matter)\n if (looseAssignment.match(statement)) {\n applyTransform(statement, mergeStrings);\n }\n\n if (assignment.match(statement)) {\n properties.push(\n t.objectProperty(\n t.identifier(assignedKey.current!),\n assignedValue.current!,\n ),\n );\n } else {\n break;\n }\n }\n\n // If all properties are in the object then there typically won't be an alias variable\n const aliasAssignment = container[startIndex + properties.length];\n if (!aliasVar.match(aliasAssignment)) return true;\n\n // Avoid false positives\n if (objBinding.references !== properties.length + 1) return false;\n\n const aliasBinding = objBinding.scope.getBinding(aliasId.current!.name)!;\n if (!isReadonlyObject(aliasBinding, memberAccess)) return false;\n\n objectProperties.current!.push(...properties);\n container.splice(startIndex, properties.length);\n objBinding.referencePaths = aliasBinding.referencePaths;\n objBinding.references = aliasBinding.references;\n objBinding.identifier.name = aliasBinding.identifier.name;\n aliasBinding.path.remove();\n return true;\n }\n\n return {\n VariableDeclarator: {\n exit(path) {\n this.changes += transform(path);\n },\n },\n MemberExpression: {\n exit(path) {\n if (!inlineMatcher.match(path.node)) return;\n\n const propName = getPropName(path.node.property)!;\n const value = objectProperties.current!.find(\n (prop) => getPropName(prop.key) === propName,\n )?.value as t.FunctionExpression | t.StringLiteral | undefined;\n if (!value) return;\n\n if (t.isStringLiteral(value)) {\n path.replaceWith(value);\n } else if (path.parentPath.isCallExpression()) {\n inlineFunctionCall(value, path.parentPath);\n } else {\n path.replaceWith(value);\n }\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { constMemberExpression, infiniteLoop } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"control-flow-switch\",\n tags: [\"safe\"],\n visitor() {\n const sequenceName = m.capture(m.identifier());\n const sequenceString = m.capture(\n m.matcher<string>((s) =>\n typeof s === \"string\" && /^\\d+(\\|\\d+)*$/.test(s)\n ),\n );\n const iterator = m.capture(m.identifier());\n\n const cases = m.capture(\n m.arrayOf(\n m.switchCase(\n m.stringLiteral(\n m.matcher((s) => typeof s === \"string\" && /^\\d+$/.test(s)),\n ),\n m.anyList(\n m.zeroOrMore(),\n m.or(m.continueStatement(), m.returnStatement()),\n ),\n ),\n ),\n );\n\n const matcher = m.blockStatement(\n m.anyList<t.Statement>(\n // E.g. const sequence = \"2|4|3|0|1\".split(\"|\")\n m.variableDeclaration(undefined, [\n m.variableDeclarator(\n sequenceName,\n m.callExpression(\n constMemberExpression(m.stringLiteral(sequenceString), \"split\"),\n [m.stringLiteral(\"|\")],\n ),\n ),\n ]),\n // E.g. let iterator = 0 or -0x1a70 + 0x93d + 0x275 * 0x7\n m.variableDeclaration(undefined, [m.variableDeclarator(iterator)]),\n infiniteLoop(\n m.blockStatement([\n m.switchStatement(\n // E.g. switch (sequence[iterator++]) {\n m.memberExpression(\n m.fromCapture(sequenceName),\n m.updateExpression(\"++\", m.fromCapture(iterator)),\n true,\n ),\n cases,\n ),\n m.breakStatement(),\n ]),\n ),\n m.zeroOrMore(),\n ),\n );\n\n return {\n BlockStatement: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n\n const caseStatements = new Map(\n cases.current!.map((c) => [\n (c.test as t.StringLiteral).value,\n t.isContinueStatement(c.consequent.at(-1))\n ? c.consequent.slice(0, -1)\n : c.consequent,\n ]),\n );\n\n const sequence = sequenceString.current!.split(\"|\");\n const newStatements = sequence.flatMap((s) => caseStatements.get(s)!);\n\n path.node.body.splice(0, 3, ...newStatements);\n this.changes += newStatements.length + 3;\n },\n },\n };\n },\n} satisfies Transform;\n", "import type { GeneratorOptions } from \"jsr:/@codemod/utils@^2.2.1/babel-generator\";\nimport babelGenerate from \"jsr:/@codemod/utils@^2.2.1/babel-generator\";\nimport type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\n\nconst defaultOptions: GeneratorOptions = { jsescOption: { minimal: true } };\n\nexport function generate(\n ast: t.Node,\n options: GeneratorOptions = defaultOptions,\n): string {\n return babelGenerate(ast, options).code;\n}\n\nexport function codePreview(node: t.Node): string {\n const code = generate(node, {\n minified: true,\n shouldPrintComment: () => false,\n ...defaultOptions,\n });\n if (code.length > 100) {\n return code.slice(0, 70) + \" … \" + code.slice(-30);\n }\n return code;\n}\n", "import type { Binding, NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport traverse from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { codePreview } from \"./generator.ts\";\n\nexport function renameFast(binding: Binding, newName: string): void {\n binding.referencePaths.forEach((ref) => {\n if (ref.isExportDefaultDeclaration()) return;\n if (!ref.isIdentifier()) {\n throw new Error(\n `Unexpected reference (${ref.type}): ${codePreview(ref.node)}`,\n );\n }\n\n // To avoid conflicts with other bindings of the same name\n if (ref.scope.hasBinding(newName)) ref.scope.rename(newName);\n ref.node.name = newName;\n });\n\n // Also update assignments\n const patternMatcher = m.assignmentExpression(\n \"=\",\n m.or(m.arrayPattern(), m.objectPattern()),\n );\n binding.constantViolations.forEach((ref) => {\n // To avoid conflicts with other bindings of the same name\n if (ref.scope.hasBinding(newName)) ref.scope.rename(newName);\n\n if (ref.isAssignmentExpression() && t.isIdentifier(ref.node.left)) {\n ref.node.left.name = newName;\n } else if (ref.isUpdateExpression() && t.isIdentifier(ref.node.argument)) {\n ref.node.argument.name = newName;\n } else if (\n ref.isUnaryExpression({ operator: \"delete\" }) &&\n t.isIdentifier(ref.node.argument)\n ) {\n ref.node.argument.name = newName;\n } else if (ref.isVariableDeclarator() && t.isIdentifier(ref.node.id)) {\n ref.node.id.name = newName;\n } else if (ref.isVariableDeclarator() && t.isArrayPattern(ref.node.id)) {\n const ids = ref.getBindingIdentifiers();\n for (const id in ids) {\n if (id === binding.identifier.name) {\n ids[id].name = newName;\n }\n }\n } else if (ref.isFor() || patternMatcher.match(ref.node)) {\n traverse(ref.node, {\n Identifier(path) {\n if (path.scope !== ref.scope) return path.skip();\n if (path.node.name === binding.identifier.name) {\n path.node.name = newName;\n }\n },\n noScope: true,\n });\n } else if (ref.isFunctionDeclaration() && t.isIdentifier(ref.node.id)) {\n ref.node.id.name = newName;\n } else {\n throw new Error(\n `Unexpected constant violation (${ref.type}): ${codePreview(ref.node)}`,\n );\n }\n });\n\n binding.scope.removeOwnBinding(binding.identifier.name);\n binding.scope.bindings[newName] = binding;\n binding.identifier.name = newName;\n}\n\nexport function renameParameters(\n path: NodePath<t.Function>,\n newNames: string[],\n): void {\n const params = path.node.params as t.Identifier[];\n for (let i = 0; i < Math.min(params.length, newNames.length); i++) {\n const binding = path.scope.getBinding(params[i].name)!;\n renameFast(binding, newNames[i]);\n }\n}\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { renameFast } from \"../ast-utils/rename.ts\";\n\nexport default {\n name: \"dead-code\",\n tags: [\"unsafe\"],\n scope: true,\n visitor() {\n const stringComparison = m.binaryExpression(\n m.or(\"===\", \"==\", \"!==\", \"!=\"),\n m.stringLiteral(),\n m.stringLiteral(),\n );\n const testMatcher = m.or(\n stringComparison,\n m.unaryExpression(\"!\", stringComparison),\n );\n\n return {\n \"IfStatement|ConditionalExpression\": {\n exit(_path) {\n const path = _path as NodePath<\n t.IfStatement | t.ConditionalExpression\n >;\n\n if (!testMatcher.match(path.node.test)) return;\n\n if (path.get(\"test\").evaluateTruthy()) {\n replace(path, path.get(\"consequent\"));\n } else if (path.node.alternate) {\n replace(path, path.get(\"alternate\") as NodePath);\n } else {\n path.remove();\n }\n\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n\nfunction replace(path: NodePath<t.Conditional>, replacement: NodePath) {\n if (t.isBlockStatement(replacement.node)) {\n // If statements can contain variables that shadow variables in the parent scope.\n // Since the block scope is merged with the parent scope, we need to rename those\n // variables to avoid duplicate declarations.\n const childBindings = replacement.scope.bindings;\n for (const name in childBindings) {\n const binding = childBindings[name];\n if (path.scope.hasOwnBinding(name)) {\n renameFast(binding, path.scope.generateUid(name));\n }\n binding.scope = path.scope;\n path.scope.bindings[binding.identifier.name] = binding;\n }\n path.replaceWithMultiple(replacement.node.body);\n } else {\n path.replaceWith(replacement);\n }\n}\n", "import { expression } from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport {\n anySubList,\n findParent,\n varFunctionOrDeclaration,\n} from \"../ast-utils/matcher.ts\";\nimport { inlineVariable } from \"../ast-utils/inline.ts\";\nimport { renameFast } from \"../ast-utils/rename.ts\";\nimport type { StringArray } from \"./string-array.ts\";\n\n/**\n * A function that is called with >= 1 numeric/string arguments\n * and returns a string from the string array. It may also decode\n * the string with Base64 or RC4.\n */\nexport class Decoder {\n originalName: string;\n name: string;\n path: NodePath<t.FunctionDeclaration | t.VariableDeclaration>;\n\n constructor(\n originalName: string,\n name: string,\n path: NodePath<t.FunctionDeclaration | t.VariableDeclaration>,\n ) {\n this.originalName = originalName;\n this.name = name;\n this.path = path;\n }\n\n collectCalls(): NodePath<t.CallExpression>[] {\n const calls: NodePath<t.CallExpression>[] = [];\n\n const literalArgument: m.Matcher<t.Expression> = m.or(\n m.binaryExpression(\n m.anything(),\n m.matcher((node) => literalArgument.match(node)),\n m.matcher((node) => literalArgument.match(node)),\n ),\n m.unaryExpression(\n \"-\",\n m.matcher((node) => literalArgument.match(node)),\n ),\n m.numericLiteral(),\n m.stringLiteral(),\n );\n\n const literalCall = m.callExpression(\n m.identifier(this.name),\n m.arrayOf(literalArgument),\n );\n const expressionCall = m.callExpression(\n m.identifier(this.name),\n m.arrayOf(m.anyExpression()),\n );\n\n const conditional = m.capture(m.conditionalExpression());\n const conditionalCall = m.callExpression(m.identifier(this.name), [\n conditional,\n ]);\n\n const buildExtractedConditional =\n expression`TEST ? CALLEE(CONSEQUENT) : CALLEE(ALTERNATE)`;\n\n const binding = this.path.scope.getBinding(this.name)!;\n for (const ref of binding.referencePaths) {\n if (conditionalCall.match(ref.parent)) {\n // decode(test ? 1 : 2) -> test ? decode(1) : decode(2)\n const [replacement] = ref.parentPath!.replaceWith(\n buildExtractedConditional({\n TEST: conditional.current!.test,\n CALLEE: ref.parent.callee,\n CONSEQUENT: conditional.current!.consequent,\n ALTERNATE: conditional.current!.alternate,\n }),\n );\n // some of the scope information is somehow lost after replacing\n replacement.scope.crawl();\n } else if (literalCall.match(ref.parent)) {\n calls.push(ref.parentPath as NodePath<t.CallExpression>);\n } else if (expressionCall.match(ref.parent)) {\n // var n = 1; decode(n); -> decode(1);\n ref.parentPath!.traverse({\n ReferencedIdentifier(path) {\n const varBinding = path.scope.getBinding(path.node.name)!;\n if (!varBinding) return;\n inlineVariable(varBinding, literalArgument, true);\n },\n });\n if (literalCall.match(ref.parent)) {\n calls.push(ref.parentPath as NodePath<t.CallExpression>);\n }\n } else if (ref.parentPath?.isExpressionStatement()) {\n // `decode;` may appear on it's own in some forked obfuscators\n ref.parentPath.remove();\n }\n }\n\n return calls;\n }\n}\n\nexport function findDecoders(stringArray: StringArray): Decoder[] {\n const decoders: Decoder[] = [];\n\n const functionName = m.capture(m.anyString());\n const arrayIdentifier = m.capture(m.identifier());\n const matcher = varFunctionOrDeclaration(\n m.identifier(functionName),\n m.anything(),\n m.blockStatement(\n anySubList(\n // var array = getStringArray();\n m.variableDeclaration(undefined, [\n m.variableDeclarator(\n arrayIdentifier,\n m.callExpression(m.identifier(stringArray.name)),\n ),\n ]),\n // var h = array[e]; return h;\n // or return array[e -= 254];\n m.containerOf(\n m.memberExpression(m.fromCapture(arrayIdentifier), undefined, true),\n ),\n ),\n ),\n );\n\n for (const ref of stringArray.references) {\n const decoderFn = findParent(ref, matcher);\n\n if (decoderFn) {\n const oldName = functionName.current!;\n const newName = `__DECODE_${decoders.length}__`;\n const binding = decoderFn.scope.getBinding(oldName)!;\n renameFast(binding, newName);\n decoders.push(new Decoder(oldName, newName, decoderFn));\n }\n }\n\n return decoders;\n}\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport type { AsyncTransform } from \"../ast-utils/transform.ts\";\nimport type { VMDecoder } from \"./vm.ts\";\n\n/**\n * Replaces calls to decoder functions with the decoded string.\n * E.g. `m(199)` -> `'log'`\n */\nexport default {\n name: \"inline-decoded-strings\",\n tags: [\"unsafe\"],\n scope: true,\n async run(_ast, state, options) {\n if (!options) return;\n\n const calls = options.vm.decoders.flatMap((decoder) =>\n decoder.collectCalls()\n );\n if (calls.length === 0) return;\n\n const decodedValues = await options.vm.decode(calls);\n\n for (let i = 0; i < calls.length; i++) {\n const call = calls[i];\n const value = decodedValues[i];\n\n call.replaceWith(t.valueToNode(value));\n if (typeof value !== \"string\") {\n call.addComment(\"leading\", \"webcrack:decode_error\");\n }\n }\n\n state.changes += calls.length;\n },\n} satisfies AsyncTransform<{ vm: VMDecoder }>;\n", "import type { Transform } from \"../ast-utils/transform.ts\";\nimport {\n inlineFunctionAliases,\n inlineVariableAliases,\n} from \"../ast-utils/inline.ts\";\nimport type { Decoder } from \"./decoder.ts\";\n\n/**\n * Replaces all references to `var alias = decode;` with `decode`\n */\nexport default {\n name: \"inline-decoder-wrappers\",\n tags: [\"unsafe\"],\n scope: true,\n run(_ast, state, decoder) {\n if (!decoder) return;\n const decoderBinding = decoder.path.parentPath.scope.getBinding(\n decoder.name,\n );\n if (decoderBinding) {\n state.changes += inlineVariableAliases(decoderBinding).changes;\n state.changes += inlineFunctionAliases(decoderBinding).changes; // FIXME: may be var = function(){}\n }\n },\n} satisfies Transform<Decoder>;\n", "import * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport {\n constKey,\n constMemberExpression,\n isReadonlyObject,\n} from \"../ast-utils/matcher.ts\";\nimport { getPropName } from \"../ast-utils/ast.ts\";\nimport { inlineObjectProperties } from \"../ast-utils/inline.ts\";\n\n// TODO: move do decoder.ts collectCalls to avoid traversing the whole AST\n\n/**\n * Inline objects that only have string or numeric literal properties.\n * Used by the \"String Array Calls Transform\" option for moving the\n * decode call arguments into an object.\n * Example:\n * ```js\n * const obj = {\n * c: 0x2f2,\n * d: '0x396',\n * };\n * console.log(decode(obj.c, obj.d));\n * ```\n * ->\n * ```js\n * console.log(decode(0x2f2, '0x396'));\n * ```\n */\nexport default {\n name: \"inline-object-props\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const varId = m.capture(m.identifier());\n const propertyName = m.capture(\n m.matcher<string>((name) =>\n typeof name === \"string\" && /^[\\w]+$/i.test(name)\n ),\n );\n const propertyKey = constKey(propertyName);\n // E.g. \"_0x51b74a\": 0x80\n const objectProperties = m.capture(\n m.arrayOf(\n m.objectProperty(\n propertyKey,\n m.or(m.stringLiteral(), m.numericLiteral()),\n ),\n ),\n );\n // E.g. obj._0x51b74a\n const memberAccess = constMemberExpression(\n m.fromCapture(varId),\n propertyName,\n );\n const varMatcher = m.variableDeclarator(\n varId,\n m.objectExpression(objectProperties),\n );\n // E.g. { e: 0x80 }.e\n const literalMemberAccess = constMemberExpression(\n m.objectExpression(objectProperties),\n propertyName,\n );\n\n return {\n MemberExpression(path) {\n if (!literalMemberAccess.match(path.node)) return;\n const property = objectProperties.current!.find(\n (p) => getPropName(p.key) === propertyName.current,\n );\n if (!property) return;\n path.replaceWith(property.value);\n this.changes++;\n },\n VariableDeclarator(path) {\n if (!varMatcher.match(path.node)) return;\n if (objectProperties.current!.length === 0) return;\n\n const binding = path.scope.getBinding(varId.current!.name);\n if (!binding || !isReadonlyObject(binding, memberAccess)) return;\n\n inlineObjectProperties(\n binding,\n m.objectProperty(\n propertyKey,\n m.or(m.stringLiteral(), m.numericLiteral()),\n ),\n );\n this.changes++;\n },\n };\n },\n} satisfies Transform;\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport traverse from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { inlineArrayElements } from \"../ast-utils/inline.ts\";\nimport {\n isReadonlyObject,\n undefinedMatcher,\n varFunctionOrDeclaration,\n} from \"../ast-utils/matcher.ts\";\nimport { renameFast } from \"../ast-utils/rename.ts\";\n\nexport interface StringArray {\n path: NodePath<t.FunctionDeclaration | t.VariableDeclaration>;\n references: NodePath[];\n name: string;\n originalName: string;\n length: number;\n}\n\nexport function findStringArray(ast: t.Node): StringArray | undefined {\n let result: StringArray | undefined;\n const functionName = m.capture(m.anyString());\n const arrayIdentifier = m.capture(m.identifier());\n const arrayExpression = m.capture(\n m.arrayExpression(m.arrayOf(m.or(m.stringLiteral(), undefinedMatcher))),\n );\n // getStringArray = function () { return array; };\n const functionAssignment = m.assignmentExpression(\n \"=\",\n m.identifier(m.fromCapture(functionName)),\n m.functionExpression(\n undefined,\n [],\n m.blockStatement([m.returnStatement(m.fromCapture(arrayIdentifier))]),\n ),\n );\n const variableDeclaration = m.variableDeclaration(undefined, [\n m.variableDeclarator(arrayIdentifier, arrayExpression),\n ]);\n // `function getStringArray() { ... }` or `var getStringArray = function() { ... }`\n const matcher = varFunctionOrDeclaration(\n m.identifier(functionName),\n [],\n m.or(\n // var array = [\"hello\", \"world\"];\n // return (getStringArray = function () { return array; })();\n m.blockStatement([\n variableDeclaration,\n m.returnStatement(m.callExpression(functionAssignment)),\n ]),\n // var array = [\"hello\", \"world\"];\n // getStringArray = function () { return array; });\n // return getStringArray();\n m.blockStatement([\n variableDeclaration,\n m.expressionStatement(functionAssignment),\n m.returnStatement(m.callExpression(m.identifier(functionName))),\n ]),\n ),\n );\n\n function onFunctionFound(\n path: NodePath<t.FunctionDeclaration | t.VariableDeclaration>,\n ) {\n const length = arrayExpression.current!.elements.length;\n const name = functionName.current!;\n const binding = path.scope.getBinding(name)!;\n renameFast(binding, \"__STRING_ARRAY__\");\n\n result = {\n path,\n references: binding.referencePaths,\n originalName: name,\n name: \"__STRING_ARRAY__\",\n length,\n };\n path.stop();\n }\n\n traverse(ast, {\n // Wrapped string array from later javascript-obfuscator versions\n FunctionDeclaration(path) {\n if (matcher.match(path.node)) {\n onFunctionFound(path);\n }\n },\n VariableDeclaration(path) {\n if (matcher.match(path.node)) {\n onFunctionFound(path);\n return;\n }\n\n if (variableDeclaration.match(path.node)) {\n // Simple string array inlining (only `array[0]`, `array[1]` etc references, no rotating/decoding).\n // May be used by older or different obfuscators\n const length = arrayExpression.current!.elements.length;\n const binding = path.scope.getBinding(arrayIdentifier.current!.name)!;\n const memberAccess = m.memberExpression(\n m.fromCapture(arrayIdentifier),\n m.numericLiteral(\n m.matcher((value) => typeof value === \"number\" && value < length),\n ),\n );\n if (!binding.referenced || !isReadonlyObject(binding, memberAccess)) {\n return;\n }\n\n inlineArrayElements(arrayExpression.current!, binding.referencePaths);\n path.remove();\n }\n },\n });\n\n return result;\n}\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type { CallExpression } from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport { createDebug } from \"npm:obug@^2.1.1\";\nimport { generate } from \"../ast-utils/generator.ts\";\nimport type { ArrayRotator } from \"./array-rotator.ts\";\nimport type { Decoder } from \"./decoder.ts\";\nimport type { StringArray } from \"./string-array.ts\";\n\nexport type Sandbox = (code: string) => Promise<unknown>;\n\nexport class VMDecoder {\n decoders: Decoder[];\n private setupCode: string;\n private sandbox: Sandbox;\n\n constructor(\n sandbox: Sandbox,\n stringArray: StringArray,\n decoders: Decoder[],\n rotator?: ArrayRotator,\n ) {\n this.sandbox = sandbox;\n this.decoders = decoders;\n\n // Generate as compact to bypass the self defense\n // (which tests someFunction.toString against a regex)\n const generateOptions = {\n compact: true,\n shouldPrintComment: () => false,\n };\n const stringArrayCode = generate(stringArray.path.node, generateOptions);\n const decoderCode = decoders\n .map((decoder) => generate(decoder.path.node, generateOptions))\n .join(\";\\n\");\n const rotatorCode = rotator ? generate(rotator.node, generateOptions) : \"\";\n\n this.setupCode = [stringArrayCode, decoderCode, rotatorCode].join(\";\\n\");\n }\n\n async decode(calls: NodePath<CallExpression>[]): Promise<unknown[]> {\n const code = `(() => {\n ${this.setupCode}\n return [${calls.join(\",\")}]\n })()`;\n\n try {\n const result = await this.sandbox(code);\n return result as unknown[];\n } catch (error) {\n createDebug(\"webcrack:deobfuscate\")(\"vm code:\", code);\n if (\n error instanceof Error &&\n (error.message.includes(\"undefined symbol\") ||\n error.message.includes(\"Segmentation fault\"))\n ) {\n throw new Error(\n \"isolated-vm version mismatch. Check https://webcrack.netlify.app/docs/guide/common-errors.html#isolated-vm\",\n { cause: error },\n );\n }\n throw error;\n }\n }\n}\n", "import type { Binding, NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport {\n constObjectProperty,\n findParent,\n safeLiteral,\n} from \"../ast-utils/matcher.ts\";\n\n/**\n * Merges object assignments into the object expression.\n * Example:\n * ```js\n * const obj = {};\n * obj.foo = 'bar';\n * ```\n * ->\n * ```js\n * const obj = { foo: 'bar' };\n * ```\n */\nexport default {\n name: \"merge-object-assignments\",\n tags: [\"safe\"],\n scope: true,\n visitor: () => {\n const id = m.capture(m.identifier());\n const object = m.capture(m.objectExpression([]));\n // Example: const obj = {};\n const varMatcher = m.variableDeclaration(undefined, [\n m.variableDeclarator(id, object),\n ]);\n const key = m.capture(m.anyExpression());\n const computed = m.capture<boolean>(m.anything());\n const value = m.capture(m.anyExpression());\n // Example: obj.foo = 'bar';\n const assignmentMatcher = m.expressionStatement(\n m.assignmentExpression(\n \"=\",\n m.memberExpression(m.fromCapture(id), key, computed),\n value,\n ),\n );\n\n return {\n Program(path) {\n // No idea why this is needed, crashes otherwise.\n path.scope.crawl();\n },\n VariableDeclaration: {\n exit(path) {\n if (!path.inList || !varMatcher.match(path.node)) return;\n\n const binding = path.scope.getBinding(id.current!.name)!;\n const container = path.container as t.Statement[];\n const siblingIndex = (path.key as number) + 1;\n\n while (siblingIndex < container.length) {\n const sibling = path.getSibling(siblingIndex);\n if (\n !assignmentMatcher.match(sibling.node) ||\n hasCircularReference(value.current!, binding)\n ) {\n return;\n }\n\n // { [1]: value, \"foo bar\": value } can be simplified to { 1: value, \"foo bar\": value }\n const isComputed = computed.current! &&\n key.current!.type !== \"NumericLiteral\" &&\n key.current!.type !== \"StringLiteral\";\n\n // Example: const obj = { x: 1 }; obj.foo = 'bar'; -> const obj = { x: 1, foo: 'bar' };\n object.current!.properties.push(\n t.objectProperty(key.current!, value.current!, isComputed),\n );\n\n sibling.remove();\n binding.dereference();\n binding.referencePaths.shift();\n\n // Example: const obj = { foo: 'bar' }; return obj; -> return { foo: 'bar' };\n if (\n binding.references === 1 &&\n inlineableObject.match(object.current) &&\n !isRepeatedCallReference(binding, binding.referencePaths[0])\n ) {\n binding.referencePaths[0].replaceWith(object.current);\n path.remove();\n this.changes++;\n }\n }\n },\n },\n };\n },\n} satisfies Transform;\n\n/**\n * Used to avoid \"Cannot access 'obj' before initialization\" errors.\n */\nfunction hasCircularReference(node: t.Node, binding: Binding) {\n return (\n // obj.foo = obj;\n binding.referencePaths.some((path) => path.find((p) => p.node === node)) ||\n // obj.foo = fn(); where fn could reference the binding or not, for simplicity we assume it does.\n m.containerOf(m.callExpression()).match(node)\n );\n}\n\nconst repeatedCallMatcher = m.or(\n m.forStatement(),\n m.forOfStatement(),\n m.forInStatement(),\n m.whileStatement(),\n m.doWhileStatement(),\n m.function(),\n m.objectMethod(),\n m.classBody(),\n);\n\n/**\n * Returns true when the reference can be evaluated multiple times.\n * In that case, the object should not be inlined to avoid creating multiple instances.\n * Structure: Block{ binding, Repeatable{reference} }\n */\nfunction isRepeatedCallReference(binding: Binding, reference: NodePath) {\n const block = binding.scope.getBlockParent().path;\n const repeatable = findParent(reference, repeatedCallMatcher);\n return repeatable?.isDescendant(block);\n}\n\n/**\n * Only literals, arrays and objects are allowed because variable values\n * might be different in the place the object will be inlined.\n */\nconst inlineableObject: m.Matcher<t.Expression> = m.matcher((node) =>\n m\n .or(\n safeLiteral,\n m.arrayExpression(m.arrayOf(inlineableObject)),\n m.objectExpression(m.arrayOf(constObjectProperty(inlineableObject))),\n )\n .match(node)\n);\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport {\n constMemberExpression,\n falseMatcher,\n findParent,\n iife,\n trueMatcher,\n} from \"../ast-utils/matcher.ts\";\n\n// SingleCallController: https://github.com/javascript-obfuscator/javascript-obfuscator/blob/d7f73935557b2cd15a2f7cd0b01017d9cddbd015/src/custom-code-helpers/common/templates/SingleCallControllerTemplate.ts\n\n// Works for\n// self defending: https://github.com/javascript-obfuscator/javascript-obfuscator/blob/d7f73935557b2cd15a2f7cd0b01017d9cddbd015/src/custom-code-helpers/self-defending/templates/SelfDefendingTemplate.ts\n// domain lock: https://github.com/javascript-obfuscator/javascript-obfuscator/blob/d7f73935557b2cd15a2f7cd0b01017d9cddbd015/src/custom-code-helpers/domain-lock/templates/DomainLockTemplate.ts\n// console output: https://github.com/javascript-obfuscator/javascript-obfuscator/blob/d7f73935557b2cd15a2f7cd0b01017d9cddbd015/src/custom-code-helpers/console-output/templates/ConsoleOutputDisableTemplate.ts\n// debug protection function call: https://github.com/javascript-obfuscator/javascript-obfuscator/blob/d7f73935557b2cd15a2f7cd0b01017d9cddbd015/src/custom-code-helpers/debug-protection/templates/debug-protection-function-call/DebugProtectionFunctionCallTemplate.ts\n\nexport default {\n name: \"self-defending\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const callController = m.capture(m.anyString());\n const firstCall = m.capture(m.identifier());\n const rfn = m.capture(m.identifier());\n const context = m.capture(m.identifier());\n const res = m.capture(m.identifier());\n const fn = m.capture(m.identifier());\n\n // const callControllerFunctionName = (function() { ... })();\n const matcher = m.variableDeclarator(\n m.identifier(callController),\n iife(\n [],\n m.blockStatement([\n // let firstCall = true;\n m.variableDeclaration(undefined, [\n m.variableDeclarator(firstCall, trueMatcher),\n ]),\n // return function (context, fn) {\n m.returnStatement(\n m.functionExpression(\n null,\n [context, fn],\n m.blockStatement([\n m.variableDeclaration(undefined, [\n // const rfn = firstCall ? function() {\n m.variableDeclarator(\n rfn,\n m.conditionalExpression(\n m.fromCapture(firstCall),\n m.functionExpression(\n null,\n [],\n m.blockStatement([\n // if (fn) {\n m.ifStatement(\n m.fromCapture(fn),\n m.blockStatement([\n // const res = fn.apply(context, arguments);\n m.variableDeclaration(undefined, [\n m.variableDeclarator(\n res,\n m.callExpression(\n constMemberExpression(\n m.fromCapture(fn),\n \"apply\",\n ),\n [\n m.fromCapture(context),\n m.identifier(\"arguments\"),\n ],\n ),\n ),\n ]),\n // fn = null;\n m.expressionStatement(\n m.assignmentExpression(\n \"=\",\n m.fromCapture(fn),\n m.nullLiteral(),\n ),\n ),\n // return res;\n m.returnStatement(m.fromCapture(res)),\n ]),\n ),\n ]),\n ),\n // : function() {}\n m.functionExpression(null, [], m.blockStatement([])),\n ),\n ),\n ]),\n // firstCall = false;\n m.expressionStatement(\n m.assignmentExpression(\n \"=\",\n m.fromCapture(firstCall),\n falseMatcher,\n ),\n ),\n // return rfn;\n m.returnStatement(m.fromCapture(rfn)),\n ]),\n ),\n ),\n ]),\n ),\n );\n\n const emptyIife = iife([], m.blockStatement([]));\n\n return {\n VariableDeclarator(path) {\n if (!matcher.match(path.node)) return;\n const binding = path.scope.getBinding(callController.current!);\n if (!binding) return;\n // const callControllerFunctionName = (function() { ... })();\n // ^ path/binding\n\n binding.referencePaths\n .filter((ref) => ref.parent.type === \"CallExpression\")\n .forEach((ref) => {\n if (ref.parentPath?.parent.type === \"CallExpression\") {\n // callControllerFunctionName(this, function () { ... })();\n // ^ ref\n ref.parentPath.parentPath?.remove();\n } else {\n // const selfDefendingFunctionName = callControllerFunctionName(this, function () {\n // selfDefendingFunctionName(); ^ ref\n removeSelfDefendingRefs(ref as NodePath<t.Identifier>);\n }\n\n // leftover (function () {})() from debug protection function call\n findParent(ref, emptyIife)?.remove();\n\n this.changes++;\n });\n\n path.remove();\n this.changes++;\n },\n };\n },\n} satisfies Transform;\n\nfunction removeSelfDefendingRefs(path: NodePath<t.Identifier>) {\n const varName = m.capture(m.anyString());\n const varMatcher = m.variableDeclarator(\n m.identifier(varName),\n m.callExpression(m.identifier(path.node.name)),\n );\n const callMatcher = m.expressionStatement(\n m.callExpression(m.identifier(m.fromCapture(varName)), []),\n );\n const varDecl = findParent(path, varMatcher);\n\n if (varDecl) {\n const binding = varDecl.scope.getBinding(varName.current!);\n\n binding?.referencePaths.forEach((ref) => {\n if (callMatcher.match(ref.parentPath?.parent)) {\n ref.parentPath?.parentPath?.remove();\n }\n });\n varDecl.remove();\n }\n}\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"block-statements\",\n tags: [\"safe\"],\n visitor: () => ({\n IfStatement: {\n exit(path) {\n if (\n !t.isBlockStatement(path.node.consequent) &&\n !t.isEmptyStatement(path.node.consequent)\n ) {\n path.node.consequent = t.blockStatement([path.node.consequent]);\n\n this.changes++;\n }\n if (path.node.alternate && !t.isBlockStatement(path.node.alternate)) {\n path.node.alternate = t.blockStatement([path.node.alternate]);\n this.changes++;\n }\n },\n },\n Loop: {\n exit(path) {\n if (\n !t.isBlockStatement(path.node.body) &&\n !t.isEmptyStatement(path.node.body)\n ) {\n path.node.body = t.blockStatement([path.node.body]);\n\n this.changes++;\n }\n },\n },\n ArrowFunctionExpression: {\n exit(path) {\n if (t.isSequenceExpression(path.node.body)) {\n path.node.body = t.blockStatement([\n t.returnStatement(path.node.body),\n ]);\n\n this.changes++;\n }\n },\n },\n }),\n} satisfies Transform;\n", "export * from \"npm:@babel/helper-validator-identifier@^8.0.0-rc.5\";\n", "import { isIdentifierName } from \"jsr:/@codemod/utils@^2.2.1/babel-helper-validator-identifier\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"computed-properties\",\n tags: [\"safe\"],\n visitor() {\n const stringMatcher = m.capture(\n m.stringLiteral(\n m.matcher((value) =>\n typeof value === \"string\" && isIdentifierName(value)\n ),\n ),\n );\n const propertyMatcher = m.or(\n m.memberExpression(m.anything(), stringMatcher, true),\n m.optionalMemberExpression(m.anything(), stringMatcher, true),\n );\n const keyMatcher = m.or(\n m.objectProperty(stringMatcher),\n m.classProperty(stringMatcher),\n m.objectMethod(undefined, stringMatcher),\n m.classMethod(undefined, stringMatcher),\n );\n\n return {\n \"MemberExpression|OptionalMemberExpression\": {\n exit(path) {\n if (!propertyMatcher.match(path.node)) return;\n path.node.computed = false;\n path.node.property = t.identifier(stringMatcher.current!.value);\n this.changes++;\n },\n },\n \"ObjectProperty|ClassProperty|ObjectMethod|ClassMethod\": {\n exit(path) {\n if (!keyMatcher.match(path.node)) return;\n if (\n (path.type === \"ClassMethod\" &&\n stringMatcher.current!.value === \"constructor\") ||\n (path.type === \"ObjectProperty\" &&\n stringMatcher.current!.value === \"__proto__\")\n ) {\n return;\n }\n\n path.node.computed = false;\n path.node.key = t.identifier(stringMatcher.current!.value);\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"for-to-while\",\n tags: [\"safe\"],\n visitor() {\n return {\n ForStatement: {\n exit(path) {\n const { test, body, init, update } = path.node;\n if (init || update) return;\n path.replaceWith(\n t.whileStatement(test ?? t.booleanLiteral(true), body),\n );\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"infinity\",\n tags: [\"safe\"],\n scope: true,\n visitor: () => {\n const infinityMatcher = m.binaryExpression(\n \"/\",\n m.numericLiteral(1),\n m.numericLiteral(0),\n );\n const negativeInfinityMatcher = m.binaryExpression(\n \"/\",\n m.unaryExpression(\"-\", m.numericLiteral(1)),\n m.numericLiteral(0),\n );\n\n return {\n BinaryExpression: {\n exit(path) {\n if (path.scope.hasBinding(\"Infinity\", { noGlobals: true })) return;\n\n if (infinityMatcher.match(path.node)) {\n path.replaceWith(t.identifier(\"Infinity\"));\n this.changes++;\n } else if (negativeInfinityMatcher.match(path.node)) {\n path.replaceWith(t.unaryExpression(\"-\", t.identifier(\"Infinity\")));\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\n// >, >=, <, <= are not invertible because NaN <= 0 is false and NaN > 0 is false\n// https://tc39.es/ecma262/multipage/abstract-operations.html#sec-islessthan\n\nconst INVERTED_BINARY_OPERATORS = {\n \"==\": \"!=\",\n \"===\": \"!==\",\n \"!=\": \"==\",\n \"!==\": \"===\",\n} as const;\n\nconst INVERTED_LOGICAL_OPERATORS = {\n \"||\": \"&&\",\n \"&&\": \"||\",\n} as const;\n\nexport default {\n name: \"invert-boolean-logic\",\n tags: [\"safe\"],\n visitor: () => {\n const logicalExpression = m.logicalExpression(\n m.or(\"&&\", \"||\"),\n );\n const logicalMatcher = m.unaryExpression(\"!\", logicalExpression);\n\n const binaryExpression = m.capture(\n m.binaryExpression(m.or(\"!=\", \"!==\", \"==\", \"===\")),\n );\n const binaryMatcher = m.unaryExpression(\"!\", binaryExpression);\n\n return {\n UnaryExpression: {\n exit(path) {\n const { argument } = path.node;\n\n if (binaryMatcher.match(path.node)) {\n binaryExpression.current!.operator = INVERTED_BINARY_OPERATORS[\n binaryExpression.current!\n .operator as keyof typeof INVERTED_BINARY_OPERATORS\n ];\n\n path.replaceWith(binaryExpression.current!);\n this.changes++;\n } else if (logicalMatcher.match(path.node)) {\n let current = argument;\n while (logicalExpression.match(current)) {\n current.operator = INVERTED_LOGICAL_OPERATORS[\n current.operator as keyof typeof INVERTED_LOGICAL_OPERATORS\n ];\n\n current.right = t.unaryExpression(\"!\", current.right);\n if (!logicalExpression.match(current.left)) {\n current.left = t.unaryExpression(\"!\", current.left);\n }\n current = current.left;\n }\n\n path.replaceWith(argument);\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import { parseExpression } from \"jsr:@codemod/parser@^2.1.0\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { constMemberExpression } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"json-parse\",\n tags: [\"safe\"],\n scope: true,\n visitor: () => {\n const string = m.capture(m.anyString());\n const matcher = m.callExpression(constMemberExpression(\"JSON\", \"parse\"), [\n m.stringLiteral(string),\n ]);\n\n return {\n CallExpression: {\n exit(path) {\n if (\n matcher.match(path.node) &&\n !path.scope.hasBinding(\"JSON\", { noGlobals: true })\n ) {\n try {\n JSON.parse(string.current!);\n const parsed = parseExpression(string.current!);\n path.replaceWith(parsed);\n this.changes++;\n } catch {\n // ignore\n }\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import { statement } from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"logical-to-if\",\n tags: [\"safe\"],\n visitor: () => {\n const buildIf = statement`if (TEST) { BODY; }`;\n const buildIfNot = statement`if (!TEST) { BODY; }`;\n\n return {\n ExpressionStatement: {\n exit(path) {\n const expression = path.node.expression as t.LogicalExpression;\n if (!t.isLogicalExpression(expression)) return;\n if (expression.operator === \"&&\") {\n path.replaceWith(\n buildIf({\n TEST: expression.left,\n BODY: expression.right,\n }),\n );\n this.changes++;\n } else if (expression.operator === \"||\") {\n path.replaceWith(\n buildIfNot({\n TEST: expression.left,\n BODY: expression.right,\n }),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"merge-else-if\",\n tags: [\"safe\"],\n visitor() {\n const nestedIf = m.capture(m.ifStatement());\n const matcher = m.ifStatement(\n m.anything(),\n m.anything(),\n m.blockStatement([nestedIf]),\n );\n\n return {\n IfStatement: {\n exit(path) {\n if (matcher.match(path.node)) {\n path.node.alternate = nestedIf.current;\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"number-expressions\",\n tags: [\"safe\"],\n visitor: () => ({\n \"BinaryExpression|UnaryExpression\": {\n exit(path) {\n if (!matcher.match(path.node)) return;\n const evaluated = path.evaluate();\n if (\n t.isBinaryExpression(path.node, { operator: \"/\" }) &&\n !Number.isInteger(evaluated.value)\n ) {\n return;\n }\n path.replaceWith(t.valueToNode(evaluated.value));\n path.skip();\n this.changes++;\n },\n },\n }),\n} satisfies Transform;\n\nconst matcher = m.or(\n m.unaryExpression(\"-\", m.or(m.stringLiteral(), m.numericLiteral())),\n m.binaryExpression(\n m.or(\"+\", \"-\", \"/\", \"%\", \"*\", \"**\", \"&\", \"|\", \">>\", \">>>\", \"<<\", \"^\"),\n m.or(\n m.stringLiteral(),\n m.numericLiteral(),\n m.unaryExpression(\"-\", m.numericLiteral()),\n ),\n m.or(\n m.stringLiteral(),\n m.numericLiteral(),\n m.unaryExpression(\"-\", m.numericLiteral()),\n ),\n ),\n);\n", "import type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"raw-literals\",\n tags: [\"safe\"],\n visitor: () => ({\n StringLiteral(path) {\n if (path.node.extra) {\n path.node.extra = undefined;\n this.changes++;\n }\n },\n NumericLiteral(path) {\n if (path.node.extra) {\n path.node.extra = undefined;\n this.changes++;\n }\n },\n }),\n} satisfies Transform;\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { constMemberExpression } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"remove-double-not\",\n tags: [\"safe\"],\n visitor() {\n const expression = m.capture(m.anyExpression());\n const doubleNot = m.unaryExpression(\n \"!\",\n m.unaryExpression(\"!\", expression),\n );\n const tripleNot = m.unaryExpression(\"!\", doubleNot);\n const arrayCall = m.callExpression(\n constMemberExpression(\n m.arrayExpression(),\n m.or(\n \"filter\",\n \"find\",\n \"findLast\",\n \"findIndex\",\n \"findLastIndex\",\n \"some\",\n \"every\",\n ),\n ),\n [m.arrowFunctionExpression(m.anything(), doubleNot)],\n );\n\n return {\n Conditional: {\n exit(path) {\n if (doubleNot.match(path.node.test)) {\n path.get(\"test\").replaceWith(expression.current!);\n this.changes++;\n }\n },\n },\n UnaryExpression: {\n exit(path) {\n if (tripleNot.match(path.node)) {\n path.replaceWith(t.unaryExpression(\"!\", expression.current!));\n this.changes++;\n }\n },\n },\n CallExpression: {\n exit(path) {\n if (arrayCall.match(path.node)) {\n (path.get(\"arguments.0.body\") as NodePath).replaceWith(\n expression.current!,\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { safeLiteral } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"sequence\",\n tags: [\"safe\"],\n visitor() {\n // To retain the evaluation order of `<anything> = (x(), y());`, only identifiers and member expressions are allowed.\n // `obj.foo.bar = (x(), y());` would trigger the getter for `obj.foo` before `x()` is evaluated.\n const assignmentVariable = m.or(\n m.identifier(),\n m.memberExpression(m.identifier(), m.or(m.identifier(), safeLiteral)),\n );\n const assignedSequence = m.capture(m.sequenceExpression());\n const assignmentMatcher = m.assignmentExpression(\n // \"||=\", \"&&=\", and \"??=\" have short-circuiting behavior\n m.or(\n \"=\",\n \"+=\",\n \"-=\",\n \"*=\",\n \"/=\",\n \"%=\",\n \"**=\",\n \"<<=\",\n \">>=\",\n \">>>=\",\n \"|=\",\n \"^=\",\n \"&=\",\n ),\n assignmentVariable,\n assignedSequence,\n );\n\n return {\n AssignmentExpression: {\n exit(path) {\n if (!assignmentMatcher.match(path.node)) return;\n\n const { expressions } = assignedSequence.current!;\n path.node.right = expressions.pop()!;\n const newNodes = path.parentPath.isExpressionStatement()\n ? expressions.map(t.expressionStatement)\n : expressions;\n path.insertBefore(newNodes);\n this.changes++;\n },\n },\n ExpressionStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.expression)) return;\n\n const statements = path.node.expression.expressions.map(\n t.expressionStatement,\n );\n path.replaceWithMultiple(statements);\n this.changes++;\n },\n },\n ReturnStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.argument)) return;\n\n const { expressions } = path.node.argument;\n path.node.argument = expressions.pop();\n const statements = expressions.map(t.expressionStatement);\n path.insertBefore(statements);\n this.changes++;\n },\n },\n IfStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.test)) return;\n\n const { expressions } = path.node.test;\n path.node.test = expressions.pop()!;\n const statements = expressions.map(t.expressionStatement);\n path.insertBefore(statements);\n this.changes++;\n },\n },\n SwitchStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.discriminant)) return;\n\n const { expressions } = path.node.discriminant;\n path.node.discriminant = expressions.pop()!;\n const statements = expressions.map(t.expressionStatement);\n path.insertBefore(statements);\n this.changes++;\n },\n },\n ThrowStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.argument)) return;\n\n const { expressions } = path.node.argument;\n path.node.argument = expressions.pop()!;\n const statements = expressions.map(t.expressionStatement);\n path.insertBefore(statements);\n this.changes++;\n },\n },\n ForInStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.right)) return;\n\n const { expressions } = path.node.right;\n path.node.right = expressions.pop()!;\n const statements = expressions.map(t.expressionStatement);\n path.insertBefore(statements);\n this.changes++;\n },\n },\n ForOfStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.right)) return;\n\n const { expressions } = path.node.right;\n path.node.right = expressions.pop()!;\n const statements = expressions.map(t.expressionStatement);\n path.insertBefore(statements);\n this.changes++;\n },\n },\n ForStatement: {\n exit(path) {\n if (t.isSequenceExpression(path.node.init)) {\n const statements = path.node.init.expressions.map(\n t.expressionStatement,\n );\n path.node.init = null;\n path.insertBefore(statements);\n this.changes++;\n }\n if (\n t.isSequenceExpression(path.node.update) &&\n path.node.body.type === \"EmptyStatement\"\n ) {\n const { expressions } = path.node.update;\n path.node.update = expressions.pop()!;\n const statements = expressions.map(t.expressionStatement);\n path.node.body = t.blockStatement(statements);\n this.changes++;\n }\n },\n },\n VariableDeclaration: {\n exit(path) {\n const sequence = m.capture(m.sequenceExpression());\n const matcher = m.variableDeclaration(undefined, [\n m.variableDeclarator(undefined, sequence),\n ]);\n if (!matcher.match(path.node)) return;\n\n const { expressions } = sequence.current!;\n path.node.declarations[0].init = expressions.pop();\n const statements = expressions.map(t.expressionStatement);\n path.getStatementParent()?.insertBefore(statements);\n this.changes++;\n },\n },\n SequenceExpression: {\n exit(path) {\n const { expressions } = path.node;\n if (expressions.every((node) => safeLiteral.match(node))) {\n path.replaceWith(expressions.at(-1)!);\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nconst matcher = m.forStatement(\n m.variableDeclaration(\"var\", m.arrayOf(m.variableDeclarator(m.identifier()))),\n);\n\n// This contains some overlapping logic with the \"split-variable-declarations\" transform\n// but is done separately because it also works with a single variable and we want to avoid\n// accessing scope in the prepare stage for performance reasons.\nexport default {\n name: \"split-for-loop-vars\",\n tags: [\"safe\"],\n scope: true,\n visitor: () => ({\n ForStatement: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n const { init, test, update } = path.node;\n const { declarations } = init as t.VariableDeclaration;\n\n for (let i = 0; i < declarations.length; i++) {\n const declarator = declarations[i];\n const binding = path.scope.getBinding(\n (declarator.id as t.Identifier).name,\n );\n if (!binding) break;\n\n const isUsedInTestOrUpdate =\n binding.constantViolations.some((reference) =>\n reference.find((p) => p.node === test || p.node === update)\n ) ||\n binding.referencePaths.some((reference) =>\n reference.find((p) => p.node === test || p.node === update)\n );\n if (isUsedInTestOrUpdate) break;\n\n const [replacement] = path.insertBefore(\n t.variableDeclaration(\"var\", [declarator]),\n );\n binding.path = replacement.get(\"declarations.0\");\n declarations.shift();\n i--;\n this.changes++;\n }\n\n if (declarations.length === 0) path.get(\"init\").remove();\n },\n },\n }),\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"split-variable-declarations\",\n tags: [\"safe\"],\n visitor: () => ({\n VariableDeclaration: {\n exit(path) {\n if (path.node.declarations.length > 1) {\n // E.g. for (var i = 0, j = 1;;)\n if (path.key === \"init\" && path.parentPath.isForStatement()) {\n if (\n !path.parentPath.node.test &&\n !path.parentPath.node.update &&\n path.node.kind === \"var\"\n ) {\n path.parentPath.insertBefore(\n path.node.declarations.map((declaration) =>\n t.variableDeclaration(path.node.kind, [declaration])\n ),\n );\n path.remove();\n this.changes++;\n }\n } else {\n if (path.parentPath.isExportNamedDeclaration()) {\n path.parentPath.replaceWithMultiple(\n path.node.declarations.map((declaration) =>\n t.exportNamedDeclaration(\n t.variableDeclaration(path.node.kind, [declaration]),\n )\n ),\n );\n } else {\n path.replaceWithMultiple(\n path.node.declarations.map((declaration) =>\n t.variableDeclaration(path.node.kind, [declaration])\n ),\n );\n }\n this.changes++;\n }\n }\n },\n },\n }),\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"string-literal-in-template-literal\",\n tags: [\"safe\"],\n visitor: () => ({\n TemplateLiteral(path) {\n // inline string literals in template literals\n // e.g. `Hello ${'World'}!` -> `Hello World!`\n for (let i = 0; i < path.node.expressions.length; i++) {\n const expr = path.node.expressions[i];\n if (t.isStringLiteral(expr)) {\n path.node.expressions.splice(i, 1);\n const main = path.node.quasis[i];\n main.value.raw += expr.value;\n\n const next = path.node.quasis[i + 1];\n if (next) {\n main.value.raw += next.value.raw;\n path.node.quasis.splice(i + 1, 1);\n }\n\n this.changes++;\n i--;\n }\n }\n },\n }),\n} satisfies Transform;\n", "import { statement } from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"ternary-to-if\",\n tags: [\"safe\"],\n visitor() {\n const test = m.capture(m.anyExpression());\n const consequent = m.capture(m.anyExpression());\n const alternate = m.capture(m.anyExpression());\n const conditional = m.conditionalExpression(test, consequent, alternate);\n\n const buildIf = statement`if (TEST) { CONSEQUENT; } else { ALTERNATE; }`;\n const buildIfReturn =\n statement`if (TEST) { return CONSEQUENT; } else { return ALTERNATE; }`;\n\n return {\n ExpressionStatement: {\n exit(path) {\n if (conditional.match(path.node.expression)) {\n path.replaceWith(\n buildIf({\n TEST: test.current,\n CONSEQUENT: consequent.current,\n ALTERNATE: alternate.current,\n }),\n );\n this.changes++;\n }\n },\n },\n ReturnStatement: {\n exit(path) {\n if (conditional.match(path.node.argument)) {\n path.replaceWith(\n buildIfReturn({\n TEST: test.current,\n CONSEQUENT: consequent.current,\n ALTERNATE: alternate.current,\n }),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"truncate-number-literal\",\n tags: [\"safe\"],\n visitor: () => {\n const binaryOperators: m.Matcher<\"|\" | \"&\" | \"^\" | \"<<\" | \">>\" | \">>>\"> = m\n .or(\"|\", \"&\", \"^\", \"<<\", \">>\", \">>>\");\n const literal = m.capture(m.numericLiteral());\n const matcher = m.or(\n m.binaryExpression(binaryOperators, literal, m.anything()),\n m.binaryExpression(binaryOperators, m.anything(), literal),\n );\n\n return {\n BinaryExpression: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n\n const value = literal.current!.value;\n\n const isShifter = literal.current! === path.node.right &&\n (path.node.operator === \"<<\" || path.node.operator === \">>\");\n const truncation = isShifter ? 31 : 0xffffffff;\n const truncated = value & truncation;\n\n if (truncated === value) return;\n\n literal.current!.value = truncated;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nconst OPERATOR_MAP = {\n \">\": \"===\",\n \"<\": \"!==\",\n} as const;\n\nexport default {\n name: \"typeof-undefined\",\n tags: [\"safe\"],\n visitor() {\n const operator = m.capture(m.or(\">\" as const, \"<\" as const));\n const argument = m.capture(m.anyExpression());\n const matcher = m.binaryExpression(\n operator,\n m.unaryExpression(\"typeof\", argument),\n m.stringLiteral(\"u\"),\n );\n return {\n BinaryExpression: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n path.replaceWith(\n t.binaryExpression(\n OPERATOR_MAP[operator.current!],\n t.unaryExpression(\"typeof\", argument.current!),\n t.stringLiteral(\"undefined\"),\n ),\n );\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"unary-expressions\",\n tags: [\"safe\"],\n visitor() {\n const argument = m.capture(m.anyExpression());\n const matcher = m.expressionStatement(\n m.unaryExpression(m.or(\"void\", \"!\", \"typeof\"), argument),\n );\n const returnVoid = m.returnStatement(m.unaryExpression(\"void\", argument));\n return {\n ExpressionStatement: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n path.replaceWith(argument.current!);\n this.changes++;\n },\n },\n ReturnStatement: {\n exit(path) {\n if (!returnVoid.match(path.node)) return;\n path.replaceWith(argument.current!);\n path.insertAfter(t.returnStatement());\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"unminify-booleans\",\n tags: [\"safe\"],\n visitor: () => ({\n UnaryExpression(path) {\n if (trueMatcher.match(path.node)) {\n path.replaceWith(t.booleanLiteral(true));\n this.changes++;\n } else if (falseMatcher.match(path.node)) {\n path.replaceWith(t.booleanLiteral(false));\n this.changes++;\n }\n },\n }),\n} satisfies Transform;\n\nconst trueMatcher = m.or(\n m.unaryExpression(\"!\", m.numericLiteral(0)),\n m.unaryExpression(\"!\", m.unaryExpression(\"!\", m.numericLiteral(1))),\n m.unaryExpression(\"!\", m.unaryExpression(\"!\", m.arrayExpression([]))),\n);\n\nconst falseMatcher = m.or(\n m.unaryExpression(\"!\", m.numericLiteral(1)),\n m.unaryExpression(\"!\", m.arrayExpression([])),\n);\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"void-to-undefined\",\n tags: [\"safe\"],\n scope: true,\n visitor: () => {\n const matcher = m.unaryExpression(\"void\", m.numericLiteral(0));\n return {\n UnaryExpression: {\n exit(path) {\n if (\n matcher.match(path.node) &&\n !path.scope.hasBinding(\"undefined\", { noGlobals: true })\n ) {\n path.replaceWith(t.identifier(\"undefined\"));\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\n// https://eslint.org/docs/latest/rules/yoda and https://babeljs.io/docs/en/babel-plugin-minify-flip-comparisons\n\nconst FLIPPED_OPERATORS = {\n \"==\": \"==\",\n \"===\": \"===\",\n \"!=\": \"!=\",\n \"!==\": \"!==\",\n \">\": \"<\",\n \"<\": \">\",\n \">=\": \"<=\",\n \"<=\": \">=\",\n \"*\": \"*\",\n \"^\": \"^\",\n \"&\": \"&\",\n \"|\": \"|\",\n} as const;\n\nexport default {\n name: \"yoda\",\n tags: [\"safe\"],\n visitor: () => {\n const pureValue = m.or(\n m.stringLiteral(),\n m.numericLiteral(),\n m.unaryExpression(\n \"-\",\n m.or(m.numericLiteral(), m.identifier(\"Infinity\")),\n ),\n m.booleanLiteral(),\n m.nullLiteral(),\n m.identifier(\"undefined\"),\n m.identifier(\"NaN\"),\n m.identifier(\"Infinity\"),\n );\n const matcher = m.binaryExpression(\n m.or(\n \"==\",\n \"===\",\n \"!=\",\n \"!==\",\n \"<\",\n \">\",\n \"<=\",\n \">=\",\n \"*\",\n \"^\",\n \"&\",\n \"|\",\n ),\n pureValue,\n m.matcher((node) => !pureValue.match(node)),\n );\n\n return {\n BinaryExpression: {\n exit(path) {\n if (matcher.match(path.node)) {\n path.replaceWith(\n t.binaryExpression(\n FLIPPED_OPERATORS[\n path.node.operator as keyof typeof FLIPPED_OPERATORS\n ],\n path.node.right,\n path.node.left as t.Expression,\n ),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import { mergeTransforms } from \"../ast-utils/transform.ts\";\nimport blockStatements from \"./block-statements.ts\";\nimport computedProperties from \"./computed-properties.ts\";\nimport forToWhile from \"./for-to-while.ts\";\nimport infinity from \"./infinity.ts\";\nimport invertBooleanLogic from \"./invert-boolean-logic.ts\";\nimport jsonParse from \"./json-parse.ts\";\nimport logicalToIf from \"./logical-to-if.ts\";\nimport mergeElseIf from \"./merge-else-if.ts\";\nimport mergeStrings from \"./merge-strings.ts\";\nimport numberExpressions from \"./number-expressions.ts\";\nimport rawLiterals from \"./raw-literals.ts\";\nimport removeDoubleNot from \"./remove-double-not.ts\";\nimport sequence from \"./sequence.ts\";\nimport splitForLoopVars from \"./split-for-loop-vars.ts\";\nimport splitVariableDeclarations from \"./split-variable-declarations.ts\";\nimport stringLiteralInTemplate from \"./string-literal-in-template.ts\";\nimport ternaryToIf from \"./ternary-to-if.ts\";\nimport truncateNumberLiteral from \"./truncate-number-literal.ts\";\nimport typeofUndefined from \"./typeof-undefined.ts\";\nimport unaryExpressions from \"./unary-expressions.ts\";\nimport unminifyBooleans from \"./unminify-booleans.ts\";\nimport voidToUndefined from \"./void-to-undefined.ts\";\nimport yoda from \"./yoda.ts\";\n\nexport default mergeTransforms({\n name: \"unminify\",\n tags: [\"safe\"],\n transforms: [\n blockStatements,\n computedProperties,\n forToWhile,\n infinity,\n invertBooleanLogic,\n jsonParse,\n logicalToIf,\n mergeElseIf,\n mergeStrings,\n numberExpressions,\n rawLiterals,\n removeDoubleNot,\n sequence,\n splitForLoopVars,\n splitVariableDeclarations,\n stringLiteralInTemplate,\n ternaryToIf,\n truncateNumberLiteral,\n typeofUndefined,\n unaryExpressions,\n unminifyBooleans,\n voidToUndefined,\n yoda,\n ],\n});\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nconst FUNCTIONS = {\n atob,\n unescape,\n decodeURI,\n decodeURIComponent,\n} as const;\n\nexport default {\n name: \"evaluate-globals\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const name: m.CapturedMatcher<keyof typeof FUNCTIONS> = m.capture(\n m.or(\"atob\", \"unescape\", \"decodeURI\", \"decodeURIComponent\"),\n );\n const arg = m.capture(m.anyString());\n const matcher = m.callExpression(m.identifier(name), [\n m.stringLiteral(arg),\n ]);\n\n return {\n CallExpression: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n if (path.scope.hasBinding(name.current!, { noGlobals: true })) return;\n\n try {\n // Causes a \"TypeError: Illegal invocation\" without the globalThis receiver\n const value = FUNCTIONS[name.current!].call(\n globalThis,\n arg.current!,\n );\n path.replaceWith(t.stringLiteral(value));\n this.changes++;\n } catch {\n // ignore\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport delance from \"./delance/mod.ts\";\nimport esmodule from \"./esmodule/mod.ts\";\nimport webcrack from \"./webcrack.ts\";\n\nexport default async function transform(ast: t.Node): Promise<t.Node> {\n await webcrack(ast);\n esmodule(ast);\n await delance(ast);\n return ast;\n}\n", "import { generate, parse } from \"./utils/ast.ts\";\nimport transform from \"./transform/mod.ts\";\n\nexport default async function (code: string): Promise<string> {\n return generate(await transform(parse(code)));\n}\n\nexport { transform };\n", "#!/usr/bin/env deno\n\nimport { pooledMap } from \"@std/async\";\nimport { assertEquals } from \"@std/assert\";\nimport * as path from \"@std/path\";\nimport { mkdir } from \"@std/fs/unstable-mkdir\";\nimport { stat } from \"@std/fs/unstable-stat\";\nimport { writeFile } from \"@std/fs/unstable-write-file\";\nimport { writeTextFile } from \"@std/fs/unstable-write-text-file\";\nimport delance from \"@delance/builder\";\nimport {\n BlobReader,\n TextWriter,\n Uint8ArrayWriter,\n ZipReader,\n} from \"@zip.js/zip.js\";\n\nimport { getPkg, pkg } from \"./utils.mts\";\n\nconst output = new URL(\n `dist/v${pkg.version}-${pkg.delance.sha256}/`,\n import.meta.url,\n);\nassertEquals(\n output.protocol,\n \"file:\",\n \"delance only supports running from local filesystem\",\n);\n\nawait mkdir(output, { recursive: true });\n\nlet processed = true;\ntry {\n await stat(new URL(\"server.bundle.js\", output));\n} catch {\n processed = false;\n}\n\nif (!processed) {\n const zip: ZipReader<BlobReader> = new ZipReader(\n new BlobReader(await getPkg()),\n );\n\n const prefix = path.normalize(\"extension/dist/\");\n\n for await (\n const _ of pooledMap(4, zip.getEntriesGenerator(), async (entry) => {\n const filename = path.normalize(entry.filename);\n if (!filename.startsWith(prefix)) {\n return;\n }\n\n console.time(filename);\n const dest = filename.slice(prefix.length);\n\n if (entry.directory) {\n await mkdir(new URL(dest, output), { recursive: true });\n return;\n }\n\n if (dest.endsWith(\".bundle.js\")) {\n if (dest.startsWith(\"browser.\")) {\n return;\n }\n const writer = new TextWriter();\n await entry.getData(writer);\n\n const script = await delance(await writer.getData());\n await mkdir(new URL(path.dirname(dest), output), {\n recursive: true,\n });\n\n await writeTextFile(new URL(dest, output), script);\n } else {\n const writer = new Uint8ArrayWriter();\n await entry.getData(writer);\n await mkdir(new URL(path.dirname(dest), output), {\n recursive: true,\n });\n\n await mkdir(new URL(path.dirname(dest), output), {\n recursive: true,\n });\n await writeFile(new URL(dest, output), await writer.getData());\n }\n\n console.timeEnd(filename);\n })\n );\n}\n\nawait writeTextFile(\n new URL(\"dist/langserver.cjs\", import.meta.url),\n `#!/usr/bin/env node\n\nrequire('./v${pkg.version}-${pkg.delance.sha256}/server.bundle.js');`,\n);\n", "import process from \"node:process\";\nimport { readFile } from \"@std/fs/unstable-read-file\";\nimport { retry } from \"@std/async\";\nimport { assertEquals } from \"@std/assert\";\nimport { encodeHex } from \"@std/encoding\";\n\nimport pkg from \"./deno.json\" with { type: \"json\" };\n\nconst reverse = (string: string) => [...string].reverse().join(\"\");\n\nconst BASE_URL = new URL(reverse(\"/moc.oidutslausiv.ecalptekram//:sptth\"));\nconst PUBLISHER = reverse(\"nohtyp-sm\");\nconst EXTENSION = reverse(\"ecnalyp-edocsv\");\n\nconst ITEMS = new URL(`/items?itemName=${PUBLISHER}.${EXTENSION}`, BASE_URL);\n\nconst INIT: RequestInit = {\n headers: {\n \"user-agent\": \"Mozilla/5.0 (Delance) Gecko/20100101 Firefox/120.0\",\n },\n credentials: \"include\",\n};\n\nclass HttpError extends Error {\n status: number;\n constructor(response: Response) {\n super(response.statusText);\n this.status = response.status;\n }\n}\n\nexport async function sha256(blob: Blob) {\n return encodeHex(\n new Uint8Array(\n await crypto.subtle.digest(\"SHA-256\", await blob.arrayBuffer()),\n ),\n );\n}\n\nconst pkgVersion = pkg.version.split(\"-\")[0];\n\nexport async function getPkg({ check = true, version = pkgVersion } = {}) {\n const PACKAGE = new URL(\n `/_apis/public/gallery/publishers/${PUBLISHER}/vsextensions/${EXTENSION}/${version}/vspackage`,\n BASE_URL,\n );\n\n let vsix: Blob | null = null;\n\n if (process.env.DELANCE_VSIX) {\n try {\n vsix = new Blob([\n new Uint8Array(await readFile(process.env.DELANCE_VSIX)),\n ]);\n if (check) {\n assertEquals(\n await sha256(vsix),\n pkg.delance.sha256,\n \"sha256 mismatch\",\n );\n }\n } catch (e) {\n if (\n e instanceof Error && \"syscall\" in e && e.syscall === \"open\"\n ) {\n console.error(e);\n } else {\n throw e;\n }\n }\n }\n\n if (!vsix) {\n const { headers } = await fetch(ITEMS, INIT);\n const cookie = headers\n .getSetCookie()\n .map((c) => c.split(\";\", 2)[0])\n .join(\"; \");\n\n vsix = await retry(async () => {\n const response = await fetch(PACKAGE, {\n headers: {\n cookie,\n },\n redirect: \"follow\",\n referrer: ITEMS.href,\n });\n\n if (!response.ok) {\n throw new HttpError(response);\n }\n\n const blob = await response.blob();\n\n if (check) {\n assertEquals(\n await sha256(blob),\n pkg.delance.sha256,\n \"sha256 mismatch\",\n );\n }\n\n return blob;\n }, {\n isRetriable(err) {\n return err instanceof HttpError &&\n (err.status === 429 || err.status >= 500);\n },\n });\n }\n\n return vsix;\n}\n\nexport { pkg };\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport { getNodeFs, isDeno } from \"./_utils.ts\";\nimport type { ReadFileOptions } from \"./unstable_types.ts\";\nimport { mapError } from \"./_map_error.ts\";\n\n/**\n * Reads and resolves to the entire contents of a file as an array of bytes.\n * `TextDecoder` can be used to transform the bytes to string if required.\n *\n * Requires `allow-read` permission.\n *\n * @example Usage\n * ```ts no-assert\n * import { readFile } from \"@std/fs/unstable-read-file\";\n * const decoder = new TextDecoder(\"utf-8\");\n * const data = await readFile(\"README.md\");\n * console.log(decoder.decode(data));\n * ```\n *\n * @tags allow-read\n *\n * @param path The path to the file.\n * @param options Options when reading a file. See {@linkcode ReadFileOptions}.\n * @returns A promise that resolves to a `Uint8Array` of the file contents.\n */\nexport async function readFile(\n path: string | URL,\n options?: ReadFileOptions,\n): Promise<Uint8Array> {\n if (isDeno) {\n return Deno.readFile(path, { ...options });\n } else {\n const { signal } = options ?? {};\n try {\n const buf = await getNodeFs().promises.readFile(path, { signal });\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n\n/**\n * Synchronously reads and returns the entire contents of a file as an array\n * of bytes. `TextDecoder` can be used to transform the bytes to string if\n * required.\n *\n * Requires `allow-read` permission.\n *\n * @example Usage\n * ```ts no-assert\n * import { readFileSync } from \"@std/fs/unstable-read-file\";\n * const decoder = new TextDecoder(\"utf-8\");\n * const data = readFileSync(\"README.md\");\n * console.log(decoder.decode(data));\n * ```\n *\n * @tags allow-read\n *\n * @param path The path to the file.\n * @returns A `Uint8Array` of bytes representing the file contents.\n */\nexport function readFileSync(path: string | URL): Uint8Array {\n if (isDeno) {\n return Deno.readFileSync(path);\n } else {\n try {\n const buf = getNodeFs().readFileSync(path);\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["https://jsr.io/@std/assert/1.0.19/assertion_error.ts", "https://jsr.io/@std/assert/1.0.19/almost_equals.ts", "https://jsr.io/@std/assert/1.0.19/equal.ts", "https://jsr.io/@std/internal/1.0.14/format.ts", "https://jsr.io/@std/assert/1.0.19/array_includes.ts", "https://jsr.io/@std/internal/1.0.14/styles.ts", "https://jsr.io/@std/internal/1.0.14/build_message.ts", "https://jsr.io/@std/internal/1.0.14/diff.ts", "https://jsr.io/@std/internal/1.0.14/diff_str.ts", "https://jsr.io/@std/assert/1.0.19/equals.ts", "https://jsr.io/@std/assert/1.0.19/exists.ts", "https://jsr.io/@std/assert/1.0.19/false.ts", "https://jsr.io/@std/assert/1.0.19/greater_or_equal.ts", "https://jsr.io/@std/assert/1.0.19/greater.ts", "https://jsr.io/@std/assert/1.0.19/instance_of.ts", "https://jsr.io/@std/assert/1.0.19/is_error.ts", "https://jsr.io/@std/assert/1.0.19/less_or_equal.ts", "https://jsr.io/@std/assert/1.0.19/less.ts", "https://jsr.io/@std/assert/1.0.19/match.ts", "https://jsr.io/@std/assert/1.0.19/not_equals.ts", "https://jsr.io/@std/assert/1.0.19/not_instance_of.ts", "https://jsr.io/@std/assert/1.0.19/not_match.ts", "https://jsr.io/@std/assert/1.0.19/not_strict_equals.ts", "https://jsr.io/@std/assert/1.0.19/object_match.ts", "https://jsr.io/@std/assert/1.0.19/rejects.ts", "https://jsr.io/@std/assert/1.0.19/strict_equals.ts", "https://jsr.io/@std/assert/1.0.19/string_includes.ts", "https://jsr.io/@std/assert/1.0.19/throws.ts", "https://jsr.io/@std/assert/1.0.19/assert.ts", "https://jsr.io/@std/assert/1.0.19/fail.ts", "https://jsr.io/@std/assert/1.0.19/unimplemented.ts", "https://jsr.io/@std/assert/1.0.19/unreachable.ts", "https://jsr.io/@std/assert/1.0.19/mod.ts", "https://jsr.io/@std/encoding/1.0.10/_validate_binary_like.ts", "https://jsr.io/@std/encoding/1.0.10/ascii85.ts", "https://jsr.io/@std/encoding/1.0.10/_common32.ts", "https://jsr.io/@std/encoding/1.0.10/_common_detach.ts", "https://jsr.io/@std/encoding/1.0.10/base32.ts", "https://jsr.io/@std/encoding/1.0.10/base58.ts", "https://jsr.io/@std/encoding/1.0.10/_common64.ts", "https://jsr.io/@std/encoding/1.0.10/base64.ts", "https://jsr.io/@std/encoding/1.0.10/base64url.ts", "https://jsr.io/@std/encoding/1.0.10/_common16.ts", "https://jsr.io/@std/encoding/1.0.10/hex.ts", "https://jsr.io/@std/encoding/1.0.10/varint.ts", "https://jsr.io/@std/encoding/1.0.10/mod.ts", "https://jsr.io/@codemod/utils/2.2.1/export/babel-generator.ts", "https://jsr.io/@codemod/utils/2.2.1/export/babel-traverse.ts", "https://jsr.io/@codemod/parser/2.1.0/lib/options.ts", "https://jsr.io/@codemod/parser/2.1.0/mod.ts", "https://jsr.io/@delance/builder/0.4.1/utils/ast.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/ast-utils/transform.ts", "https://jsr.io/@codemod/utils/2.2.1/export/babel-types.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/Matcher.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anyExpression.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/utils/distributeAcrossSlices.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anything.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/slice.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anyList.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anyNode.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anyNumber.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anyStatement.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/anyString.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/arrayOf.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/capture.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/containerOf.ts", "https://jsr.io/@codemod/utils/2.2.1/lib/builders.ts", "https://jsr.io/@codemod/utils/2.2.1/lib/NodeTypes.ts", "https://jsr.io/@codemod/utils/2.2.1/lib/js.ts", "https://jsr.io/@codemod/utils/2.2.1/lib/nodesEquivalent.ts", "https://jsr.io/@codemod/utils/2.2.1/mod.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/fromCapture.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/tupleOf.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/function.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/generated.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/oneOf.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/or.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/predicate.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/matchers/mod.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/utils/match.ts", "https://jsr.io/@codemod/matchers/2.0.2/lib/utils/matchPath.ts", "https://jsr.io/@codemod/matchers/2.0.2/mod.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/ast-utils/matcher.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/transpile/default-parameters.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/transpile/logical-assignments.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/transpile/nullish-coalescing-assignment.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/transpile/nullish-coalescing.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/transpile/optional-chaining.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/transpile/template-literals.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/transpile/mod.ts", "https://jsr.io/@codemod/utils/2.2.1/export/babel-template.ts", "https://jsr.io/@delance/builder/0.4.1/utils/matchers/chunk.ts", "https://jsr.io/@delance/builder/0.4.1/transform/delance/antifeature.ts", "https://jsr.io/@delance/builder/0.4.1/utils/crypto.ts", "https://jsr.io/@delance/builder/0.4.1/transform/delance/stringaes.ts", "https://jsr.io/@delance/builder/0.4.1/transform/delance/mod.ts", "https://jsr.io/@delance/builder/0.4.1/transform/esmodule/indirect-call.ts", "https://jsr.io/@delance/builder/0.4.1/utils/matchers/createBinding.ts", "https://jsr.io/@delance/builder/0.4.1/utils/matchers/exportStar.ts", "https://jsr.io/@delance/builder/0.4.1/utils/matchers/importDefault.ts", "https://jsr.io/@delance/builder/0.4.1/utils/matchers/importStar.ts", "https://jsr.io/@delance/builder/0.4.1/utils/matchers/setModuleDefault.ts", "https://jsr.io/@delance/builder/0.4.1/transform/esmodule/module-helper.ts", "https://jsr.io/@delance/builder/0.4.1/transform/esmodule/mod.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/merge-strings.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/array-rotator.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/ast-utils/ast.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/ast-utils/inline.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/control-flow-object.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/control-flow-switch.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/ast-utils/generator.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/ast-utils/rename.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/dead-code.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/decoder.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/inline-decoded-strings.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/inline-decoder-wrappers.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/inline-object-props.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/string-array.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/vm.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/mod.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/merge-object-assignments.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/self-defending.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/block-statements.ts", "https://jsr.io/@codemod/utils/2.2.1/export/babel-helper-validator-identifier.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/computed-properties.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/for-to-while.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/infinity.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/invert-boolean-logic.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/json-parse.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/logical-to-if.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/merge-else-if.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/number-expressions.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/raw-literals.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/remove-double-not.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/sequence.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/split-for-loop-vars.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/split-variable-declarations.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/string-literal-in-template.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/ternary-to-if.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/truncate-number-literal.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/typeof-undefined.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/unary-expressions.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/unminify-booleans.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/void-to-undefined.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/yoda.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/unminify/mod.ts", "https://jsr.io/@delance/builder/0.4.1/webcrack/deobfuscate/evaluate-globals.ts", "https://jsr.io/@delance/builder/0.4.1/transform/webcrack.ts", "https://jsr.io/@delance/builder/0.4.1/transform/mod.ts", "https://jsr.io/@delance/builder/0.4.1/mod.ts", "https://jsr.io/@std/async/1.4.0/delay.ts", "https://jsr.io/@std/async/1.4.0/mux_async_iterator.ts", "https://jsr.io/@std/async/1.4.0/pool.ts", "https://jsr.io/@std/async/1.4.0/_util.ts", "https://jsr.io/@std/async/1.4.0/retry.ts", "https://jsr.io/@std/internal/1.0.14/_os.ts", "https://jsr.io/@std/internal/1.0.14/os.ts", "https://jsr.io/@std/path/1.1.5/_common/assert_path.ts", "https://jsr.io/@std/path/1.1.5/_common/from_file_url.ts", "https://jsr.io/@std/path/1.1.5/posix/from_file_url.ts", "https://jsr.io/@std/path/1.1.5/_common/strip_trailing_separators.ts", "https://jsr.io/@std/path/1.1.5/posix/_util.ts", "https://jsr.io/@std/path/1.1.5/windows/_util.ts", "https://jsr.io/@std/path/1.1.5/windows/from_file_url.ts", "https://jsr.io/@std/path/1.1.5/_common/dirname.ts", "https://jsr.io/@std/path/1.1.5/posix/dirname.ts", "https://jsr.io/@std/path/1.1.5/windows/dirname.ts", "https://jsr.io/@std/path/1.1.5/dirname.ts", "https://jsr.io/@std/path/1.1.5/_common/normalize.ts", "https://jsr.io/@std/path/1.1.5/_common/normalize_string.ts", "https://jsr.io/@std/path/1.1.5/posix/normalize.ts", "https://jsr.io/@std/path/1.1.5/windows/normalize.ts", "https://jsr.io/@std/path/1.1.5/normalize.ts", "https://jsr.io/@std/fs/1.0.24/_utils.ts", "https:https://jsr.io/@std/fs/1.0.24/unstable_errors.js", "https://jsr.io/@std/fs/1.0.24/_map_error.ts", "https://jsr.io/@std/fs/1.0.24/unstable_mkdir.ts", "https://jsr.io/@std/fs/1.0.24/_to_file_info.ts", "https://jsr.io/@std/fs/1.0.24/unstable_stat.ts", "https://jsr.io/@std/fs/1.0.24/_get_fs_flag.ts", "https://jsr.io/@std/fs/1.0.24/unstable_write_file.ts", "https://jsr.io/@std/fs/1.0.24/unstable_write_text_file.ts", "../install.mts", "../utils.mts", "https://jsr.io/@std/fs/1.0.24/unstable_read_file.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/**\n * Error thrown when an assertion fails.\n *\n * @example Usage\n * ```ts ignore\n * import { AssertionError } from \"@std/assert\";\n *\n * try {\n * throw new AssertionError(\"foo\", { cause: \"bar\" });\n * } catch (error) {\n * if (error instanceof AssertionError) {\n * error.message === \"foo\"; // true\n * error.cause === \"bar\"; // true\n * }\n * }\n * ```\n */\nexport class AssertionError extends Error {\n /** Constructs a new instance.\n *\n * @param message The error message.\n * @param options Additional options. This argument is still unstable. It may change in the future release.\n */\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"AssertionError\";\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that `actual` and `expected` are almost equal numbers\n * through a given tolerance. It can be used to take into account IEEE-754\n * double-precision floating-point representation limitations. If the values\n * are not almost equal then throw.\n *\n * The default tolerance is one hundred thousandth of a percent of the\n * expected value.\n *\n * @example Usage\n * ```ts ignore\n * import { assertAlmostEquals } from \"@std/assert\";\n *\n * assertAlmostEquals(0.01, 0.02); // Throws\n * assertAlmostEquals(1e-8, 1e-9); // Throws\n * assertAlmostEquals(1.000000001e-8, 1.000000002e-8); // Doesn't throw\n * assertAlmostEquals(0.01, 0.02, 0.1); // Doesn't throw\n * assertAlmostEquals(0.1 + 0.2, 0.3, 1e-16); // Doesn't throw\n * assertAlmostEquals(0.1 + 0.2, 0.3, 1e-17); // Throws\n * ```\n *\n * @param actual The actual value to compare.\n * @param expected The expected value to compare.\n * @param tolerance The tolerance to consider the values almost equal. The\n * default is one hundred thousandth of a percent of the expected value.\n * @param msg The optional message to include in the error.\n * @throws {AssertionError} If the values are not almost equal.\n */\nexport function assertAlmostEquals(\n actual: number,\n expected: number,\n tolerance?: number,\n msg?: string,\n) {\n if (Object.is(actual, expected)) {\n return;\n }\n const delta = Math.abs(expected - actual);\n if (tolerance === undefined) {\n tolerance = isFinite(expected) ? Math.abs(expected * 1e-7) : 1e-7;\n }\n if (delta <= tolerance) {\n return;\n }\n\n const msgSuffix = msg ? `: ${msg}` : \".\";\n const f = (n: number) => Number.isInteger(n) ? n : n.toExponential();\n throw new AssertionError(\n `Expected actual: \"${f(actual)}\" to be close to \"${f(expected)}\": \\\ndelta \"${f(delta)}\" is greater than \"${f(tolerance)}\"${msgSuffix}`,\n );\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\ntype KeyedCollection = Set<unknown> | Map<unknown, unknown>;\nfunction isKeyedCollection(x: unknown): x is KeyedCollection {\n return x instanceof Set || x instanceof Map;\n}\n\nfunction prototypesEqual(a: object, b: object) {\n const pa = Object.getPrototypeOf(a);\n const pb = Object.getPrototypeOf(b);\n return pa === pb ||\n pa === Object.prototype && pb === null ||\n pa === null && pb === Object.prototype;\n}\n\nfunction isBasicObjectOrArray(obj: object) {\n const proto = Object.getPrototypeOf(obj);\n return proto === null || proto === Object.prototype ||\n proto === Array.prototype;\n}\n\n// Slightly faster than Reflect.ownKeys in V8 as of 12.9.202.13-rusty (2024-10-28)\nfunction ownKeys(obj: object) {\n return [\n ...Object.getOwnPropertyNames(obj),\n ...Object.getOwnPropertySymbols(obj),\n ];\n}\n\nfunction getKeysDeep(obj: object) {\n const keys = new Set<string | symbol>();\n\n while (obj !== Object.prototype && obj !== Array.prototype && obj != null) {\n for (const key of ownKeys(obj)) {\n keys.add(key);\n }\n obj = Object.getPrototypeOf(obj);\n }\n\n return keys;\n}\n\n// deno-lint-ignore no-explicit-any\nconst Temporal = (globalThis as any).Temporal ?? Object.create(null);\n\n/** A non-exhaustive list of prototypes that can be accurately fast-path compared with `String(instance)` */\nconst stringComparablePrototypes = new Set<unknown>(\n [\n Intl.Locale,\n RegExp,\n Temporal.Duration,\n Temporal.Instant,\n Temporal.PlainDate,\n Temporal.PlainDateTime,\n Temporal.PlainTime,\n Temporal.PlainYearMonth,\n Temporal.PlainMonthDay,\n Temporal.ZonedDateTime,\n URL,\n URLSearchParams,\n ].filter((x) => x != null).map((x) => x.prototype),\n);\n\nfunction isPrimitive(x: unknown) {\n return typeof x === \"string\" ||\n typeof x === \"number\" ||\n typeof x === \"boolean\" ||\n typeof x === \"bigint\" ||\n typeof x === \"symbol\" ||\n x == null;\n}\n\ntype TypedArray = Pick<Uint8Array | BigUint64Array, \"length\" | number>;\nconst TypedArray = Object.getPrototypeOf(Uint8Array);\nfunction compareTypedArrays(a: TypedArray, b: TypedArray) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < b.length; i++) {\n if (!sameValueZero(a[i], b[i])) return false;\n }\n return true;\n}\n\n/** Check both strict equality (`0 == -0`) and `Object.is` (`NaN == NaN`) */\nfunction sameValueZero(a: unknown, b: unknown) {\n return a === b || Object.is(a, b);\n}\n\n/**\n * Deep equality comparison used in assertions.\n *\n * This function is based on value equality, but for some cases (such as data\n * that can only be read asynchronously or function properties) value equality\n * is not possible to determine. In such cases, reference equality is used\n * instead, which may cause false negatives for objects such as `Blob`s or\n * `Request`s.\n *\n * @param a The actual value\n * @param b The expected value\n * @returns `true` if the values are deeply equal, `false` otherwise\n *\n * @throws {TypeError} If either value is a `WeakMap` or `WeakSet`.\n *\n * @example Usage\n * ```ts\n * import { equal } from \"@std/assert/equal\";\n *\n * equal({ foo: \"bar\" }, { foo: \"bar\" }); // Returns `true`\n * equal({ foo: \"bar\" }, { foo: \"baz\" }); // Returns `false`\n * ```\n */\nexport function equal(a: unknown, b: unknown): boolean {\n const seen = new Map<unknown, unknown>();\n return (function compare(a: unknown, b: unknown): boolean {\n if (sameValueZero(a, b)) return true;\n if (isPrimitive(a) || isPrimitive(b)) return false;\n\n if (a instanceof Date && b instanceof Date) {\n return Object.is(a.getTime(), b.getTime());\n }\n if (a && typeof a === \"object\" && b && typeof b === \"object\") {\n if (!prototypesEqual(a, b)) {\n return false;\n }\n if (a instanceof TypedArray) {\n return compareTypedArrays(a as TypedArray, b as TypedArray);\n }\n if (\n a instanceof ArrayBuffer ||\n (globalThis.SharedArrayBuffer && a instanceof SharedArrayBuffer)\n ) {\n return compareTypedArrays(\n new Uint8Array(a),\n new Uint8Array(b as ArrayBuffer | SharedArrayBuffer),\n );\n }\n if (a instanceof WeakMap) {\n throw new TypeError(\"Cannot compare WeakMap instances\");\n }\n if (a instanceof WeakSet) {\n throw new TypeError(\"Cannot compare WeakSet instances\");\n }\n if (a instanceof WeakRef) {\n return compare(a.deref(), (b as WeakRef<WeakKey>).deref());\n }\n if (seen.get(a) === b) {\n return true;\n }\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n seen.set(a, b);\n if (isKeyedCollection(a) && isKeyedCollection(b)) {\n if (a.size !== b.size) {\n return false;\n }\n\n const aKeys = [...a.keys()];\n const primitiveKeysFastPath = aKeys.every(isPrimitive);\n if (primitiveKeysFastPath) {\n if (a instanceof Set) {\n return a.symmetricDifference(b).size === 0;\n }\n\n for (const key of aKeys) {\n if (\n !b.has(key) ||\n !compare(a.get(key), (b as Map<unknown, unknown>).get(key))\n ) {\n return false;\n }\n }\n return true;\n }\n\n let unmatchedEntries = a.size;\n\n for (const [aKey, aValue] of a.entries()) {\n for (const [bKey, bValue] of b.entries()) {\n /* Given that Map keys can be references, we need\n * to ensure that they are also deeply equal */\n\n if (!compare(aKey, bKey)) continue;\n\n if (\n (aKey === aValue && bKey === bValue) ||\n (compare(aValue, bValue))\n ) {\n unmatchedEntries--;\n break;\n }\n }\n }\n\n return unmatchedEntries === 0;\n }\n\n let keys: Iterable<string | symbol>;\n\n if (isBasicObjectOrArray(a)) {\n // fast path\n keys = ownKeys({ ...a, ...b });\n } else if (stringComparablePrototypes.has(Object.getPrototypeOf(a))) {\n // medium path\n return String(a) === String(b);\n } else {\n // slow path\n keys = getKeysDeep(a).union(getKeysDeep(b));\n }\n\n for (const key of keys) {\n type Key = keyof typeof a;\n if (!compare(a[key as Key], b[key as Key])) {\n return false;\n }\n if (((key in a) && (!(key in b))) || ((key in b) && (!(key in a)))) {\n return false;\n }\n }\n return true;\n }\n return false;\n })(a, b);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/** An inspect function conforming to the shape of `Deno.inspect` and `node:util`'s `inspect` */\nexport type InspectFn = (\n v: unknown,\n options: {\n depth: number;\n sorted: boolean;\n trailingComma: boolean;\n compact: boolean;\n iterableLimit: number;\n getters: boolean;\n strAbbreviateSize: number;\n },\n) => string;\n\n/**\n * Converts the input into a string. Objects, Sets and Maps are sorted so as to\n * make tests less flaky.\n *\n * @param v Value to be formatted\n *\n * @returns The formatted string\n *\n * @example Usage\n * ```ts\n * import { format } from \"@std/internal/format\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(format({ a: 1, b: 2 }), \"{\\n a: 1,\\n b: 2,\\n}\");\n * assertEquals(format(new Set([1, 2])), \"Set(2) {\\n 1,\\n 2,\\n}\");\n * assertEquals(format(new Map([[1, 2]])), \"Map(1) {\\n 1 => 2,\\n}\");\n * ```\n */\nexport function format(v: unknown): string {\n // deno-lint-ignore no-explicit-any\n const { Deno, process } = globalThis as any;\n\n const inspect: InspectFn | undefined = Deno?.inspect ??\n process?.getBuiltinModule?.(\"node:util\")?.inspect;\n\n return typeof inspect === \"function\"\n ? inspect(v, {\n depth: Infinity,\n sorted: true,\n trailingComma: true,\n compact: false,\n iterableLimit: Infinity,\n // getters should be true in assertEquals.\n getters: true,\n strAbbreviateSize: Infinity,\n })\n : basicInspect(v);\n}\n\nconst formatters: ((v: unknown) => string | undefined)[] = [\n (v) => {\n if (typeof v === \"undefined\") return \"undefined\";\n if (typeof v === \"bigint\") return `${v}n`;\n\n if (\n typeof v === \"string\" ||\n typeof v === \"number\" ||\n typeof v === \"boolean\" ||\n v === null ||\n Array.isArray(v) ||\n [null, Object.prototype].includes(Object.getPrototypeOf(v))\n ) {\n return JSON.stringify(v, null, 2);\n }\n },\n (v) => String(v),\n (v) => Object.prototype.toString.call(v),\n];\n\n// for environments lacking both `Deno.inspect` and `process.inspect`\nfunction basicInspect(v: unknown): string {\n for (const fmt of formatters) {\n try {\n const result = fmt(v);\n if (typeof result === \"string\") return result;\n } catch { /* try the next one */ }\n }\n\n return \"[[Unable to format value]]\";\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { equal } from \"./equal.ts\";\nimport { format } from \"jsr:@std/internal@^1.0.12/format\";\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/** An array-like object (`Array`, `Uint8Array`, `NodeList`, etc.) that is not a string */\nexport type ArrayLikeArg<T> = ArrayLike<T> & object;\n\nfunction isPrimitive(value: unknown): boolean {\n return value === null ||\n typeof value !== \"object\" && typeof value !== \"function\";\n}\n\n/**\n * Asserts that `actual` contains all values in `expected`, using deep equality\n * for non-primitive values.\n *\n * @example Usage with primitives\n * ```ts ignore\n * import { assertArrayIncludes } from \"@std/assert\";\n *\n * assertArrayIncludes([1, 2, 3], [2, 3]); // Passes\n * assertArrayIncludes([1, 2, 3], [4]); // Throws\n * ```\n *\n * @example Usage with objects (deep equality)\n * ```ts ignore\n * import { assertArrayIncludes } from \"@std/assert\";\n *\n * assertArrayIncludes([{ a: 1 }, { b: 2 }], [{ a: 1 }]); // Passes\n * ```\n *\n * @typeParam T The element type of the arrays.\n * @param actual The array-like object to search within.\n * @param expected The values that must be present in `actual`.\n * @param msg Optional message to display on failure.\n * @throws {AssertionError} If any value in `expected` is not found in `actual`.\n */\nexport function assertArrayIncludes<T>(\n actual: ArrayLikeArg<T>,\n expected: ArrayLikeArg<T>,\n msg?: string,\n): void {\n const missing: unknown[] = [];\n const expectedLen = expected.length;\n const actualLen = actual.length;\n for (let i = 0; i < expectedLen; i++) {\n const item = expected[i];\n let found: boolean;\n if (isPrimitive(item)) {\n // Fast path\n found = Array.prototype.includes.call(actual, item);\n } else {\n found = false;\n for (let j = 0; j < actualLen; j++) {\n if (equal(item, actual[j])) {\n found = true;\n break;\n }\n }\n }\n if (!found) {\n missing.push(item);\n }\n }\n if (missing.length === 0) {\n return;\n }\n\n const msgSuffix = msg ? `: ${msg}` : \".\";\n msg = `Expected actual: \"${format(actual)}\" to include: \"${\n format(expected)\n }\"${msgSuffix}\\nmissing: ${format(missing)}`;\n throw new AssertionError(msg);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n// A module to print ANSI terminal colors. Inspired by chalk, kleur, and colors\n// on npm.\n\n// This code is vendored from `fmt/colors.ts`.\n\n// deno-lint-ignore no-explicit-any\nconst { Deno } = globalThis as any;\nconst noColor = typeof Deno?.noColor === \"boolean\"\n ? Deno.noColor as boolean\n : false;\n\ninterface Code {\n open: string;\n close: string;\n regexp: RegExp;\n}\n\nconst enabled = !noColor;\n\nfunction code(open: number[], close: number): Code {\n return {\n open: `\\x1b[${open.join(\";\")}m`,\n close: `\\x1b[${close}m`,\n regexp: new RegExp(`\\\\x1b\\\\[${close}m`, \"g\"),\n };\n}\n\nfunction run(str: string, code: Code): string {\n return enabled\n ? `${code.open}${str.replace(code.regexp, code.open)}${code.close}`\n : str;\n}\n\n/**\n * Sets the style of text to be printed to bold.\n *\n * Disable by setting the `NO_COLOR` environmental variable.\n *\n * @param str Text to make bold\n *\n * @returns Bold text for printing\n *\n * @example Usage\n * ```ts no-assert\n * import { bold } from \"@std/internal/styles\";\n *\n * console.log(bold(\"Hello, world!\")); // Prints \"Hello, world!\" in bold\n * ```\n */\nexport function bold(str: string): string {\n return run(str, code([1], 22));\n}\n\n/**\n * Sets the color of text to be printed to red.\n *\n * Disable by setting the `NO_COLOR` environmental variable.\n *\n * @param str Text to make red\n *\n * @returns Red text for printing\n *\n * @example Usage\n * ```ts no-assert\n * import { red } from \"@std/internal/styles\";\n *\n * console.log(red(\"Hello, world!\")); // Prints \"Hello, world!\" in red\n * ```\n */\nexport function red(str: string): string {\n return run(str, code([31], 39));\n}\n\n/**\n * Sets the color of text to be printed to green.\n *\n * Disable by setting the `NO_COLOR` environmental variable.\n *\n * @param str Text to make green\n *\n * @returns Green text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { green } from \"@std/internal/styles\";\n *\n * console.log(green(\"Hello, world!\")); // Prints \"Hello, world!\" in green\n * ```\n */\nexport function green(str: string): string {\n return run(str, code([32], 39));\n}\n\n/**\n * Sets the color of text to be printed to yellow.\n *\n * Disable by setting the `NO_COLOR` environmental variable.\n *\n * @param str Text to make yellow\n *\n * @returns Yellow text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { yellow } from \"@std/internal/styles\";\n *\n * console.log(yellow(\"Hello, world!\")); // Prints \"Hello, world!\" in yellow\n * ```\n */\nexport function yellow(str: string): string {\n return run(str, code([33], 39));\n}\n\n/**\n * Sets the color of text to be printed to white.\n *\n * @param str Text to make white\n *\n * @returns White text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { white } from \"@std/internal/styles\";\n *\n * console.log(white(\"Hello, world!\")); // Prints \"Hello, world!\" in white\n * ```\n */\nexport function white(str: string): string {\n return run(str, code([37], 39));\n}\n\n/**\n * Sets the color of text to be printed to gray.\n *\n * @param str Text to make gray\n *\n * @returns Gray text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { gray } from \"@std/internal/styles\";\n *\n * console.log(gray(\"Hello, world!\")); // Prints \"Hello, world!\" in gray\n * ```\n */\nexport function gray(str: string): string {\n return brightBlack(str);\n}\n\n/**\n * Sets the color of text to be printed to bright-black.\n *\n * @param str Text to make bright-black\n *\n * @returns Bright-black text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { brightBlack } from \"@std/internal/styles\";\n *\n * console.log(brightBlack(\"Hello, world!\")); // Prints \"Hello, world!\" in bright-black\n * ```\n */\nexport function brightBlack(str: string): string {\n return run(str, code([90], 39));\n}\n\n/**\n * Sets the background color of text to be printed to red.\n *\n * @param str Text to make its background red\n *\n * @returns Red background text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { bgRed } from \"@std/internal/styles\";\n *\n * console.log(bgRed(\"Hello, world!\")); // Prints \"Hello, world!\" with red background\n * ```\n */\nexport function bgRed(str: string): string {\n return run(str, code([41], 49));\n}\n\n/**\n * Sets the background color of text to be printed to green.\n *\n * @param str Text to make its background green\n *\n * @returns Green background text for print\n *\n * @example Usage\n * ```ts no-assert\n * import { bgGreen } from \"@std/internal/styles\";\n *\n * console.log(bgGreen(\"Hello, world!\")); // Prints \"Hello, world!\" with green background\n * ```\n */\nexport function bgGreen(str: string): string {\n return run(str, code([42], 49));\n}\n\n// https://github.com/chalk/ansi-regex/blob/02fa893d619d3da85411acc8fd4e2eea0e95a9d9/index.js\nconst ANSI_REGEXP = new RegExp(\n [\n \"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)\",\n \"(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TXZcf-nq-uy=><~]))\",\n ].join(\"|\"),\n \"g\",\n);\n\n/**\n * Remove ANSI escape codes from the string.\n *\n * @param string Text to remove ANSI escape codes from\n *\n * @returns Text without ANSI escape codes\n *\n * @example Usage\n * ```ts no-assert\n * import { red, stripAnsiCode } from \"@std/internal/styles\";\n *\n * console.log(stripAnsiCode(red(\"Hello, world!\"))); // Prints \"Hello, world!\"\n * ```\n */\nexport function stripAnsiCode(string: string): string {\n return string.replace(ANSI_REGEXP, \"\");\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { bgGreen, bgRed, bold, gray, green, red, white } from \"./styles.ts\";\nimport type { DiffResult, DiffType } from \"./types.ts\";\n\n/**\n * Colors the output of assertion diffs.\n *\n * @param diffType Difference type, either added or removed.\n * @param background If true, colors the background instead of the text.\n *\n * @returns A function that colors the input string.\n *\n * @example Usage\n * ```ts\n * import { createColor } from \"@std/internal\";\n * import { assertEquals } from \"@std/assert\";\n * import { bold, green, red, white } from \"@std/fmt/colors\";\n *\n * assertEquals(createColor(\"added\")(\"foo\"), green(bold(\"foo\")));\n * assertEquals(createColor(\"removed\")(\"foo\"), red(bold(\"foo\")));\n * assertEquals(createColor(\"common\")(\"foo\"), white(\"foo\"));\n * ```\n */\nexport function createColor(\n diffType: DiffType,\n /**\n * TODO(@littledivy): Remove this when we can detect true color terminals. See\n * https://github.com/denoland/std/issues/2575.\n */\n background = false,\n): (s: string) => string {\n switch (diffType) {\n case \"added\":\n return (s) => background ? bgGreen(white(s)) : green(bold(s));\n case \"removed\":\n return (s) => background ? bgRed(white(s)) : red(bold(s));\n case \"truncation\":\n return gray;\n default:\n return white;\n }\n}\n\n/**\n * Prefixes `+` or `-` in diff output.\n *\n * @param diffType Difference type, either added or removed\n *\n * @returns A string representing the sign.\n *\n * @example Usage\n * ```ts\n * import { createSign } from \"@std/internal\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(createSign(\"added\"), \"+ \");\n * assertEquals(createSign(\"removed\"), \"- \");\n * assertEquals(createSign(\"common\"), \" \");\n * ```\n */\nexport function createSign(diffType: DiffType): string {\n switch (diffType) {\n case \"added\":\n return \"+ \";\n case \"removed\":\n return \"- \";\n default:\n return \" \";\n }\n}\n\n/** Options for {@linkcode buildMessage}. */\nexport interface BuildMessageOptions {\n /**\n * Whether to output the diff as a single string.\n * @default {false}\n */\n stringDiff?: boolean;\n}\n\n/**\n * Builds a message based on the provided diff result.\n *\n * @param diffResult The diff result array.\n * @param options Optional parameters for customizing the message.\n * @param truncateDiff Function to truncate the diff (default is no truncation).\n *\n * @returns An array of strings representing the built message.\n *\n * @example Usage\n * ```ts no-assert\n * import { diffStr, buildMessage } from \"@std/internal\";\n *\n * diffStr(\"Hello, world!\", \"Hello, world\");\n * // [\n * // \"\",\n * // \"\",\n * // \" [Diff] Actual / Expected\",\n * // \"\",\n * // \"\",\n * // \"- Hello, world!\",\n * // \"+ Hello, world\",\n * // \"\",\n * // ]\n * ```\n */\nexport function buildMessage(\n diffResult: ReadonlyArray<DiffResult<string>>,\n options: BuildMessageOptions = {},\n truncateDiff?: (\n diffResult: ReadonlyArray<DiffResult<string>>,\n stringDiff: boolean,\n contextLength?: number | null,\n ) => ReadonlyArray<DiffResult<string>>,\n): string[] {\n if (truncateDiff != null) {\n diffResult = truncateDiff(diffResult, options.stringDiff ?? false);\n }\n\n const { stringDiff = false } = options;\n const messages = [\n \"\",\n \"\",\n ` ${gray(bold(\"[Diff]\"))} ${red(bold(\"Actual\"))} / ${\n green(bold(\"Expected\"))\n }`,\n \"\",\n \"\",\n ];\n const diffMessages = diffResult.map((result) => {\n const color = createColor(result.type);\n\n const line = result.type === \"added\" || result.type === \"removed\"\n ? result.details?.map((detail) =>\n detail.type !== \"common\"\n ? createColor(detail.type, true)(detail.value)\n : detail.value\n ).join(\"\") ?? result.value\n : result.value;\n\n return color(`${createSign(result.type)}${line}`);\n });\n messages.push(...(stringDiff ? [diffMessages.join(\"\")] : diffMessages), \"\");\n return messages;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport type { DiffResult, DiffType } from \"./types.ts\";\n\n/** Represents the farthest point in the diff algorithm. */\nexport interface FarthestPoint {\n /** The y-coordinate of the point. */\n y: number;\n /** The id of the point. */\n id: number;\n}\n\nconst REMOVED = 1;\nconst COMMON = 2;\nconst ADDED = 3;\n\n/**\n * Creates an array of common elements between two arrays.\n *\n * @typeParam T The type of elements in the arrays.\n *\n * @param A The first array.\n * @param B The second array.\n *\n * @returns An array containing the common elements between the two arrays.\n *\n * @example Usage\n * ```ts\n * import { createCommon } from \"@std/internal/diff\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const a = [1, 2, 3];\n * const b = [1, 2, 4];\n *\n * assertEquals(createCommon(a, b), [1, 2]);\n * ```\n */\nexport function createCommon<T>(A: T[], B: T[]): T[] {\n const common: T[] = [];\n if (A.length === 0 || B.length === 0) return [];\n for (let i = 0; i < Math.min(A.length, B.length); i += 1) {\n const a = A[i];\n const b = B[i];\n if (a !== undefined && a === b) {\n common.push(a);\n } else {\n return common;\n }\n }\n return common;\n}\n\n/**\n * Asserts that the value is a {@linkcode FarthestPoint}.\n * If not, an error is thrown.\n *\n * @param value The value to check.\n *\n * @returns A void value that returns once the assertion completes.\n *\n * @example Usage\n * ```ts\n * import { assertFp } from \"@std/internal/diff\";\n * import { assertThrows } from \"@std/assert\";\n *\n * assertFp({ y: 0, id: 0 });\n * assertThrows(() => assertFp({ id: 0 }));\n * assertThrows(() => assertFp({ y: 0 }));\n * assertThrows(() => assertFp(undefined));\n * ```\n */\nexport function assertFp(value: unknown): asserts value is FarthestPoint {\n if (\n value == null ||\n typeof value !== \"object\" ||\n typeof (value as FarthestPoint)?.y !== \"number\" ||\n typeof (value as FarthestPoint)?.id !== \"number\"\n ) {\n throw new Error(\n `Unexpected value, expected 'FarthestPoint': received ${typeof value}`,\n );\n }\n}\n\n/**\n * Creates an array of backtraced differences.\n *\n * @typeParam T The type of elements in the arrays.\n *\n * @param A The first array.\n * @param B The second array.\n * @param current The current {@linkcode FarthestPoint}.\n * @param swapped Boolean indicating if the arrays are swapped.\n * @param routes The routes array.\n * @param diffTypesPtrOffset The offset of the diff types in the routes array.\n *\n * @returns An array of backtraced differences.\n *\n * @example Usage\n * ```ts\n * import { backTrace } from \"@std/internal/diff\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * backTrace([], [], { y: 0, id: 0 }, false, new Uint32Array(0), 0),\n * [],\n * );\n * ```\n */\nexport function backTrace<T>(\n A: T[],\n B: T[],\n current: FarthestPoint,\n swapped: boolean,\n routes: Uint32Array,\n diffTypesPtrOffset: number,\n): Array<{\n type: DiffType;\n value: T;\n}> {\n const M = A.length;\n const N = B.length;\n const result: { type: DiffType; value: T }[] = [];\n let a = M - 1;\n let b = N - 1;\n let j = routes[current.id];\n let type = routes[current.id + diffTypesPtrOffset];\n while (true) {\n if (!j && !type) break;\n const prev = j!;\n if (type === REMOVED) {\n result.push({\n type: swapped ? \"removed\" : \"added\",\n value: B[b]!,\n });\n b -= 1;\n } else if (type === ADDED) {\n result.push({\n type: swapped ? \"added\" : \"removed\",\n value: A[a]!,\n });\n a -= 1;\n } else {\n result.push({ type: \"common\", value: A[a]! });\n a -= 1;\n b -= 1;\n }\n j = routes[prev];\n type = routes[prev + diffTypesPtrOffset];\n }\n result.reverse();\n return result;\n}\n\n/**\n * Creates a {@linkcode FarthestPoint}.\n *\n * @param k The current index.\n * @param M The length of the first array.\n * @param routes The routes array.\n * @param diffTypesPtrOffset The offset of the diff types in the routes array.\n * @param ptr The current pointer.\n * @param slide The slide {@linkcode FarthestPoint}.\n * @param down The down {@linkcode FarthestPoint}.\n *\n * @returns A {@linkcode FarthestPoint}.\n *\n * @example Usage\n * ```ts\n * import { createFp } from \"@std/internal/diff\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * createFp(\n * 0,\n * 0,\n * new Uint32Array(0),\n * 0,\n * 0,\n * { y: -1, id: 0 },\n * { y: 0, id: 0 },\n * ),\n * { y: -1, id: 1 },\n * );\n * ```\n */\nexport function createFp(\n k: number,\n M: number,\n routes: Uint32Array,\n diffTypesPtrOffset: number,\n ptr: number,\n slide?: FarthestPoint,\n down?: FarthestPoint,\n): FarthestPoint {\n if (slide && slide.y === -1 && down && down.y === -1) {\n return { y: 0, id: 0 };\n }\n const isAdding = (down?.y === -1) ||\n k === M ||\n (slide?.y ?? 0) > (down?.y ?? 0) + 1;\n if (slide && isAdding) {\n const prev = slide.id;\n ptr++;\n routes[ptr] = prev;\n routes[ptr + diffTypesPtrOffset] = ADDED;\n return { y: slide.y, id: ptr };\n }\n if (down && !isAdding) {\n const prev = down.id;\n ptr++;\n routes[ptr] = prev;\n routes[ptr + diffTypesPtrOffset] = REMOVED;\n return { y: down.y + 1, id: ptr };\n }\n throw new Error(\"Unexpected missing FarthestPoint\");\n}\n\n/**\n * Renders the differences between the actual and expected values.\n *\n * @typeParam T The type of elements in the arrays.\n *\n * @param A Actual value\n * @param B Expected value\n *\n * @returns An array of differences between the actual and expected values.\n *\n * @example Usage\n * ```ts\n * import { diff } from \"@std/internal/diff\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const a = [1, 2, 3];\n * const b = [1, 2, 4];\n *\n * assertEquals(diff(a, b), [\n * { type: \"common\", value: 1 },\n * { type: \"common\", value: 2 },\n * { type: \"removed\", value: 3 },\n * { type: \"added\", value: 4 },\n * ]);\n * ```\n */\nexport function diff<T>(A: T[], B: T[]): DiffResult<T>[] {\n const prefixCommon = createCommon(A, B);\n A = A.slice(prefixCommon.length);\n B = B.slice(prefixCommon.length);\n const swapped = B.length > A.length;\n [A, B] = swapped ? [B, A] : [A, B];\n const M = A.length;\n const N = B.length;\n if (!M && !N && !prefixCommon.length) return [];\n if (!N) {\n return [\n ...prefixCommon.map((value) => ({ type: \"common\", value })),\n ...A.map((value) => ({ type: swapped ? \"added\" : \"removed\", value })),\n ] as DiffResult<T>[];\n }\n const offset = N;\n const delta = M - N;\n const length = M + N + 1;\n const fp: FarthestPoint[] = Array.from({ length }, () => ({ y: -1, id: -1 }));\n\n /**\n * Note: this buffer is used to save memory and improve performance. The first\n * half is used to save route and the last half is used to save diff type.\n */\n const routes = new Uint32Array((M * N + length + 1) * 2);\n const diffTypesPtrOffset = routes.length / 2;\n let ptr = 0;\n\n function snake<T>(\n k: number,\n A: T[],\n B: T[],\n slide?: FarthestPoint,\n down?: FarthestPoint,\n ): FarthestPoint {\n const M = A.length;\n const N = B.length;\n const fp = createFp(k, M, routes, diffTypesPtrOffset, ptr, slide, down);\n ptr = fp.id;\n while (fp.y + k < M && fp.y < N && A[fp.y + k] === B[fp.y]) {\n const prev = fp.id;\n ptr++;\n fp.id = ptr;\n fp.y += 1;\n routes[ptr] = prev;\n routes[ptr + diffTypesPtrOffset] = COMMON;\n }\n return fp;\n }\n\n let currentFp = fp[delta + offset];\n assertFp(currentFp);\n let p = -1;\n while (currentFp.y < N) {\n p = p + 1;\n for (let k = -p; k < delta; ++k) {\n const index = k + offset;\n fp[index] = snake(k, A, B, fp[index - 1], fp[index + 1]);\n }\n for (let k = delta + p; k > delta; --k) {\n const index = k + offset;\n fp[index] = snake(k, A, B, fp[index - 1], fp[index + 1]);\n }\n const index = delta + offset;\n fp[delta + offset] = snake(delta, A, B, fp[index - 1], fp[index + 1]);\n currentFp = fp[delta + offset];\n assertFp(currentFp);\n }\n return [\n ...prefixCommon.map((value) => ({ type: \"common\", value })),\n ...backTrace(A, B, currentFp, swapped, routes, diffTypesPtrOffset),\n ] as DiffResult<T>[];\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport type { ChangedDiffResult, DiffResult } from \"./types.ts\";\nimport { diff } from \"./diff.ts\";\n\n/**\n * Unescape invisible characters.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#escape_sequences}\n *\n * @param string String to unescape.\n *\n * @returns Unescaped string.\n *\n * @example Usage\n * ```ts\n * import { unescape } from \"@std/internal/diff-str\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(unescape(\"Hello\\nWorld\"), \"Hello\\\\n\\nWorld\");\n * ```\n */\nexport function unescape(string: string): string {\n return string\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll(\"\\b\", \"\\\\b\")\n .replaceAll(\"\\f\", \"\\\\f\")\n .replaceAll(\"\\t\", \"\\\\t\")\n .replaceAll(\"\\v\", \"\\\\v\")\n // This does not remove line breaks\n .replaceAll(\n /\\r\\n|\\r|\\n/g,\n (str) => str === \"\\r\" ? \"\\\\r\" : str === \"\\n\" ? \"\\\\n\\n\" : \"\\\\r\\\\n\\r\\n\",\n );\n}\n\nconst WHITESPACE_SYMBOLS_REGEXP =\n /((?:\\\\[bftv]|[^\\S\\r\\n])+|\\\\[rn\\\\]|[()[\\]{}'\"\\r\\n]|\\b)/;\n\n/**\n * Tokenizes a string into an array of tokens.\n *\n * @param string The string to tokenize.\n * @param wordDiff If true, performs word-based tokenization. Default is false.\n *\n * @returns An array of tokens.\n *\n * @example Usage\n * ```ts\n * import { tokenize } from \"@std/internal/diff-str\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(tokenize(\"Hello\\nWorld\"), [\"Hello\\n\", \"World\"]);\n * ```\n */\nexport function tokenize(string: string, wordDiff = false): string[] {\n if (wordDiff) {\n return string\n .split(WHITESPACE_SYMBOLS_REGEXP)\n .filter((token) => token);\n }\n const tokens: string[] = [];\n const lines = string.split(/(\\n|\\r\\n)/).filter((line) => line);\n\n for (const [i, line] of lines.entries()) {\n if (i % 2) {\n tokens[tokens.length - 1] += line;\n } else {\n tokens.push(line);\n }\n }\n return tokens;\n}\n\n/**\n * Create details by filtering relevant word-diff for current line and merge\n * \"space-diff\" if surrounded by word-diff for cleaner displays.\n *\n * @param line Current line\n * @param tokens Word-diff tokens\n *\n * @returns Array of diff results.\n *\n * @example Usage\n * ```ts\n * import { createDetails } from \"@std/internal/diff-str\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const tokens = [\n * { type: \"added\", value: \"a\" },\n * { type: \"removed\", value: \"b\" },\n * { type: \"common\", value: \"c\" },\n * ] as const;\n * assertEquals(\n * createDetails({ type: \"added\", value: \"a\" }, [...tokens]),\n * [{ type: \"added\", value: \"a\" }, { type: \"common\", value: \"c\" }]\n * );\n * ```\n */\nexport function createDetails(\n line: DiffResult<string>,\n tokens: DiffResult<string>[],\n): DiffResult<string>[] {\n return tokens.filter(({ type }) => type === line.type || type === \"common\")\n .map((result, i, t) => {\n const token = t[i - 1];\n if (\n (result.type === \"common\") && token &&\n (token.type === t[i + 1]?.type) && /\\s+/.test(result.value)\n ) {\n return {\n ...result,\n type: token.type,\n };\n }\n return result;\n });\n}\n\nconst NON_WHITESPACE_REGEXP = /\\S/;\n\n/**\n * Renders the differences between the actual and expected strings. Partially\n * inspired from {@link https://github.com/kpdecker/jsdiff}.\n *\n * @param A Actual string\n * @param B Expected string\n *\n * @returns Array of diff results.\n *\n * @example Usage\n * ```ts\n * import { diffStr } from \"@std/internal/diff-str\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(diffStr(\"Hello!\", \"Hello\"), [\n * {\n * type: \"removed\",\n * value: \"Hello!\\n\",\n * details: [\n * { type: \"common\", value: \"Hello\" },\n * { type: \"removed\", value: \"!\" },\n * { type: \"common\", value: \"\\n\" }\n * ]\n * },\n * {\n * type: \"added\",\n * value: \"Hello\\n\",\n * details: [\n * { type: \"common\", value: \"Hello\" },\n * { type: \"common\", value: \"\\n\" }\n * ]\n * }\n * ]);\n * ```\n */\nexport function diffStr(A: string, B: string): DiffResult<string>[] {\n // Compute multi-line diff\n const diffResult = diff(\n tokenize(`${unescape(A)}\\n`),\n tokenize(`${unescape(B)}\\n`),\n );\n\n const added = [];\n const removed = [];\n for (const result of diffResult) {\n if (result.type === \"added\") {\n added.push(result);\n }\n if (result.type === \"removed\") {\n removed.push(result);\n }\n }\n\n // Compute word-diff\n const hasMoreRemovedLines = added.length < removed.length;\n const aLines = hasMoreRemovedLines ? added : removed;\n const bLines = hasMoreRemovedLines ? removed : added;\n let bIdx = 0;\n for (const a of aLines) {\n let tokens = [] as Array<DiffResult<string>>;\n let b: undefined | ChangedDiffResult<string>;\n const aTokens = tokenize(a.value, true);\n // Search another diff line with at least one common token\n while (bIdx < bLines.length) {\n b = bLines[bIdx++];\n const bTokens = tokenize(b!.value, true);\n tokens = hasMoreRemovedLines\n ? diff(bTokens, aTokens)\n : diff(aTokens, bTokens);\n if (\n tokens.some(({ type, value }) =>\n type === \"common\" && NON_WHITESPACE_REGEXP.test(value)\n )\n ) {\n break;\n }\n }\n // Register word-diff details\n a.details = createDetails(a, tokens);\n if (b) {\n b.details = createDetails(b, tokens);\n }\n }\n\n return diffResult;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { equal } from \"./equal.ts\";\nimport { buildMessage } from \"jsr:@std/internal@^1.0.12/build-message\";\nimport { diff } from \"jsr:@std/internal@^1.0.12/diff\";\nimport { diffStr } from \"jsr:@std/internal@^1.0.12/diff-str\";\nimport { format } from \"jsr:@std/internal@^1.0.12/format\";\n\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that `actual` and `expected` are equal, deeply. If not\n * deeply equal, then throw.\n *\n * Type parameter can be specified to ensure values under comparison have the\n * same type.\n *\n * Note: This function is based on value equality, but for some cases (such as\n * data that can only be read asynchronously or function properties) value\n * equality is not possible to determine. In such cases, reference equality is\n * used instead, which may cause false negatives for objects such as `Blob`s or\n * `Request`s.\n *\n * @example Usage\n * ```ts ignore\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\"world\", \"world\"); // Doesn't throw\n * assertEquals(\"hello\", \"world\"); // Throws\n * ```\n * @example Compare `Blob` objects\n * ```ts ignore\n * import { assertEquals } from \"@std/assert\";\n *\n * const bytes1 = await new Blob([\"foo\"]).bytes();\n * const bytes2 = await new Blob([\"foo\"]).bytes();\n *\n * assertEquals(bytes1, bytes2);\n * ```\n *\n * @typeParam T The type of the values to compare. This is usually inferred.\n * @param actual The actual value to compare.\n * @param expected The expected value to compare.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertEquals<T>(\n actual: T,\n expected: T,\n msg?: string,\n) {\n if (equal(actual, expected)) {\n return;\n }\n const msgSuffix = msg ? `: ${msg}` : \".\";\n let message = `Values are not equal${msgSuffix}`;\n\n const actualString = format(actual);\n const expectedString = format(expected);\n const stringDiff = (typeof actual === \"string\") &&\n (typeof expected === \"string\");\n const diffResult = stringDiff\n ? diffStr(actual as string, expected as string)\n : diff(actualString.split(\"\\n\"), expectedString.split(\"\\n\"));\n const diffMsg = buildMessage(diffResult, { stringDiff }, arguments[3])\n .join(\"\\n\");\n message = `${message}\\n${diffMsg}`;\n throw new AssertionError(message);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that actual is not null or undefined.\n * If not then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertExists } from \"@std/assert\";\n *\n * assertExists(\"something\"); // Doesn't throw\n * assertExists(undefined); // Throws\n * ```\n *\n * @typeParam T The type of the actual value.\n * @param actual The actual value to check.\n * @param msg The optional message to include in the error if the assertion fails.\n */\nexport function assertExists<T>(\n actual: T,\n msg?: string,\n): asserts actual is NonNullable<T> {\n if (actual === undefined || actual === null) {\n const msgSuffix = msg ? `: ${msg}` : \".\";\n msg =\n `Expected actual: \"${actual}\" to not be null or undefined${msgSuffix}`;\n throw new AssertionError(msg);\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/** Assertion condition for {@linkcode assertFalse}. */\nexport type Falsy = false | 0 | 0n | \"\" | null | undefined;\n\n/**\n * Make an assertion, an error will be thrown if `expr` has a truthy value.\n *\n * @example Usage\n * ```ts ignore\n * import { assertFalse } from \"@std/assert\";\n *\n * assertFalse(false); // Doesn't throw\n * assertFalse(true); // Throws\n * ```\n *\n * @param expr The expression to test.\n * @param msg The optional message to display if the assertion fails.\n * @throws {AssertionError} If `expr` is truthy.\n */\nexport function assertFalse(expr: unknown, msg = \"\"): asserts expr is Falsy {\n if (expr) {\n throw new AssertionError(msg);\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { format } from \"jsr:@std/internal@^1.0.12/format\";\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that `actual` is greater than or equal to `expected`.\n * If not then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertGreaterOrEqual } from \"@std/assert\";\n *\n * assertGreaterOrEqual(2, 1); // Doesn't throw\n * assertGreaterOrEqual(1, 1); // Doesn't throw\n * assertGreaterOrEqual(0, 1); // Throws\n * ```\n *\n * @typeParam T The type of the values to compare.\n * @param actual The actual value to compare.\n * @param expected The expected value to compare.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertGreaterOrEqual<T>(\n actual: T,\n expected: T,\n msg?: string,\n) {\n if (actual >= expected) return;\n\n const actualString = format(actual);\n const expectedString = format(expected);\n throw new AssertionError(\n msg ?? `Expect ${actualString} >= ${expectedString}`,\n );\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { format } from \"jsr:@std/internal@^1.0.12/format\";\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that `actual` is greater than `expected`.\n * If not then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertGreater } from \"@std/assert\";\n *\n * assertGreater(2, 1); // Doesn't throw\n * assertGreater(1, 1); // Throws\n * assertGreater(0, 1); // Throws\n * ```\n *\n * @typeParam T The type of the values to compare.\n * @param actual The actual value to compare.\n * @param expected The expected value to compare.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertGreater<T>(actual: T, expected: T, msg?: string) {\n if (actual > expected) return;\n\n const actualString = format(actual);\n const expectedString = format(expected);\n throw new AssertionError(msg ?? `Expect ${actualString} > ${expectedString}`);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/** Any constructor */\n// deno-lint-ignore no-explicit-any\nexport type AnyConstructor = new (...args: any[]) => any;\n/** Gets constructor type */\nexport type GetConstructorType<T extends AnyConstructor> = InstanceType<T>;\n\n/**\n * Make an assertion that `obj` is an instance of `type`.\n * If not then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertInstanceOf } from \"@std/assert\";\n *\n * assertInstanceOf(new Date(), Date); // Doesn't throw\n * assertInstanceOf(new Date(), Number); // Throws\n * ```\n *\n * @typeParam T The expected type of the object.\n * @param actual The object to check.\n * @param expectedType The expected class constructor.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertInstanceOf<\n // deno-lint-ignore no-explicit-any\n T extends abstract new (...args: any[]) => any,\n>(\n actual: unknown,\n expectedType: T,\n msg = \"\",\n): asserts actual is InstanceType<T> {\n if (actual instanceof expectedType) return;\n\n const msgSuffix = msg ? `: ${msg}` : \".\";\n const expectedTypeStr = expectedType.name;\n\n let actualTypeStr = \"\";\n if (actual === null) {\n actualTypeStr = \"null\";\n } else if (actual === undefined) {\n actualTypeStr = \"undefined\";\n } else if (typeof actual === \"object\") {\n actualTypeStr = actual.constructor?.name ?? \"Object\";\n } else {\n actualTypeStr = typeof actual;\n }\n\n if (expectedTypeStr === actualTypeStr) {\n msg =\n `Expected object to be an instance of \"${expectedTypeStr}\"${msgSuffix}`;\n } else if (actualTypeStr === \"function\") {\n msg =\n `Expected object to be an instance of \"${expectedTypeStr}\" but was not an instanced object${msgSuffix}`;\n } else {\n msg =\n `Expected object to be an instance of \"${expectedTypeStr}\" but was \"${actualTypeStr}\"${msgSuffix}`;\n }\n\n throw new AssertionError(msg);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\nimport { stripAnsiCode } from \"jsr:@std/internal@^1.0.12/styles\";\n\n/**\n * Make an assertion that `error` is an `Error`.\n * If not then an error will be thrown.\n * An error class and a string that should be included in the\n * error message can also be asserted.\n *\n * @example Usage\n * ```ts ignore\n * import { assertIsError } from \"@std/assert\";\n *\n * assertIsError(null); // Throws\n * assertIsError(new RangeError(\"Out of range\")); // Doesn't throw\n * assertIsError(new RangeError(\"Out of range\"), SyntaxError); // Throws\n * assertIsError(new RangeError(\"Out of range\"), SyntaxError, \"Out of range\"); // Doesn't throw\n * assertIsError(new RangeError(\"Out of range\"), SyntaxError, \"Within range\"); // Throws\n * ```\n *\n * @typeParam E The type of the error to assert.\n * @param error The error to assert.\n * @param ErrorClass The optional error class to assert.\n * @param msgMatches The optional string or RegExp to assert in the error message.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertIsError<E extends Error = Error>(\n error: unknown,\n // deno-lint-ignore no-explicit-any\n ErrorClass?: abstract new (...args: any[]) => E,\n msgMatches?: string | RegExp,\n msg?: string,\n): asserts error is E {\n const msgSuffix = msg ? `: ${msg}` : \".\";\n if (!(error instanceof Error)) {\n throw new AssertionError(\n `Expected \"error\" to be an Error object${msgSuffix}`,\n );\n }\n if (ErrorClass && !(error instanceof ErrorClass)) {\n msg =\n `Expected error to be instance of \"${ErrorClass.name}\", but was \"${error?.constructor?.name}\"${msgSuffix}`;\n throw new AssertionError(msg);\n }\n let msgCheck;\n if (typeof msgMatches === \"string\") {\n msgCheck = stripAnsiCode(error.message).includes(\n stripAnsiCode(msgMatches),\n );\n }\n if (msgMatches instanceof RegExp) {\n msgCheck = msgMatches.test(stripAnsiCode(error.message));\n }\n\n if (msgMatches && !msgCheck) {\n msg = `Expected error message to include ${\n msgMatches instanceof RegExp\n ? msgMatches.toString()\n : JSON.stringify(msgMatches)\n }, but got ${JSON.stringify(error?.message)}${msgSuffix}`;\n throw new AssertionError(msg);\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { format } from \"jsr:@std/internal@^1.0.12/format\";\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that `actual` is less than or equal to `expected`.\n * If not then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertLessOrEqual } from \"@std/assert\";\n *\n * assertLessOrEqual(1, 2); // Doesn't throw\n * assertLessOrEqual(1, 1); // Doesn't throw\n * assertLessOrEqual(1, 0); // Throws\n * ```\n *\n * @typeParam T The type of the values to compare.\n * @param actual The actual value to compare.\n * @param expected The expected value to compare.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertLessOrEqual<T>(\n actual: T,\n expected: T,\n msg?: string,\n) {\n if (actual <= expected) return;\n\n const actualString = format(actual);\n const expectedString = format(expected);\n throw new AssertionError(\n msg ?? `Expect ${actualString} <= ${expectedString}`,\n );\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { format } from \"jsr:@std/internal@^1.0.12/format\";\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that `actual` is less than `expected`.\n * If not then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertLess } from \"@std/assert\";\n *\n * assertLess(1, 2); // Doesn't throw\n * assertLess(2, 1); // Throws\n * ```\n *\n * @typeParam T The type of the values to compare.\n * @param actual The actual value to compare.\n * @param expected The expected value to compare.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertLess<T>(actual: T, expected: T, msg?: string) {\n if (actual < expected) return;\n\n const actualString = format(actual);\n const expectedString = format(expected);\n throw new AssertionError(msg ?? `Expect ${actualString} < ${expectedString}`);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that `actual` match RegExp `expected`. If not\n * then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertMatch } from \"@std/assert\";\n *\n * assertMatch(\"Raptor\", /Raptor/); // Doesn't throw\n * assertMatch(\"Denosaurus\", /Raptor/); // Throws\n * ```\n *\n * @param actual The actual value to be matched.\n * @param expected The expected pattern to match.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertMatch(\n actual: string,\n expected: RegExp,\n msg?: string,\n) {\n if (expected.test(actual)) return;\n const msgSuffix = msg ? `: ${msg}` : \".\";\n msg = `Expected actual: \"${actual}\" to match: \"${expected}\"${msgSuffix}`;\n throw new AssertionError(msg);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { equal } from \"./equal.ts\";\nimport { AssertionError } from \"./assertion_error.ts\";\nimport { format } from \"jsr:@std/internal@^1.0.12/format\";\n\n/**\n * Make an assertion that `actual` and `expected` are not equal, deeply.\n * If not then throw.\n *\n * Type parameter can be specified to ensure values under comparison have the same type.\n *\n * Note: This function is based on value equality, but for some cases (such as\n * data that can only be read asynchronously or function properties) value\n * equality is not possible to determine. In such cases, reference equality is\n * used instead, which may cause false negatives for objects such as `Blob`s or\n * `Request`s.\n *\n * @example Usage\n * ```ts ignore\n * import { assertNotEquals } from \"@std/assert\";\n *\n * assertNotEquals(1, 2); // Doesn't throw\n * assertNotEquals(1, 1); // Throws\n * ```\n *\n * @typeParam T The type of the values to compare.\n * @param actual The actual value to compare.\n * @param expected The expected value to compare.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertNotEquals<T>(actual: T, expected: T, msg?: string) {\n if (!equal(actual, expected)) {\n return;\n }\n const actualString = format(actual);\n const expectedString = format(expected);\n const msgSuffix = msg ? `: ${msg}` : \".\";\n throw new AssertionError(\n `Expected actual: ${actualString} not to be: ${expectedString}${msgSuffix}`,\n );\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { assertFalse } from \"./false.ts\";\n\n/**\n * Make an assertion that `obj` is not an instance of `type`.\n * If so, then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertNotInstanceOf } from \"@std/assert\";\n *\n * assertNotInstanceOf(new Date(), Number); // Doesn't throw\n * assertNotInstanceOf(new Date(), Date); // Throws\n * ```\n *\n * @typeParam A The type of the object to check.\n * @typeParam T The type of the class to check against.\n * @param actual The object to check.\n * @param unexpectedType The class constructor to check against.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertNotInstanceOf<A, T>(\n actual: A,\n // deno-lint-ignore no-explicit-any\n unexpectedType: abstract new (...args: any[]) => T,\n msg?: string,\n): asserts actual is Exclude<A, T> {\n const msgSuffix = msg ? `: ${msg}` : \".\";\n msg =\n `Expected object to not be an instance of \"${typeof unexpectedType}\"${msgSuffix}`;\n assertFalse(actual instanceof unexpectedType, msg);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that `actual` not match RegExp `expected`. If match\n * then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertNotMatch } from \"@std/assert\";\n *\n * assertNotMatch(\"Denosaurus\", /Raptor/); // Doesn't throw\n * assertNotMatch(\"Raptor\", /Raptor/); // Throws\n * ```\n *\n * @param actual The actual value to match.\n * @param expected The expected value to not match.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertNotMatch(\n actual: string,\n expected: RegExp,\n msg?: string,\n) {\n if (!expected.test(actual)) return;\n const msgSuffix = msg ? `: ${msg}` : \".\";\n msg = `Expected actual: \"${actual}\" to not match: \"${expected}\"${msgSuffix}`;\n throw new AssertionError(msg);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\nimport { format } from \"jsr:@std/internal@^1.0.12/format\";\n\n/**\n * Make an assertion that `actual` and `expected` are not strictly equal, using\n * {@linkcode Object.is} for equality comparison. If the values are strictly\n * equal then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertNotStrictEquals } from \"@std/assert\";\n *\n * assertNotStrictEquals(1, 1); // Throws\n * assertNotStrictEquals(1, 2); // Doesn't throw\n *\n * assertNotStrictEquals(0, 0); // Throws\n * assertNotStrictEquals(0, -0); // Doesn't throw\n * ```\n *\n * @typeParam T The type of the values to compare.\n * @param actual The actual value to compare.\n * @param expected The expected value to compare.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertNotStrictEquals<T>(\n actual: T,\n expected: T,\n msg?: string,\n) {\n if (!Object.is(actual, expected)) {\n return;\n }\n\n const msgSuffix = msg ? `: ${msg}` : \".\";\n throw new AssertionError(\n `Expected \"actual\" to not be strictly equal to: ${\n format(actual)\n }${msgSuffix}\\n`,\n );\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { assertEquals } from \"./equals.ts\";\n\n/**\n * Make an assertion that `expected` object is a subset of `actual` object,\n * deeply. If not, then throw a diff of the objects, with mismatching\n * properties highlighted.\n *\n * @example Usage\n * ```ts ignore\n * import { assertObjectMatch } from \"@std/assert\";\n *\n * assertObjectMatch({ foo: \"bar\" }, { foo: \"bar\" }); // Doesn't throw\n * assertObjectMatch({ foo: \"bar\" }, { foo: \"baz\" }); // Throws\n * assertObjectMatch({ foo: 1, bar: 2 }, { foo: 1 }); // Doesn't throw\n * assertObjectMatch({ foo: 1 }, { foo: 1, bar: 2 }); // Throws\n * ```\n *\n * @example Usage with nested objects\n * ```ts ignore\n * import { assertObjectMatch } from \"@std/assert\";\n *\n * assertObjectMatch({ foo: { bar: 3, baz: 4 } }, { foo: { bar: 3 } }); // Doesn't throw\n * assertObjectMatch({ foo: { bar: 3 } }, { foo: { bar: 3, baz: 4 } }); // Throws\n * ```\n *\n * @param actual The actual value to be matched.\n * @param expected The expected value to match.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertObjectMatch(\n // deno-lint-ignore no-explicit-any\n actual: Record<PropertyKey, any>,\n expected: Record<PropertyKey, unknown>,\n msg?: string,\n): void {\n return assertEquals(\n // get the intersection of \"actual\" and \"expected\"\n // side effect: all the instances' constructor field is \"Object\" now.\n filter(actual, expected),\n // set (nested) instances' constructor field to be \"Object\" without changing expected value.\n // see https://github.com/denoland/std/pull/1419\n filter(expected, expected),\n msg,\n );\n}\n\ntype Loose = Record<PropertyKey, unknown>;\n\nfunction isObject(val: unknown): boolean {\n return typeof val === \"object\" && val !== null;\n}\n\nfunction defineProperty(target: object, key: PropertyKey, value: unknown) {\n return Object.defineProperty(target, key, {\n value,\n configurable: true,\n enumerable: true,\n writable: true,\n });\n}\n\nfunction filter(a: Loose, b: Loose): Loose {\n const seen = new WeakMap<Loose | unknown[], Loose | unknown[]>();\n return filterObject(a, b);\n\n function filterObject(a: Loose, b: Loose): Loose {\n // Prevent infinite loop with circular references with same filter\n const memo = seen.get(a);\n if (memo && (memo === b)) return a;\n\n try {\n seen.set(a, b);\n } catch (err) {\n if (err instanceof TypeError) {\n throw new TypeError(\n `Cannot assertObjectMatch ${a === null ? null : `type ${typeof a}`}`,\n );\n }\n }\n\n // Filter keys and symbols which are present in both actual and expected\n const filtered = {} as Loose;\n const keysA = Reflect.ownKeys(a);\n const keysB = Reflect.ownKeys(b);\n const entries = keysA.filter((key) => keysB.includes(key))\n .map((key) => [key, a[key as string]]) as Array<[string, unknown]>;\n\n if (keysA.length && keysB.length && !entries.length) {\n // If both objects are not empty but don't have the same keys or symbols,\n // returns the entries in object a.\n for (const key of keysA) defineProperty(filtered, key, a[key]);\n return filtered;\n }\n\n for (const [key, value] of entries) {\n // On regexp references, keep value as it to avoid losing pattern and flags\n if (value instanceof RegExp) {\n defineProperty(filtered, key, value);\n continue;\n }\n // On date references, keep value as it to avoid losing the timestamp\n if (value instanceof Date) {\n defineProperty(filtered, key, value);\n continue;\n }\n\n const subset = (b as Loose)[key];\n\n // On array references, build a filtered array and filter nested objects inside\n if (Array.isArray(value) && Array.isArray(subset)) {\n defineProperty(filtered, key, filterArray(value, subset));\n continue;\n }\n\n // On nested objects references, build a filtered object recursively\n if (isObject(value) && isObject(subset)) {\n // When both operands are maps, build a filtered map with common keys and filter nested objects inside\n if ((value instanceof Map) && (subset instanceof Map)) {\n defineProperty(\n filtered,\n key,\n new Map(\n [...value].filter(([k]) => subset.has(k)).map(\n ([k, v]) => {\n const v2 = subset.get(k);\n if (isObject(v) && isObject(v2)) {\n return [k, filterObject(v as Loose, v2 as Loose)];\n }\n return [k, v];\n },\n ),\n ),\n );\n continue;\n }\n\n // When both operands are set, build a filtered set with common values\n if ((value instanceof Set) && (subset instanceof Set)) {\n defineProperty(filtered, key, value.intersection(subset));\n continue;\n }\n\n defineProperty(\n filtered,\n key,\n filterObject(value as Loose, subset as Loose),\n );\n continue;\n }\n\n defineProperty(filtered, key, value);\n }\n\n return filtered;\n }\n\n function filterArray(a: unknown[], b: unknown[]): unknown[] {\n // Prevent infinite loop with circular references with same filter\n const memo = seen.get(a);\n if (memo && (memo === b)) return a;\n\n seen.set(a, b);\n\n const filtered: unknown[] = [];\n const count = Math.min(a.length, b.length);\n\n for (let i = 0; i < count; ++i) {\n const value = a[i];\n const subset = b[i];\n\n // On regexp references, keep value as it to avoid losing pattern and flags\n if (value instanceof RegExp) {\n filtered.push(value);\n continue;\n }\n // On date references, keep value as it to avoid losing the timestamp\n if (value instanceof Date) {\n filtered.push(value);\n continue;\n }\n\n // On array references, build a filtered array and filter nested objects inside\n if (Array.isArray(value) && Array.isArray(subset)) {\n filtered.push(filterArray(value, subset));\n continue;\n }\n\n // On nested objects references, build a filtered object recursively\n if (isObject(value) && isObject(subset)) {\n // When both operands are maps, build a filtered map with common keys and filter nested objects inside\n if ((value instanceof Map) && (subset instanceof Map)) {\n const map = new Map(\n [...value].filter(([k]) => subset.has(k))\n .map(([k, v]) => {\n const v2 = subset.get(k);\n if (isObject(v) && isObject(v2)) {\n return [k, filterObject(v as Loose, v2 as Loose)];\n }\n\n return [k, v];\n }),\n );\n filtered.push(map);\n continue;\n }\n\n // When both operands are set, build a filtered set with common values\n if ((value instanceof Set) && (subset instanceof Set)) {\n filtered.push(value.intersection(subset));\n continue;\n }\n\n filtered.push(filterObject(value as Loose, subset as Loose));\n continue;\n }\n\n filtered.push(value);\n }\n\n return filtered;\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\nimport { assertIsError } from \"./is_error.ts\";\n\n/**\n * Executes a function which returns a promise, expecting it to reject.\n *\n * To assert that a synchronous function throws, use {@linkcode assertThrows}.\n *\n * @example Usage\n * ```ts ignore\n * import { assertRejects } from \"@std/assert\";\n *\n * await assertRejects(async () => Promise.reject(new Error())); // Doesn't throw\n * await assertRejects(async () => console.log(\"Hello world\")); // Throws\n * ```\n *\n * @param fn The function to execute.\n * @param msg The optional message to display if the assertion fails.\n * @returns The promise which resolves to the thrown error.\n */\nexport function assertRejects(\n fn: () => PromiseLike<unknown>,\n msg?: string,\n): Promise<unknown>;\n/**\n * Executes a function which returns a promise, expecting it to reject.\n * If it does not, then it throws. An error class and a string that should be\n * included in the error message can also be asserted.\n *\n * To assert that a synchronous function throws, use {@linkcode assertThrows}.\n *\n * @example Usage\n * ```ts ignore\n * import { assertRejects } from \"@std/assert\";\n *\n * await assertRejects(async () => Promise.reject(new Error()), Error); // Doesn't throw\n * await assertRejects(async () => Promise.reject(new Error()), SyntaxError); // Throws\n * ```\n *\n * @typeParam E The error class to assert.\n * @param fn The function to execute.\n * @param ErrorClass The error class to assert.\n * @param msgIncludes The string that should be included in the error message.\n * @param msg The optional message to display if the assertion fails.\n * @returns The promise which resolves to the thrown error.\n */\nexport function assertRejects<E extends Error = Error>(\n fn: () => PromiseLike<unknown>,\n // deno-lint-ignore no-explicit-any\n ErrorClass: abstract new (...args: any[]) => E,\n msgIncludes?: string,\n msg?: string,\n): Promise<E>;\nexport async function assertRejects<E extends Error = Error>(\n fn: () => PromiseLike<unknown>,\n errorClassOrMsg?:\n // deno-lint-ignore no-explicit-any\n | (abstract new (...args: any[]) => E)\n | string,\n msgIncludesOrMsg?: string,\n msg?: string,\n): Promise<E | Error | unknown> {\n // deno-lint-ignore no-explicit-any\n let ErrorClass: (abstract new (...args: any[]) => E) | undefined;\n let msgIncludes: string | undefined;\n let err;\n\n if (typeof errorClassOrMsg !== \"string\") {\n if (\n errorClassOrMsg === undefined ||\n errorClassOrMsg.prototype instanceof Error ||\n errorClassOrMsg.prototype === Error.prototype\n ) {\n ErrorClass = errorClassOrMsg;\n msgIncludes = msgIncludesOrMsg;\n }\n } else {\n msg = errorClassOrMsg;\n }\n let doesThrow = false;\n let isPromiseReturned = false;\n const msgSuffix = msg ? `: ${msg}` : \".\";\n try {\n const possiblePromise = fn();\n if (\n possiblePromise &&\n typeof possiblePromise === \"object\" &&\n typeof possiblePromise.then === \"function\"\n ) {\n isPromiseReturned = true;\n await possiblePromise;\n } else {\n throw new Error();\n }\n } catch (error) {\n if (!isPromiseReturned) {\n throw new AssertionError(\n `Function throws when expected to reject${msgSuffix}`,\n );\n }\n if (ErrorClass) {\n if (!(error instanceof Error)) {\n throw new AssertionError(`A non-Error object was rejected${msgSuffix}`);\n }\n assertIsError(\n error,\n ErrorClass,\n msgIncludes,\n msg,\n );\n }\n err = error;\n doesThrow = true;\n }\n if (!doesThrow) {\n throw new AssertionError(\n `Expected function to reject${msgSuffix}`,\n );\n }\n return err;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { buildMessage } from \"jsr:@std/internal@^1.0.12/build-message\";\nimport { diff } from \"jsr:@std/internal@^1.0.12/diff\";\nimport { diffStr } from \"jsr:@std/internal@^1.0.12/diff-str\";\nimport { format } from \"jsr:@std/internal@^1.0.12/format\";\nimport { red } from \"jsr:@std/internal@^1.0.12/styles\";\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that `actual` and `expected` are strictly equal, using\n * {@linkcode Object.is} for equality comparison. If not, then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertStrictEquals } from \"@std/assert\";\n *\n * const a = {};\n * const b = a;\n * assertStrictEquals(a, b); // Doesn't throw\n *\n * const c = {};\n * const d = {};\n * assertStrictEquals(c, d); // Throws\n * ```\n *\n * @typeParam T The type of the expected value.\n * @param actual The actual value to compare.\n * @param expected The expected value to compare.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertStrictEquals<T>(\n actual: unknown,\n expected: T,\n msg?: string,\n): asserts actual is T {\n if (Object.is(actual, expected)) {\n return;\n }\n\n const msgSuffix = msg ? `: ${msg}` : \".\";\n let message: string;\n\n const actualString = format(actual);\n const expectedString = format(expected);\n\n if (actualString === expectedString) {\n const withOffset = actualString\n .split(\"\\n\")\n .map((l) => ` ${l}`)\n .join(\"\\n\");\n message =\n `Values have the same structure but are not reference-equal${msgSuffix}\\n\\n${\n red(withOffset)\n }\\n`;\n } else {\n const stringDiff = (typeof actual === \"string\") &&\n (typeof expected === \"string\");\n const diffResult = stringDiff\n ? diffStr(actual as string, expected as string)\n : diff(actualString.split(\"\\n\"), expectedString.split(\"\\n\"));\n const diffMsg = buildMessage(diffResult, { stringDiff }, arguments[3])\n .join(\"\\n\");\n message = `Values are not strictly equal${msgSuffix}\\n${diffMsg}`;\n }\n\n throw new AssertionError(message);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion that actual includes expected. If not\n * then throw.\n *\n * @example Usage\n * ```ts ignore\n * import { assertStringIncludes } from \"@std/assert\";\n *\n * assertStringIncludes(\"Hello\", \"ello\"); // Doesn't throw\n * assertStringIncludes(\"Hello\", \"world\"); // Throws\n * ```\n *\n * @param actual The actual string to check for inclusion.\n * @param expected The expected string to check for inclusion.\n * @param msg The optional message to display if the assertion fails.\n */\nexport function assertStringIncludes(\n actual: string,\n expected: string,\n msg?: string,\n) {\n if (actual.includes(expected)) return;\n const msgSuffix = msg ? `: ${msg}` : \".\";\n msg = `Expected actual: \"${actual}\" to contain: \"${expected}\"${msgSuffix}`;\n throw new AssertionError(msg);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { assertIsError } from \"./is_error.ts\";\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Executes a function, expecting it to throw. If it does not, then it\n * throws.\n *\n * To assert that an asynchronous function rejects, use\n * {@linkcode assertRejects}.\n *\n * @example Usage\n * ```ts ignore\n * import { assertThrows } from \"@std/assert\";\n *\n * assertThrows(() => { throw new TypeError(\"hello world!\"); }); // Doesn't throw\n * assertThrows(() => console.log(\"hello world!\")); // Throws\n * ```\n *\n * @param fn The function to execute.\n * @param msg The optional message to display if the assertion fails.\n * @returns The error that was thrown.\n */\nexport function assertThrows(\n fn: () => unknown,\n msg?: string,\n): unknown;\n/**\n * Executes a function, expecting it to throw. If it does not, then it\n * throws. An error class and a string that should be included in the\n * error message can also be asserted.\n *\n * To assert that an asynchronous function rejects, use\n * {@linkcode assertRejects}.\n *\n * @example Usage\n * ```ts ignore\n * import { assertThrows } from \"@std/assert\";\n *\n * assertThrows(() => { throw new TypeError(\"hello world!\"); }, TypeError); // Doesn't throw\n * assertThrows(() => { throw new TypeError(\"hello world!\"); }, RangeError); // Throws\n * ```\n *\n * @typeParam E The error class to assert.\n * @param fn The function to execute.\n * @param ErrorClass The error class to assert.\n * @param msgIncludes The string that should be included in the error message.\n * @param msg The optional message to display if the assertion fails.\n * @returns The error that was thrown.\n */\nexport function assertThrows<E extends Error = Error>(\n fn: () => unknown,\n // deno-lint-ignore no-explicit-any\n ErrorClass: abstract new (...args: any[]) => E,\n msgIncludes?: string,\n msg?: string,\n): E;\nexport function assertThrows<E extends Error = Error>(\n fn: () => unknown,\n errorClassOrMsg?:\n // deno-lint-ignore no-explicit-any\n | (abstract new (...args: any[]) => E)\n | string,\n msgIncludesOrMsg?: string,\n msg?: string,\n): E | Error | unknown {\n // deno-lint-ignore no-explicit-any\n let ErrorClass: (abstract new (...args: any[]) => E) | undefined;\n let msgIncludes: string | undefined;\n let err;\n\n if (typeof errorClassOrMsg !== \"string\") {\n if (\n errorClassOrMsg === undefined ||\n errorClassOrMsg?.prototype instanceof Error ||\n errorClassOrMsg?.prototype === Error.prototype\n ) {\n ErrorClass = errorClassOrMsg;\n msgIncludes = msgIncludesOrMsg;\n } else {\n msg = msgIncludesOrMsg;\n }\n } else {\n msg = errorClassOrMsg;\n }\n let doesThrow = false;\n const msgSuffix = msg ? `: ${msg}` : \".\";\n try {\n fn();\n } catch (error) {\n if (ErrorClass) {\n if (error instanceof Error === false) {\n throw new AssertionError(`A non-Error object was thrown${msgSuffix}`);\n }\n assertIsError(\n error,\n ErrorClass,\n msgIncludes,\n msg,\n );\n }\n err = error;\n doesThrow = true;\n }\n if (!doesThrow) {\n msg = `Expected function to throw${msgSuffix}`;\n throw new AssertionError(msg);\n }\n return err;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Make an assertion, an error will be thrown if `expr` does not have a truthy value.\n *\n * @example Usage\n * ```ts ignore\n * import { assert } from \"@std/assert\";\n *\n * assert(\"hello\".includes(\"ello\")); // Doesn't throw\n * assert(\"hello\".includes(\"world\")); // Throws\n * ```\n *\n * @param expr The expression to test.\n * @param msg The optional message to display if the assertion fails.\n * @throws {AssertionError} If `expr` is falsy.\n */\nexport function assert(expr: unknown, msg = \"\"): asserts expr {\n if (!expr) {\n throw new AssertionError(msg);\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Forcefully throws a failed assertion.\n *\n * @example Usage\n * ```ts ignore\n * import { fail } from \"@std/assert\";\n *\n * fail(\"Deliberately failed!\"); // Throws\n * ```\n *\n * @param msg Optional message to include in the error.\n * @returns Never returns, always throws.\n */\nexport function fail(msg?: string): never {\n const msgSuffix = msg ? `: ${msg}` : \".\";\n throw new AssertionError(`Failed assertion${msgSuffix}`);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Use this to stub out methods that will throw when invoked.\n *\n * @example Usage\n * ```ts ignore\n * import { unimplemented } from \"@std/assert\";\n *\n * unimplemented(); // Throws\n * ```\n *\n * @param msg Optional message to include in the error.\n * @returns Never returns, always throws.\n */\nexport function unimplemented(msg?: string): never {\n const msgSuffix = msg ? `: ${msg}` : \".\";\n throw new AssertionError(`Unimplemented${msgSuffix}`);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { AssertionError } from \"./assertion_error.ts\";\n\n/**\n * Use this to assert unreachable code.\n *\n * @example Usage\n * ```ts ignore\n * import { unreachable } from \"@std/assert\";\n *\n * unreachable(); // Throws\n * ```\n *\n * @param msg Optional message to include in the error.\n * @returns Never returns, always throws.\n */\nexport function unreachable(msg?: string): never {\n const msgSuffix = msg ? `: ${msg}` : \".\";\n throw new AssertionError(`Unreachable${msgSuffix}`);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/** A library of assertion functions.\n * If the assertion is false an `AssertionError` will be thrown which will\n * result in pretty-printed diff of the failing assertion.\n *\n * This module is browser compatible, but do not rely on good formatting of\n * values for AssertionError messages in browsers.\n *\n * ```ts ignore\n * import { assert } from \"@std/assert\";\n *\n * assert(\"I am truthy\"); // Doesn't throw\n * assert(false); // Throws `AssertionError`\n * ```\n *\n * @module\n */\n\nexport * from \"./almost_equals.ts\";\nexport * from \"./array_includes.ts\";\nexport * from \"./equals.ts\";\nexport * from \"./exists.ts\";\nexport * from \"./false.ts\";\nexport * from \"./greater_or_equal.ts\";\nexport * from \"./greater.ts\";\nexport * from \"./instance_of.ts\";\nexport * from \"./is_error.ts\";\nexport * from \"./less_or_equal.ts\";\nexport * from \"./less.ts\";\nexport * from \"./match.ts\";\nexport * from \"./not_equals.ts\";\nexport * from \"./not_instance_of.ts\";\nexport * from \"./not_match.ts\";\nexport * from \"./not_strict_equals.ts\";\nexport * from \"./object_match.ts\";\nexport * from \"./rejects.ts\";\nexport * from \"./strict_equals.ts\";\nexport * from \"./string_includes.ts\";\nexport * from \"./throws.ts\";\nexport * from \"./assert.ts\";\nexport * from \"./assertion_error.ts\";\nexport * from \"./equal.ts\";\nexport * from \"./fail.ts\";\nexport * from \"./unimplemented.ts\";\nexport * from \"./unreachable.ts\";\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n\nconst encoder = new TextEncoder();\n\nfunction getTypeName(value: unknown): string {\n const type = typeof value;\n if (type !== \"object\") {\n return type;\n } else if (value === null) {\n return \"null\";\n } else {\n return value?.constructor?.name ?? \"object\";\n }\n}\n\nexport function validateBinaryLike(source: unknown): Uint8Array {\n if (typeof source === \"string\") {\n return encoder.encode(source);\n } else if (source instanceof Uint8Array) {\n return source;\n } else if (source instanceof ArrayBuffer) {\n return new Uint8Array(source);\n }\n throw new TypeError(\n `Cannot validate the input as it must be a Uint8Array, a string, or an ArrayBuffer: received a value of the type ${\n getTypeName(source)\n }`,\n );\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\n/**\n * Utilities for working with {@link https://en.wikipedia.org/wiki/Ascii85 | ascii85} encoding.\n *\n * ## Specifying a standard and delimiter\n *\n * By default, all functions are using the most popular Adobe version of ascii85\n * and not adding any delimiter. However, there are three more standards\n * supported - btoa (different delimiter and additional compression of 4 bytes\n * equal to 32), {@link https://rfc.zeromq.org/spec/32/ | Z85} and\n * {@link https://www.rfc-editor.org/rfc/rfc1924.html | RFC 1924}. It's possible to use a\n * different encoding by specifying it in `options` object as a second parameter.\n *\n * Similarly, it's possible to make `encode` add a delimiter (`<~` and `~>` for\n * Adobe, `xbtoa Begin` and `xbtoa End` with newlines between the delimiters and\n * encoded data for btoa. Checksums for btoa are not supported. Delimiters are not\n * supported by other encodings.)\n *\n * @module\n */\n\nimport { validateBinaryLike } from \"./_validate_binary_like.ts\";\n\n/**\n * Supported ascii85 standards for {@linkcode EncodeAscii85Options} and\n * {@linkcode DecodeAscii85Options}.\n */\nexport type Ascii85Standard = \"Adobe\" | \"btoa\" | \"RFC 1924\" | \"Z85\";\n\n/** Options for {@linkcode encodeAscii85}. */\nexport interface EncodeAscii85Options {\n /**\n * Character set and delimiter (if supported and used).\n *\n * @default {\"Adobe\"}\n */\n standard?: Ascii85Standard;\n /**\n * Whether to use a delimiter (if supported).\n *\n * @default {false}\n */\n delimiter?: boolean;\n}\n\nconst rfc1924 =\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~\" as const;\nconst Z85 =\n \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.-:+=^!/*?&<>()[]{}@%$#\" as const;\n\n/**\n * Converts data into an ascii85-encoded string.\n *\n * @param data The data to encode.\n * @param options Options for encoding.\n *\n * @returns The ascii85-encoded string.\n *\n * @example Usage\n * ```ts\n * import { encodeAscii85 } from \"@std/encoding/ascii85\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeAscii85(\"Hello world!\"), \"87cURD]j7BEbo80\");\n * ```\n */\nexport function encodeAscii85(\n data: ArrayBuffer | Uint8Array | string,\n options: EncodeAscii85Options = {},\n): string {\n let uint8 = validateBinaryLike(data);\n\n const { standard = \"Adobe\" } = options;\n\n let output: string[] = [];\n let v: number;\n let n = 0;\n let difference = 0;\n if (uint8.length % 4 !== 0) {\n const tmp = uint8;\n difference = 4 - (tmp.length % 4);\n uint8 = new Uint8Array(tmp.length + difference);\n uint8.set(tmp);\n }\n const view = new DataView(uint8.buffer, uint8.byteOffset, uint8.byteLength);\n for (let i = 0; i < uint8.length; i += 4) {\n v = view.getUint32(i);\n // Adobe and btoa standards compress 4 zeroes to single \"z\" character\n if (\n (standard === \"Adobe\" || standard === \"btoa\") &&\n v === 0 &&\n i < uint8.length - difference - 3\n ) {\n output[n++] = \"z\";\n continue;\n }\n // btoa compresses 4 spaces - that is, bytes equal to 32 - into single \"y\" character\n if (standard === \"btoa\" && v === 538976288) {\n output[n++] = \"y\";\n continue;\n }\n for (let j = 4; j >= 0; j--) {\n output[n + j] = String.fromCharCode((v % 85) + 33);\n v = Math.trunc(v / 85);\n }\n n += 5;\n }\n switch (standard) {\n case \"Adobe\":\n if (options?.delimiter) {\n return `<~${output.slice(0, output.length - difference).join(\"\")}~>`;\n }\n break;\n case \"btoa\":\n if (options?.delimiter) {\n return `xbtoa Begin\\n${\n output\n .slice(0, output.length - difference)\n .join(\"\")\n }\\nxbtoa End`;\n }\n break;\n case \"RFC 1924\":\n output = output.map((val) => rfc1924[val.charCodeAt(0) - 33]!);\n break;\n case \"Z85\":\n output = output.map((val) => Z85[val.charCodeAt(0) - 33]!);\n break;\n }\n return output.slice(0, output.length - difference).join(\"\");\n}\n\n/** Options for {@linkcode decodeAscii85}. */\nexport type DecodeAscii85Options = Omit<EncodeAscii85Options, \"delimiter\">;\n\n/**\n * Decodes a ascii85-encoded string.\n *\n * @param ascii85 The ascii85-encoded string to decode.\n * @param options Options for decoding.\n * @returns The decoded data.\n *\n * @example Usage\n * ```ts\n * import { decodeAscii85 } from \"@std/encoding/ascii85\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * decodeAscii85(\"87cURD]j7BEbo80\"),\n * new TextEncoder().encode(\"Hello world!\"),\n * );\n * ```\n */\nexport function decodeAscii85(\n ascii85: string,\n options: DecodeAscii85Options = {},\n): Uint8Array_ {\n const { standard = \"Adobe\" } = options;\n\n // translate all encodings to most basic adobe/btoa one and decompress some special characters (\"z\" and \"y\")\n switch (standard) {\n case \"Adobe\":\n ascii85 = ascii85.replaceAll(/(<~|~>)/g, \"\").replaceAll(\"z\", \"!!!!!\");\n break;\n case \"btoa\":\n ascii85 = ascii85\n .replaceAll(/(xbtoa Begin|xbtoa End|\\n)/g, \"\")\n .replaceAll(\"z\", \"!!!!!\")\n .replaceAll(\"y\", \"+<VdL\");\n break;\n case \"RFC 1924\":\n ascii85 = ascii85.replaceAll(\n /./g,\n (match) => String.fromCharCode(rfc1924.indexOf(match) + 33),\n );\n break;\n case \"Z85\":\n ascii85 = ascii85.replaceAll(\n /./g,\n (match) => String.fromCharCode(Z85.indexOf(match) + 33),\n );\n break;\n }\n // remove all invalid characters\n ascii85 = ascii85.replaceAll(/[^!-u]/g, \"\");\n const len = ascii85.length;\n const output = new Uint8Array(len + 4 - (len % 4));\n const view = new DataView(output.buffer);\n let v = 0;\n let n = 0;\n let max = 0;\n for (let i = 0; i < len;) {\n for (max += 5; i < max; i++) {\n v = v * 85 + (i < len ? ascii85.charCodeAt(i) : 117) - 33;\n }\n view.setUint32(n, v);\n v = 0;\n n += 4;\n }\n return output.slice(0, Math.trunc(len * 0.8));\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nexport const padding = \"=\".charCodeAt(0);\nexport const alphabet: Record<Base32Alphabet, Uint8Array> = {\n base32: new TextEncoder().encode(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\"),\n base32hex: new TextEncoder().encode(\"0123456789ABCDEFGHIJKLMNOPQRSTUV\"),\n base32crockford: new TextEncoder().encode(\"0123456789ABCDEFGHJKMNPQRSTVWXYZ\"),\n};\nexport const rAlphabet: Record<Base32Alphabet, Uint8Array> = {\n base32: new Uint8Array(128).fill(32), // alphabet.base32.length\n base32hex: new Uint8Array(128).fill(32),\n base32crockford: new Uint8Array(128).fill(32),\n};\nalphabet.base32\n .forEach((byte, i) => rAlphabet.base32[byte] = i);\nalphabet.base32hex\n .forEach((byte, i) => rAlphabet.base32hex[byte] = i);\nalphabet.base32crockford\n .forEach((byte, i) => rAlphabet.base32crockford[byte] = i);\n\n/**\n * Options for encoding and decoding base32 strings.\n */\nexport interface Base32Options {\n /** The base32 alphabet. Defaults to \"base32\" */\n alphabet?: Base32Alphabet;\n}\n\n/**\n * The base32 alphabets.\n */\nexport type Base32Alphabet = \"base32\" | \"base32hex\" | \"base32crockford\";\n\n/**\n * Calculate the output size needed to encode a given input size for\n * {@linkcode encodeIntoBase32}.\n *\n * @param rawSize The size of the input buffer.\n * @returns The size of the output buffer.\n *\n * @example Basic Usage\n * ```ts\n * import { assertEquals } from \"@std/assert\";\n * import { calcSizeBase32 } from \"@std/encoding/unstable-base32\";\n *\n * assertEquals(calcSizeBase32(1), 8);\n * ```\n */\nexport function calcSizeBase32(rawSize: number): number {\n return ((rawSize + 4) / 5 | 0) * 8;\n}\n\nexport function encode(\n buffer: Uint8Array_,\n i: number,\n o: number,\n alphabet: Uint8Array,\n padding: number,\n): number {\n i += 4;\n for (; i < buffer.length; i += 5) {\n let x = (buffer[i - 4]! << 16) | (buffer[i - 3]! << 8) | buffer[i - 2]!;\n buffer[o++] = alphabet[x >> 19]!;\n buffer[o++] = alphabet[x >> 14 & 0x1F]!;\n buffer[o++] = alphabet[x >> 9 & 0x1F]!;\n buffer[o++] = alphabet[x >> 4 & 0x1F]!;\n x = (x << 16) | (buffer[i - 1]! << 8) | buffer[i]!;\n buffer[o++] = alphabet[x >> 15 & 0x1F]!;\n buffer[o++] = alphabet[x >> 10 & 0x1F]!;\n buffer[o++] = alphabet[x >> 5 & 0x1F]!;\n buffer[o++] = alphabet[x & 0x1F]!;\n }\n switch (i) {\n case buffer.length + 3: {\n const x = buffer[i - 4]! << 16;\n buffer[o++] = alphabet[x >> 19]!;\n buffer[o++] = alphabet[x >> 14 & 0x1F]!;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n break;\n }\n case buffer.length + 2: {\n const x = (buffer[i - 4]! << 16) | (buffer[i - 3]! << 8);\n buffer[o++] = alphabet[x >> 19]!;\n buffer[o++] = alphabet[x >> 14 & 0x1F]!;\n buffer[o++] = alphabet[x >> 9 & 0x1F]!;\n buffer[o++] = alphabet[x >> 4 & 0x1F]!;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n break;\n }\n case buffer.length + 1: {\n let x = (buffer[i - 4]! << 16) | (buffer[i - 3]! << 8) | buffer[i - 2]!;\n buffer[o++] = alphabet[x >> 19]!;\n buffer[o++] = alphabet[x >> 14 & 0x1F]!;\n buffer[o++] = alphabet[x >> 9 & 0x1F]!;\n buffer[o++] = alphabet[x >> 4 & 0x1F]!;\n x <<= 16;\n buffer[o++] = alphabet[x >> 15 & 0x1F]!;\n buffer[o++] = padding;\n buffer[o++] = padding;\n buffer[o++] = padding;\n break;\n }\n case buffer.length: {\n let x = (buffer[i - 4]! << 16) | (buffer[i - 3]! << 8) | buffer[i - 2]!;\n buffer[o++] = alphabet[x >> 19]!;\n buffer[o++] = alphabet[x >> 14 & 0x1F]!;\n buffer[o++] = alphabet[x >> 9 & 0x1F]!;\n buffer[o++] = alphabet[x >> 4 & 0x1F]!;\n x = (x << 16) | (buffer[i - 1]! << 8);\n buffer[o++] = alphabet[x >> 15 & 0x1F]!;\n buffer[o++] = alphabet[x >> 10 & 0x1F]!;\n buffer[o++] = alphabet[x >> 5 & 0x1F]!;\n buffer[o++] = padding;\n break;\n }\n }\n return o;\n}\n\nexport function decode(\n buffer: Uint8Array_,\n i: number,\n o: number,\n alphabet: Uint8Array,\n padding: number,\n): number {\n for (let x = buffer.length - 6; x < buffer.length; ++x) {\n if (buffer[x] === padding) {\n for (let y = x + 1; y < buffer.length; ++y) {\n if (buffer[y] !== padding) {\n throw new TypeError(\n `Cannot decode input as base32: Invalid character (${\n String.fromCharCode(buffer[y]!)\n })`,\n );\n }\n }\n buffer = buffer.subarray(0, x);\n break;\n }\n }\n switch ((buffer.length - o) % 8) {\n case 6:\n case 3:\n case 1:\n throw new RangeError(\n `Cannot decode input as base32: Length (${\n buffer.length - o\n }), excluding padding, must not have a remainder of 1, 3, or 6 when divided by 8`,\n );\n }\n\n i += 7;\n for (; i < buffer.length; i += 8) {\n let x = (getByte(buffer[i - 7]!, alphabet) << 19) |\n (getByte(buffer[i - 6]!, alphabet) << 14) |\n (getByte(buffer[i - 5]!, alphabet) << 9) |\n (getByte(buffer[i - 4]!, alphabet) << 4);\n buffer[o++] = x >> 16;\n buffer[o++] = x >> 8 & 0xFF;\n x = (x << 16) |\n (getByte(buffer[i - 3]!, alphabet) << 15) |\n (getByte(buffer[i - 2]!, alphabet) << 10) |\n (getByte(buffer[i - 1]!, alphabet) << 5) |\n getByte(buffer[i]!, alphabet);\n buffer[o++] = x >> 16 & 0xFF;\n buffer[o++] = x >> 8 & 0xFF;\n buffer[o++] = x & 0xFF;\n }\n switch (i) {\n case buffer.length + 5: {\n const x = (getByte(buffer[i - 7]!, alphabet) << 19) |\n (getByte(buffer[i - 6]!, alphabet) << 14);\n buffer[o++] = x >> 16;\n break;\n }\n case buffer.length + 3: {\n const x = (getByte(buffer[i - 7]!, alphabet) << 19) |\n (getByte(buffer[i - 6]!, alphabet) << 14) |\n (getByte(buffer[i - 5]!, alphabet) << 9) |\n (getByte(buffer[i - 4]!, alphabet) << 4);\n buffer[o++] = x >> 16;\n buffer[o++] = x >> 8 & 0xFF;\n break;\n }\n case buffer.length + 2: {\n let x = (getByte(buffer[i - 7]!, alphabet) << 19) |\n (getByte(buffer[i - 6]!, alphabet) << 14) |\n (getByte(buffer[i - 5]!, alphabet) << 9) |\n (getByte(buffer[i - 4]!, alphabet) << 4);\n buffer[o++] = x >> 16;\n buffer[o++] = x >> 8 & 0xFF;\n x = (x << 16) |\n (getByte(buffer[i - 3]!, alphabet) << 15);\n buffer[o++] = x >> 16 & 0xFF;\n break;\n }\n case buffer.length: {\n let x = (getByte(buffer[i - 7]!, alphabet) << 19) |\n (getByte(buffer[i - 6]!, alphabet) << 14) |\n (getByte(buffer[i - 5]!, alphabet) << 9) |\n (getByte(buffer[i - 4]!, alphabet) << 4);\n buffer[o++] = x >> 16;\n buffer[o++] = x >> 8 & 0xFF;\n x = (x << 16) |\n (getByte(buffer[i - 3]!, alphabet) << 15) |\n (getByte(buffer[i - 2]!, alphabet) << 10) |\n (getByte(buffer[i - 1]!, alphabet) << 5);\n buffer[o++] = x >> 16 & 0xFF;\n buffer[o++] = x >> 8 & 0xFF;\n break;\n }\n }\n return o;\n}\n\nfunction getByte(char: number, alphabet: Uint8Array): number {\n const byte = alphabet[char] ?? 32;\n if (byte === 32) { // alphabet.Base32.length\n throw new TypeError(\n `Cannot decode input as base32: Invalid character (${\n String.fromCharCode(char)\n })`,\n );\n }\n return byte;\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nexport function detach(\n buffer: Uint8Array_,\n maxSize: number,\n): [Uint8Array_, number] {\n const originalSize = buffer.length;\n if (buffer.byteOffset) {\n const b = new Uint8Array(buffer.buffer);\n b.set(buffer);\n buffer = b.subarray(0, originalSize);\n }\n // deno-lint-ignore no-explicit-any\n buffer = new Uint8Array((buffer.buffer as any).transfer(maxSize));\n buffer.set(buffer.subarray(0, originalSize), maxSize - originalSize);\n return [buffer, maxSize - originalSize];\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// Copyright (c) 2014 Jameson Little. MIT License.\n// This module is browser compatible.\n\n/**\n * Utilities for\n * {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-6 | base32}\n * encoding and decoding.\n *\n * Modified from {@link https://github.com/beatgammit/base64-js}.\n *\n * ```ts\n * import { encodeBase32, decodeBase32 } from \"@std/encoding/base32\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeBase32(\"foobar\"), \"MZXW6YTBOI======\");\n *\n * assertEquals(\n * decodeBase32(\"MZXW6YTBOI======\"),\n * new TextEncoder().encode(\"foobar\")\n * );\n * ```\n *\n * @module\n */\n\nimport { calcSizeBase32, decode, encode } from \"./_common32.ts\";\nimport { detach } from \"./_common_detach.ts\";\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nconst padding = \"=\".charCodeAt(0);\nconst alphabet = new TextEncoder()\n .encode(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567\");\nconst rAlphabet = new Uint8Array(128).fill(32); //alphabet.length\nalphabet.forEach((byte, i) => rAlphabet[byte] = i);\n\n/**\n * Converts data into a base32-encoded string.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-6}\n *\n * @param data The data to encode.\n * @returns The base32-encoded string.\n *\n * @example Usage\n * ```ts\n * import { encodeBase32 } from \"@std/encoding/base32\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeBase32(\"6c60c0\"), \"GZRTMMDDGA======\");\n * ```\n */\nexport function encodeBase32(data: ArrayBuffer | Uint8Array | string): string {\n if (typeof data === \"string\") {\n data = new TextEncoder().encode(data) as Uint8Array_;\n } else if (data instanceof ArrayBuffer) data = new Uint8Array(data).slice();\n else data = data.slice();\n const [output, i] = detach(\n data as Uint8Array_,\n calcSizeBase32((data as Uint8Array_).length),\n );\n encode(output, i, 0, alphabet, padding);\n return new TextDecoder().decode(output);\n}\n\n/**\n * Decodes a base32-encoded string.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-6}\n *\n * @param b32 The base32-encoded string to decode.\n * @returns The decoded data.\n *\n * @example Usage\n * ```ts\n * import { decodeBase32 } from \"@std/encoding/base32\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * decodeBase32(\"GZRTMMDDGA======\"),\n * new TextEncoder().encode(\"6c60c0\"),\n * );\n * ```\n */\nexport function decodeBase32(b32: string): Uint8Array_ {\n const output = new TextEncoder().encode(b32) as Uint8Array_;\n if (output.length % 8) {\n throw new TypeError(\n `Invalid base32 string: length (${output.length}) must be a multiple of 8`,\n );\n }\n // deno-lint-ignore no-explicit-any\n return new Uint8Array((output.buffer as any)\n .transfer(decode(output, 0, 0, rAlphabet, padding)));\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/**\n * Utilities for\n * {@link https://datatracker.ietf.org/doc/html/draft-msporny-base58-03 | base58}\n * encoding and decoding.\n *\n * ```ts\n * import { encodeBase58, decodeBase58 } from \"@std/encoding/base58\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const hello = new TextEncoder().encode(\"Hello World!\");\n *\n * assertEquals(encodeBase58(hello), \"2NEpo7TZRRrLZSi2U\");\n *\n * assertEquals(decodeBase58(\"2NEpo7TZRRrLZSi2U\"), hello);\n * ```\n *\n * @module\n */\n\nimport { validateBinaryLike } from \"./_validate_binary_like.ts\";\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\n// deno-fmt-ignore\nconst mapBase58: Record<string, number> = {\n \"1\": 0, \"2\": 1, \"3\": 2, \"4\": 3, \"5\": 4, \"6\": 5, \"7\": 6, \"8\": 7, \"9\": 8, A: 9,\n B: 10, C: 11, D: 12, E: 13, F: 14, G: 15, H: 16, J: 17, K: 18, L: 19, M: 20,\n N: 21, P: 22, Q: 23, R: 24, S: 25, T: 26, U: 27, V: 28, W: 29, X: 30, Y: 31,\n Z: 32, a: 33, b: 34, c: 35, d: 36, e: 37, f: 38, g: 39, h: 40, i: 41, j: 42,\n k: 43, m: 44, n: 45, o: 46, p: 47, q: 48, r: 49, s: 50, t: 51, u: 52, v: 53,\n w: 54, x: 55, y: 56, z: 57\n};\n\nconst base58alphabet =\n \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\".split(\"\");\n\n/**\n * Converts data into a base58-encoded string.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/draft-msporny-base58-03#section-3}\n *\n * @param data The data to encode.\n * @returns The base58-encoded string.\n *\n * @example Usage\n * ```ts\n * import { encodeBase58 } from \"@std/encoding/base58\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeBase58(\"Hello World!\"), \"2NEpo7TZRRrLZSi2U\");\n * ```\n */\nexport function encodeBase58(data: ArrayBuffer | Uint8Array | string): string {\n const uint8tData = validateBinaryLike(data);\n\n let length = 0;\n let zeroes = 0;\n\n // Counting leading zeroes\n let index = 0;\n while (uint8tData[index] === 0) {\n zeroes++;\n index++;\n }\n\n const notZeroUint8Data = uint8tData.slice(index);\n\n const size = Math.round((uint8tData.length * 138) / 100 + 1);\n const b58Encoding: number[] = [];\n\n notZeroUint8Data.forEach((byte) => {\n let i = 0;\n let carry = byte;\n\n for (\n let reverseIterator = size - 1;\n (carry > 0 || i < length) && reverseIterator !== -1;\n reverseIterator--, i++\n ) {\n carry += (b58Encoding[reverseIterator] ?? 0) * 256;\n b58Encoding[reverseIterator] = Math.round(carry % 58);\n carry = Math.floor(carry / 58);\n }\n\n length = i;\n });\n\n const strResult: string[] = Array.from({\n length: b58Encoding.length + zeroes,\n });\n\n if (zeroes > 0) {\n strResult.fill(\"1\", 0, zeroes);\n }\n\n b58Encoding.forEach((byteValue) =>\n strResult.push(base58alphabet[byteValue]!)\n );\n\n return strResult.join(\"\");\n}\n\n/**\n * Decodes a base58-encoded string.\n *\n * @see {@link https://datatracker.ietf.org/doc/html/draft-msporny-base58-03#section-4}\n *\n * @param b58 The base58-encoded string to decode.\n * @returns The decoded data.\n *\n * @example Usage\n * ```ts\n * import { decodeBase58 } from \"@std/encoding/base58\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * decodeBase58(\"2NEpo7TZRRrLZSi2U\"),\n * new TextEncoder().encode(\"Hello World!\")\n * );\n * ```\n */\nexport function decodeBase58(b58: string): Uint8Array_ {\n const splitInput = b58.trim().split(\"\");\n\n let length = 0;\n let ones = 0;\n\n // Counting leading ones\n let index = 0;\n while (splitInput[index] === \"1\") {\n ones++;\n index++;\n }\n\n const notZeroData = splitInput.slice(index);\n\n const size = Math.round((b58.length * 733) / 1000 + 1);\n const output: number[] = [];\n\n notZeroData.forEach((char, idx) => {\n let carry = mapBase58[char];\n let i = 0;\n\n if (carry === undefined) {\n throw new TypeError(\n `Invalid base58 char at index ${idx} with value ${char}`,\n );\n }\n\n for (\n let reverseIterator = size - 1;\n (carry > 0 || i < length) && reverseIterator !== -1;\n reverseIterator--, i++\n ) {\n carry += 58 * (output[reverseIterator] ?? 0);\n output[reverseIterator] = Math.round(carry % 256);\n carry = Math.floor(carry / 256);\n }\n\n length = i;\n });\n\n const validOutput = output.filter((item) => item !== undefined);\n\n if (ones > 0) {\n const onesResult = Array.from({ length: ones }).fill(0, 0, ones);\n\n return new Uint8Array([...onesResult, ...validOutput] as number[]);\n }\n\n return new Uint8Array(validOutput);\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nexport const padding = \"=\".charCodeAt(0);\nexport const alphabet: Record<Base64Alphabet, Uint8Array> = {\n base64: new TextEncoder()\n .encode(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"),\n base64url: new TextEncoder()\n .encode(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\"),\n};\nexport const rAlphabet: Record<Base64Alphabet, Uint8Array> = {\n base64: new Uint8Array(128).fill(64), // alphabet.base64.length\n base64url: new Uint8Array(128).fill(64),\n};\nalphabet.base64\n .forEach((byte, i) => rAlphabet.base64[byte] = i);\nalphabet.base64url\n .forEach((byte, i) => rAlphabet.base64url[byte] = i);\n\n/**\n * Options for encoding and decoding base64 strings.\n */\nexport interface Base64Options {\n /** The base64 alphabet. Defaults to \"base64\" */\n alphabet?: Base64Alphabet;\n}\n\n/**\n * The base64 alphabets.\n */\nexport type Base64Alphabet = \"base64\" | \"base64url\";\n\n/**\n * Calculate the output size needed to encode a given input size for\n * {@linkcode encodeIntoBase64}.\n *\n * @param originalSize The size of the input buffer.\n * @returns The size of the output buffer.\n *\n * @example Basic Usage\n * ```ts\n * import { assertEquals } from \"@std/assert\";\n * import { calcSizeBase64 } from \"@std/encoding/unstable-base64\";\n *\n * assertEquals(calcSizeBase64(1), 4);\n * ```\n */\nexport function calcSizeBase64(originalSize: number): number {\n return ((originalSize + 2) / 3 | 0) * 4;\n}\n\nexport function encode(\n buffer: Uint8Array_,\n i: number,\n o: number,\n alphabet: Uint8Array,\n padding: number,\n): number {\n i += 2;\n for (; i < buffer.length; i += 3) {\n const x = (buffer[i - 2]! << 16) | (buffer[i - 1]! << 8) | buffer[i]!;\n buffer[o++] = alphabet[x >> 18]!;\n buffer[o++] = alphabet[x >> 12 & 0x3F]!;\n buffer[o++] = alphabet[x >> 6 & 0x3F]!;\n buffer[o++] = alphabet[x & 0x3F]!;\n }\n switch (i) {\n case buffer.length + 1: {\n const x = buffer[i - 2]! << 16;\n buffer[o++] = alphabet[x >> 18]!;\n buffer[o++] = alphabet[x >> 12 & 0x3F]!;\n buffer[o++] = padding;\n buffer[o++] = padding;\n break;\n }\n case buffer.length: {\n const x = (buffer[i - 2]! << 16) | (buffer[i - 1]! << 8);\n buffer[o++] = alphabet[x >> 18]!;\n buffer[o++] = alphabet[x >> 12 & 0x3F]!;\n buffer[o++] = alphabet[x >> 6 & 0x3F]!;\n buffer[o++] = padding;\n break;\n }\n }\n return o;\n}\n\nexport function decode(\n buffer: Uint8Array_,\n i: number,\n o: number,\n alphabet: Uint8Array,\n padding: number,\n): number {\n for (let x = buffer.length - 2; x < buffer.length; ++x) {\n if (buffer[x] === padding) {\n for (let y = x + 1; y < buffer.length; ++y) {\n if (buffer[y] !== padding) {\n throw new TypeError(\n `Cannot decode input as base64: Invalid character (${\n String.fromCharCode(buffer[y]!)\n })`,\n );\n }\n }\n buffer = buffer.subarray(0, x);\n break;\n }\n }\n if ((buffer.length - o) % 4 === 1) {\n throw new RangeError(\n `Cannot decode input as base64: Length (${\n buffer.length - o\n }), excluding padding, must not have a remainder of 1 when divided by 4`,\n );\n }\n\n i += 3;\n for (; i < buffer.length; i += 4) {\n const x = (getByte(buffer[i - 3]!, alphabet) << 18) |\n (getByte(buffer[i - 2]!, alphabet) << 12) |\n (getByte(buffer[i - 1]!, alphabet) << 6) |\n getByte(buffer[i]!, alphabet);\n buffer[o++] = x >> 16;\n buffer[o++] = x >> 8 & 0xFF;\n buffer[o++] = x & 0xFF;\n }\n switch (i) {\n case buffer.length + 1: {\n const x = (getByte(buffer[i - 3]!, alphabet) << 18) |\n (getByte(buffer[i - 2]!, alphabet) << 12);\n buffer[o++] = x >> 16;\n break;\n }\n case buffer.length: {\n const x = (getByte(buffer[i - 3]!, alphabet) << 18) |\n (getByte(buffer[i - 2]!, alphabet) << 12) |\n (getByte(buffer[i - 1]!, alphabet) << 6);\n buffer[o++] = x >> 16;\n buffer[o++] = x >> 8 & 0xFF;\n break;\n }\n }\n return o;\n}\n\nfunction getByte(char: number, alphabet: Uint8Array): number {\n const byte = alphabet[char] ?? 64;\n if (byte === 64) { // alphabet.Base64.length\n throw new TypeError(\n `Cannot decode input as base64: Invalid character (${\n String.fromCharCode(char)\n })`,\n );\n }\n return byte;\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/**\n * Utilities for\n * {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-4 | base64}\n * encoding and decoding.\n *\n * ```ts\n * import {\n * encodeBase64,\n * decodeBase64,\n * } from \"@std/encoding/base64\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const foobar = new TextEncoder().encode(\"foobar\");\n *\n * assertEquals(encodeBase64(foobar), \"Zm9vYmFy\");\n * assertEquals(decodeBase64(\"Zm9vYmFy\"), foobar);\n * ```\n *\n * @module\n */\n\nimport { calcSizeBase64, decode, encode } from \"./_common64.ts\";\nimport { detach } from \"./_common_detach.ts\";\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nconst padding = \"=\".charCodeAt(0);\nconst alphabet = new TextEncoder()\n .encode(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\");\nconst rAlphabet = new Uint8Array(128).fill(64); // alphabet.length\nalphabet.forEach((byte, i) => rAlphabet[byte] = i);\n\n/**\n * Converts data into a base64-encoded string.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-4}\n *\n * @param data The data to encode.\n * @returns The base64-encoded string.\n *\n * @example Usage\n * ```ts\n * import { encodeBase64 } from \"@std/encoding/base64\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeBase64(\"foobar\"), \"Zm9vYmFy\");\n * ```\n */\nexport function encodeBase64(data: ArrayBuffer | Uint8Array | string): string {\n if (typeof data === \"string\") {\n data = new TextEncoder().encode(data) as Uint8Array_;\n } else if (data instanceof ArrayBuffer) data = new Uint8Array(data).slice();\n else data = data.slice();\n const [output, i] = detach(\n data as Uint8Array_,\n calcSizeBase64((data as Uint8Array_).length),\n );\n encode(output, i, 0, alphabet, padding);\n return new TextDecoder().decode(output);\n}\n\n/**\n * Decodes a base64-encoded string.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-4}\n *\n * @param b64 The base64-encoded string to decode.\n * @returns The decoded data.\n *\n * @example Usage\n * ```ts\n * import { decodeBase64 } from \"@std/encoding/base64\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * decodeBase64(\"Zm9vYmFy\"),\n * new TextEncoder().encode(\"foobar\")\n * );\n * ```\n */\nexport function decodeBase64(b64: string): Uint8Array_ {\n const output = new TextEncoder().encode(b64) as Uint8Array_;\n // deno-lint-ignore no-explicit-any\n return new Uint8Array((output.buffer as any)\n .transfer(decode(output, 0, 0, rAlphabet, padding)));\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/**\n * Utilities for\n * {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-5 | base64url}\n * encoding and decoding.\n *\n * @module\n */\n\nimport { calcSizeBase64, decode, encode } from \"./_common64.ts\";\nimport { detach } from \"./_common_detach.ts\";\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nconst padding = \"=\".charCodeAt(0);\nconst alphabet = new TextEncoder()\n .encode(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\");\nconst rAlphabet = new Uint8Array(128).fill(64); // alphabet.length\nalphabet.forEach((byte, i) => rAlphabet[byte] = i);\n\n/**\n * Convert data into a base64url-encoded string.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-5}\n *\n * @param data The data to encode.\n * @returns The base64url-encoded string.\n *\n * @example Usage\n * ```ts\n * import { encodeBase64Url } from \"@std/encoding/base64url\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeBase64Url(\"foobar\"), \"Zm9vYmFy\");\n * ```\n */\nexport function encodeBase64Url(\n data: ArrayBuffer | Uint8Array | string,\n): string {\n if (typeof data === \"string\") {\n data = new TextEncoder().encode(data) as Uint8Array_;\n } else if (data instanceof ArrayBuffer) data = new Uint8Array(data).slice();\n else data = data.slice();\n const [output, i] = detach(\n data as Uint8Array_,\n calcSizeBase64((data as Uint8Array_).length),\n );\n let o = encode(output, i, 0, alphabet, padding);\n o = output.indexOf(padding, o - 2);\n return new TextDecoder().decode(\n // deno-lint-ignore no-explicit-any\n o > 0 ? new Uint8Array((output.buffer as any).transfer(o)) : output,\n );\n}\n\n/**\n * Decodes a given base64url-encoded string.\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc4648.html#section-5}\n *\n * @param b64url The base64url-encoded string to decode.\n * @returns The decoded data.\n *\n * @example Usage\n * ```ts\n * import { decodeBase64Url } from \"@std/encoding/base64url\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * decodeBase64Url(\"Zm9vYmFy\"),\n * new TextEncoder().encode(\"foobar\")\n * );\n * ```\n */\nexport function decodeBase64Url(b64url: string): Uint8Array_ {\n const output = new TextEncoder().encode(b64url) as Uint8Array_;\n // deno-lint-ignore no-explicit-any\n return new Uint8Array((output.buffer as any)\n .transfer(decode(output, 0, 0, rAlphabet, padding)));\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nexport const alphabet = new TextEncoder().encode(\"0123456789abcdef\");\nexport const rAlphabet = new Uint8Array(128).fill(16); // alphabet.Hex.length\nalphabet.forEach((byte, i) => rAlphabet[byte] = i);\nnew TextEncoder()\n .encode(\"ABCDEF\")\n .forEach((byte, i) => rAlphabet[byte] = i + 10);\n\n/**\n * Calculate the output size needed to encode a given input size for\n * {@linkcode encodeIntoHex}.\n *\n * @param originalSize The size of the input buffer.\n * @returns The size of the output buffer.\n *\n * @example Basic Usage\n * ```ts\n * import { assertEquals } from \"@std/assert\";\n * import { calcSizeHex } from \"@std/encoding/unstable-hex\";\n *\n * assertEquals(calcSizeHex(1), 2);\n * ```\n */\nexport function calcSizeHex(originalSize: number): number {\n return originalSize * 2;\n}\n\nexport function encode(\n buffer: Uint8Array_,\n i: number,\n o: number,\n alphabet: Uint8Array,\n): number {\n for (; i < buffer.length; ++i) {\n const x = buffer[i]!;\n buffer[o++] = alphabet[x >> 4]!;\n buffer[o++] = alphabet[x & 0xF]!;\n }\n return o;\n}\n\nexport function decode(\n buffer: Uint8Array_,\n i: number,\n o: number,\n alphabet: Uint8Array,\n): number {\n if ((buffer.length - o) % 2 === 1) {\n throw new RangeError(\n `Cannot decode input as hex: Length (${\n buffer.length - o\n }) must be divisible by 2`,\n );\n }\n\n i += 1;\n for (; i < buffer.length; i += 2) {\n buffer[o++] = (getByte(buffer[i - 1]!, alphabet) << 4) |\n getByte(buffer[i]!, alphabet);\n }\n return o;\n}\n\nfunction getByte(char: number, alphabet: Uint8Array): number {\n const byte = alphabet[char] ?? 16;\n if (byte === 16) { // alphabet.Hex.length\n throw new TypeError(\n `Cannot decode input as hex: Invalid character (${\n String.fromCharCode(char)\n })`,\n );\n }\n return byte;\n}\n", "// Copyright 2009 The Go Authors. All rights reserved.\n// https://github.com/golang/go/blob/master/LICENSE\n// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/**\n * Port of the Go\n * {@link https://github.com/golang/go/blob/go1.12.5/src/encoding/hex/hex.go | encoding/hex}\n * library.\n *\n * ```ts\n * import {\n * decodeHex,\n * encodeHex,\n * } from \"@std/encoding/hex\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeHex(\"abc\"), \"616263\");\n *\n * assertEquals(\n * decodeHex(\"616263\"),\n * new TextEncoder().encode(\"abc\"),\n * );\n * ```\n *\n * @module\n */\n\nimport { calcSizeHex, decode, encode } from \"./_common16.ts\";\nimport { detach } from \"./_common_detach.ts\";\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\nconst alphabet = new TextEncoder()\n .encode(\"0123456789abcdef\");\nconst rAlphabet = new Uint8Array(128).fill(16); // alphabet.length\nalphabet.forEach((byte, i) => rAlphabet[byte] = i);\nnew TextEncoder()\n .encode(\"ABCDEF\")\n .forEach((byte, i) => rAlphabet[byte] = i + 10);\n\n/**\n * Converts data into a hex-encoded string.\n *\n * @param src The data to encode.\n *\n * @returns The hex-encoded string.\n *\n * @example Usage\n * ```ts\n * import { encodeHex } from \"@std/encoding/hex\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeHex(\"abc\"), \"616263\");\n * ```\n */\nexport function encodeHex(src: string | Uint8Array | ArrayBuffer): string {\n if (typeof src === \"string\") {\n src = new TextEncoder().encode(src) as Uint8Array_;\n } else if (src instanceof ArrayBuffer) src = new Uint8Array(src).slice();\n else src = src.slice();\n const [output, i] = detach(\n src as Uint8Array_,\n calcSizeHex((src as Uint8Array_).length),\n );\n encode(output, i, 0, alphabet);\n return new TextDecoder().decode(output);\n}\n\n/**\n * Decodes the given hex-encoded string. If the input is malformed, an error is\n * thrown.\n *\n * @param src The hex-encoded string to decode.\n *\n * @returns The decoded data.\n *\n * @example Usage\n * ```ts\n * import { decodeHex } from \"@std/encoding/hex\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(\n * decodeHex(\"616263\"),\n * new TextEncoder().encode(\"abc\"),\n * );\n * ```\n */\nexport function decodeHex(src: string): Uint8Array_ {\n const output = new TextEncoder().encode(src) as Uint8Array_;\n // deno-lint-ignore no-explicit-any\n return new Uint8Array((output.buffer as any)\n .transfer(decode(output, 0, 0, rAlphabet)));\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// Copyright 2020 Keith Cirkel. All rights reserved. MIT license.\n// Copyright 2023 Skye \"MierenManz\". All rights reserved. MIT license.\n/**\n * Utilities for {@link https://protobuf.dev/programming-guides/encoding/#varints Varint} encoding\n * of typed integers. Varint encoding represents integers using a variable number of bytes, with\n * smaller values requiring fewer bytes.\n *\n * ```ts\n * import { encodeVarint, decodeVarint } from \"@std/encoding/varint\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const buf = new Uint8Array(10);\n * assertEquals(\n * encodeVarint(42n, buf),\n * [new Uint8Array([42]), 1]\n * );\n *\n * assertEquals(\n * decodeVarint(new Uint8Array([42])),\n * [ 42n, 1 ]\n * );\n * ```\n *\n * @module\n */\n\n// This implementation is a port of https://deno.land/x/varint@v2.0.0 by @keithamus\n// This module is browser compatible.\n\nimport type { Uint8Array_ } from \"./_types.ts\";\nexport type { Uint8Array_ };\n\n/**\n * The maximum value of an unsigned 64-bit integer.\n * Equivalent to `2n**64n - 1n`\n */\nexport const MaxUint64 = 18446744073709551615n;\n\n/**\n * The maximum length, in bytes, of a Varint encoded 64-bit integer.\n */\nexport const MaxVarintLen64 = 10;\n/**\n * The maximum length, in bytes, of a Varint encoded 32-bit integer.\n */\nexport const MaxVarintLen32 = 5;\n\nconst MSB = 0x80;\nconst REST = 0x7f;\nconst SHIFT = 7;\nconst MSBN = 0x80n;\nconst SHIFTN = 7n;\n\n// ArrayBuffer and TypedArray's for \"pointer casting\"\nconst AB = new ArrayBuffer(8);\nconst U32_VIEW = new Uint32Array(AB);\nconst U64_VIEW = new BigUint64Array(AB);\n\n/**\n * Given a non empty `buf`, starting at `offset` (default: 0), begin decoding bytes as\n * Varint encoded bytes, for a maximum of 10 bytes (offset + 10). The returned\n * tuple is of the decoded varint 32-bit number, and the new offset with which\n * to continue decoding other data.\n *\n * If a `bigint` in return is undesired, the `decode32` function will return a\n * `number`, but this should only be used in cases where the varint is\n * _assured_ to be 32-bits. If in doubt, use `decode()`.\n *\n * To know how many bytes the Varint took to encode, simply negate `offset`\n * from the returned new `offset`.\n *\n * @param buf The buffer to decode from.\n * @param offset The offset to start decoding from.\n * @returns A tuple of the decoded varint 64-bit number, and the new offset.\n *\n * @example Usage\n * ```ts\n * import { decodeVarint } from \"@std/encoding/varint\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const buf = new Uint8Array([0x8E, 0x02]);\n * assertEquals(decodeVarint(buf), [270n, 2]);\n * ```\n */\nexport function decodeVarint(buf: Uint8Array, offset = 0): [bigint, number] {\n // Clear the last result from the Two's complement view\n U64_VIEW[0] = 0n;\n\n // Setup the initiat state of the function\n let intermediate = 0;\n let position = 0;\n let i = offset;\n\n // If the buffer is empty Throw\n if (buf.length === 0) throw new RangeError(\"Cannot read empty buffer\");\n\n let byte;\n do {\n // Get a single byte from the buffer\n byte = buf[i]!;\n\n // 1. Take the lower 7 bits of the byte.\n // 2. Shift the bits into the correct position.\n // 3. Bitwise OR it with the intermediate value\n // QUIRK: in the 5th (and 10th) iteration of this loop it will overflow on the shift.\n // This causes only the lower 4 bits to be shifted into place and removing the upper 3 bits\n intermediate |= (byte & 0b01111111) << position;\n\n // If position is 28\n // it means that this iteration needs to be written the the two's complement view\n // This only happens once due to the `-4` in this branch\n if (position === 28) {\n // Write to the view\n U32_VIEW[0] = intermediate;\n // set `intermediate` to the remaining 3 bits\n // We only want the remaining three bits because the other 4 have been \"consumed\" on line 21\n intermediate = (byte & 0b01110000) >>> 4;\n // set `position` to -4 because later 7 will be added, making it 3\n position = -4;\n }\n\n // Increment the shift position by 7\n position += 7;\n // Increment the iterator by 1\n i++;\n // Keep going while there is a continuation bit\n } while ((byte & 0b10000000) === 0b10000000);\n // subtract the initial offset from `i` to get the bytes read\n const nRead = i - offset;\n\n // If 10 bytes have been read and intermediate has overflown\n // it means that the varint is malformed\n // If 11 bytes have been read it means that the varint is malformed\n // If `i` is bigger than the buffer it means we overread the buffer and the varint is malformed\n if ((nRead === 10 && intermediate > -1) || nRead === 11 || i > buf.length) {\n throw new RangeError(\n \"Cannot decode the varint input: Malformed or overflow varint\",\n );\n }\n\n // Write the intermediate value to the \"empty\" slot\n // if the first slot is taken. Take the second slot\n U32_VIEW[Number(nRead > 4)] = intermediate;\n\n return [U64_VIEW[0], i];\n}\n\n/**\n * Given a `buf`, starting at `offset` (default: 0), begin decoding bytes as\n * Varint encoded bytes, for a maximum of 5 bytes (offset + 5). The returned\n * tuple is of the decoded varint 32-bit number, and the new offset with which\n * to continue decoding other data.\n *\n * Varints are _not 32-bit by default_ so this should only be used in cases\n * where the varint is _assured_ to be 32-bits. If in doubt, use `decode()`.\n *\n * To know how many bytes the Varint took to encode, simply negate `offset`\n * from the returned new `offset`.\n *\n * @param buf The buffer to decode from.\n * @param offset The offset to start decoding from.\n * @returns A tuple of the decoded varint 32-bit number, and the new offset.\n *\n * @example Usage\n * ```ts\n * import { decodeVarint32 } from \"@std/encoding/varint\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const buf = new Uint8Array([0x8E, 0x02]);\n * assertEquals(decodeVarint32(buf), [270, 2]);\n * ```\n */\nexport function decodeVarint32(buf: Uint8Array, offset = 0): [number, number] {\n let shift = 0;\n let decoded = 0;\n for (\n let i = offset;\n i <= Math.min(buf.length, offset + MaxVarintLen32);\n i += 1, shift += SHIFT\n ) {\n const byte = buf[i]!;\n decoded += (byte & REST) * Math.pow(2, shift);\n if (!(byte & MSB)) return [decoded, i + 1];\n }\n throw new RangeError(\n \"Cannot decode the varint input: Malformed or overflow varint\",\n );\n}\n\n/**\n * Takes unsigned number `num` and converts it into a Varint encoded\n * `Uint8Array`, returning a tuple consisting of a `Uint8Array` slice of the\n * encoded Varint, and an offset where the Varint encoded bytes end within the\n * `Uint8Array`.\n *\n * If `buf` is not given then a Uint8Array will be created.\n * `offset` defaults to `0`.\n *\n * If passed `buf` then that will be written into, starting at `offset`. The\n * resulting returned `Uint8Array` will be a slice of `buf`. The resulting\n * returned number is effectively `offset + bytesWritten`.\n *\n * @param num The number to encode.\n * @param buf The buffer to write into.\n * @param offset The offset to start writing at.\n * @returns A tuple of the encoded Varint `Uint8Array` and the new offset.\n *\n * @example Usage\n * ```ts\n * import { encodeVarint } from \"@std/encoding/varint\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const buf = new Uint8Array(10);\n * assertEquals(encodeVarint(42n, buf), [new Uint8Array([42]), 1]);\n * ```\n */\nexport function encodeVarint(\n num: bigint | number,\n buf: Uint8Array = new Uint8Array(MaxVarintLen64),\n offset = 0,\n): [Uint8Array_, number] {\n num = BigInt(num);\n if (num < 0n) {\n throw new RangeError(\n `Cannot encode the input into varint as it should be non-negative integer: received ${num}`,\n );\n }\n for (\n let i = offset;\n i <= Math.min(buf.length, MaxVarintLen64);\n i += 1\n ) {\n if (num < MSBN) {\n buf[i] = Number(num);\n i += 1;\n return [buf.slice(offset, i), i];\n }\n buf[i] = Number((num & 0xFFn) | MSBN);\n num >>= SHIFTN;\n }\n throw new RangeError(\n `Cannot encode the input ${num} into varint as it overflows uint64`,\n );\n}\n", "// Copyright 2018-2025 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/**\n * Utilities for encoding and decoding common formats like hex, base64, and varint.\n *\n * ## Basic Usage\n *\n * ```ts\n * import { encodeBase64, decodeBase64 } from \"@std/encoding\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const foobar = new TextEncoder().encode(\"foobar\");\n * assertEquals(encodeBase64(foobar), \"Zm9vYmFy\");\n * assertEquals(decodeBase64(\"Zm9vYmFy\"), foobar);\n * ```\n *\n * ## Various Encoding Formats\n *\n * ```ts\n * import {\n * encodeHex,\n * encodeBase32,\n * encodeBase58,\n * encodeBase64,\n * encodeAscii85,\n * decodeHex,\n * decodeBase32,\n * decodeBase58,\n * decodeBase64,\n * decodeAscii85,\n * } from \"@std/encoding\";\n * import { assertEquals } from \"@std/assert\";\n *\n * // Many different encodings for different character sets\n * assertEquals(encodeHex(\"Hello world!\"), \"48656c6c6f20776f726c6421\");\n * assertEquals(encodeBase32(\"Hello world!\"), \"JBSWY3DPEB3W64TMMQQQ====\");\n * assertEquals(encodeBase58(\"Hello world!\"), \"2NEpo7TZRhna7vSvL\");\n * assertEquals(encodeBase64(\"Hello world!\"), \"SGVsbG8gd29ybGQh\");\n * assertEquals(encodeAscii85(\"Hello world!\"), \"87cURD]j7BEbo80\");\n *\n * // Decoding\n * assertEquals(new TextDecoder().decode(decodeHex(\"48656c6c6f20776f726c6421\")), \"Hello world!\");\n * assertEquals(new TextDecoder().decode(decodeBase32(\"JBSWY3DPEB3W64TMMQQQ====\")), \"Hello world!\");\n * assertEquals(new TextDecoder().decode(decodeBase58(\"2NEpo7TZRhna7vSvL\")), \"Hello world!\");\n * assertEquals(new TextDecoder().decode(decodeBase64(\"SGVsbG8gd29ybGQh\")), \"Hello world!\");\n * assertEquals(new TextDecoder().decode(decodeAscii85(\"87cURD]j7BEbo80\")), \"Hello world!\");\n * ```\n *\n * ## URL-Safe Base64\n *\n * ```ts\n * import { encodeBase64, encodeBase64Url } from \"@std/encoding\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(encodeBase64(\"ice creams\"), \"aWNlIGNyZWFtcw==\"); // Not url-safe because of `=`\n * assertEquals(encodeBase64Url(\"ice creams\"), \"aWNlIGNyZWFtcw\"); // URL-safe!\n *\n * // Base64Url replaces + with - and / with _\n * assertEquals(encodeBase64(\"subjects?\"), \"c3ViamVjdHM/\"); // slash is not URL-safe\n * assertEquals(encodeBase64Url(\"subjects?\"), \"c3ViamVjdHM_\"); // _ is URL-safe\n * ```\n *\n * ## Binary Data Encoding\n *\n * ```ts\n * import { encodeHex, encodeBase64 } from \"@std/encoding\";\n * import { assertEquals } from \"@std/assert\";\n *\n * // Working with binary data\n * const binaryData = new Uint8Array([0xDE, 0xAD, 0xBE, 0xEF]);\n * assertEquals(encodeHex(binaryData), \"deadbeef\");\n * assertEquals(encodeBase64(binaryData), \"3q2+7w==\");\n * ```\n *\n * ## Varint Encoding\n *\n * Learn more from the [protobuf Varint encoding docs](https://protobuf.dev/programming-guides/encoding/#varints).\n *\n * ```ts\n * import { encodeVarint, decodeVarint } from \"@std/encoding\";\n * import { assertEquals } from \"@std/assert\";\n *\n * // Varint encoding support\n * assertEquals(encodeVarint(9601n), [new Uint8Array([129, 75]), 2]);\n *\n * // Decode a varint\n * const bytes = new Uint8Array([129, 75]);\n * assertEquals(decodeVarint(bytes), [9601n, 2]);\n * ```\n *\n * @module\n */\n\nexport * from \"./ascii85.ts\";\nexport * from \"./base32.ts\";\nexport * from \"./base58.ts\";\nexport * from \"./base64.ts\";\nexport * from \"./base64url.ts\";\nexport * from \"./hex.ts\";\nexport * from \"./varint.ts\";\n", "export * from \"npm:@babel/generator@^8.0.0-rc.5\";\nexport { default } from \"npm:@babel/generator@^8.0.0-rc.5\";\n", "export * from \"npm:@babel/traverse@^8.0.0-rc.5\";\nexport { default } from \"npm:@babel/traverse@^8.0.0-rc.5\";\n", "import type {\n FlowPluginOptions,\n ParserOptions,\n ParserPlugin,\n PipelineOperatorPluginOptions,\n TypeScriptPluginOptions,\n} from \"npm:@babel/parser@^8.0.0-rc.5\";\n\nexport type ParserPluginName =\n | Extract<ParserPlugin, string>\n | Extract<ParserPlugin, [string, object]>[0];\n\ntype ParserPluginOptions = Extract<ParserPlugin, [string, object]>[1];\n\nconst DefaultParserPlugins = new Set<ParserPlugin>([\n \"asyncDoExpressions\",\n \"decorators\",\n \"decorators-legacy\",\n \"decoratorAutoAccessors\",\n \"deferredImportEvaluation\",\n \"destructuringPrivate\",\n \"doExpressions\",\n \"exportDefaultFrom\",\n \"functionBind\",\n \"functionSent\",\n \"importMeta\",\n \"jsx\",\n \"moduleBlocks\",\n \"sourcePhaseImports\",\n \"throwExpressions\",\n \"v8intrinsic\",\n [\"discardBinding\", { syntaxType: \"void\" }],\n [\"optionalChainingAssign\", { version: \"2023-07\" }],\n [\"partialApplication\", { version: \"2018-07\" }],\n [\"pipelineOperator\", { proposal: \"fsharp\" }],\n]);\n\nexport function isParserPluginName(name: string): name is ParserPluginName {\n for (const plugin of DefaultParserPlugins) {\n if (name === getPluginName(plugin)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Builds options for `@babel/parser` by enabling as many features as possible,\n * while also preserving the options given as an argument.\n */\nexport function buildOptions({\n sourceType = \"unambiguous\",\n allowAwaitOutsideFunction = true,\n allowImportExportEverywhere = true,\n allowReturnOutsideFunction = true,\n allowSuperOutsideMethod = true,\n allowUndeclaredExports = true,\n plugins = [],\n sourceFilename,\n ...rest\n}: ParserOptions = {}): ParserOptions {\n for (const plugin of DefaultParserPlugins) {\n if (shouldAddPlugin(plugins, plugin)) {\n plugins = [...plugins, plugin];\n }\n }\n\n const typePlugin = typePluginForSourceFileName(sourceFilename);\n\n if (shouldAddPlugin(plugins, typePlugin)) {\n plugins = [...plugins, typePlugin];\n }\n\n return {\n sourceType,\n allowAwaitOutsideFunction,\n allowImportExportEverywhere,\n allowReturnOutsideFunction,\n allowSuperOutsideMethod,\n allowUndeclaredExports,\n plugins,\n sourceFilename,\n ...rest,\n };\n}\n\n/**\n * Gets the type plugin to use for a given file name.\n *\n * @example\n *\n * typePluginForSourceFileName('index.ts'); // 'typescript'\n * typePluginForSourceFileName('index.jsx'); // 'flow'\n */\nfunction typePluginForSourceFileName(\n sourceFileName?: string,\n): \"flow\" | \"typescript\" {\n if (typeof sourceFileName === \"string\" && !/\\.tsx?$/i.test(sourceFileName)) {\n return \"flow\";\n } else {\n return \"typescript\";\n }\n}\n\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"discardBinding\",\n): { syntaxType: \"void\" } | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"estree\",\n): { classFeatures?: boolean } | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"optionalChainingAssign\",\n): { version: \"2023-07\" } | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"partialApplication\",\n): { version: \"2018-07\" } | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"pipelineOperator\",\n): PipelineOperatorPluginOptions | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"flow\",\n): FlowPluginOptions | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: \"typescript\",\n): TypeScriptPluginOptions | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: ParserPluginName,\n): ParserPluginOptions | undefined;\nfunction getPluginOptions(\n plugins: Array<ParserPlugin>,\n name: ParserPluginName,\n): ParserPluginOptions | undefined {\n for (const plugin of plugins) {\n if (Array.isArray(plugin)) {\n if (plugin[0] === name) {\n return plugin[1];\n }\n } else if (plugin === name) {\n return {};\n }\n }\n}\n\n/**\n * Determines whether a plugin list can accept a new plugin by name.\n *\n * @example\n *\n * shouldAddPlugin([], 'jsx'); // true; existing list does not have \"jsx\"\n * shouldAddPlugin(['jsx', 'bigInt'], 'jsx'); // false; existing list already has \"jsx\"\n * shouldAddPlugin(['flow'], 'typescript'); // false; \"typescript\" is incompatible with \"flow\"\n */\nfunction shouldAddPlugin(\n plugins: Array<ParserPlugin>,\n plugin: ParserPlugin,\n): boolean {\n const name = getPluginName(plugin);\n\n if (pluginListIncludesPlugin(plugins, name)) {\n return false;\n }\n\n switch (name) {\n case \"flow\":\n case \"flowComments\":\n return !getPluginOptions(plugins, \"typescript\");\n\n case \"typescript\":\n return !(\n getPluginOptions(plugins, \"flow\") ||\n getPluginOptions(plugins, \"flowComments\")\n );\n\n case \"decorators\":\n return !getPluginOptions(plugins, \"decorators-legacy\");\n\n case \"decorators-legacy\":\n return !getPluginOptions(plugins, \"decorators\");\n\n case \"v8intrinsic\":\n return !getPluginOptions(plugins, \"placeholders\");\n\n case \"placeholders\":\n return !getPluginOptions(plugins, \"v8intrinsic\");\n\n default:\n return true;\n }\n}\n\n/**\n * Checks `plugins` for an entry named `name`.\n *\n * @example\n *\n * pluginListIncludesPlugin(['jsx', 'bigInt'], 'bigInt'); // true; list includes \"bigInt\" without options\n * pluginListIncludesPlugin(['jsx', 'bigInt'], 'flow'); // false; list does not include \"flow\"\n * pluginListIncludesPlugin(['jsx', ['flow', { all: true }]], 'flow'); // true; list includes \"flow\" with options\n */\nfunction pluginListIncludesPlugin(\n plugins: Array<ParserPlugin>,\n name: ParserPluginName,\n): boolean {\n return plugins.some((entry) => getPluginName(entry) === name);\n}\n\n/**\n * Gets the name of `plugin`.\n *\n * @example\n *\n * getPluginName('decorators'); // 'decorators'\n * getPluginName(['flow', { all: true }]); // 'flow'\n */\nexport function getPluginName(plugin: ParserPlugin): ParserPluginName {\n return typeof plugin === \"string\" ? plugin : plugin[0];\n}\n", "import type * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport * as babel from \"npm:@babel/parser@^8.0.0-rc.5\";\nimport { buildOptions } from \"./lib/options.ts\";\n\nexport {\n buildOptions,\n isParserPluginName,\n type ParserPluginName,\n} from \"./lib/options.ts\";\n\n/**\n * Wraps `parse` from `@babel/parser`, but sets default options such that as few\n * restrictions as possible are placed on the `input` code.\n */\nexport function parse(input: string, options?: babel.ParserOptions): t.File {\n return babel.parse(input, buildOptions(options));\n}\n\n/**\n * Wraps `parseExpression` from `@babel/parser`, but sets default options such that as few\n * restrictions as possible are placed on the `input` code.\n */\nexport function parseExpression(\n input: string,\n options?: babel.ParserOptions,\n): babel.ParseResult<t.Expression> {\n return babel.parseExpression(input, buildOptions(options));\n}\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as generator from \"jsr:/@codemod/utils@^2.2.1/babel-generator\";\nimport traverse, {\n type TraverseOptions,\n type Visitor,\n visitors,\n} from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport { parse as codemodParse } from \"jsr:@codemod/parser@^2.1.0\";\nimport type {\n AsyncTransform,\n Transform,\n TransformState,\n} from \"../webcrack/ast-utils/transform.ts\";\nimport { createDebug } from \"npm:obug@^2.1.2\";\n\nconst logger = createDebug(\"delance:transforms\");\n\nexport function parse(code: string) {\n return codemodParse(code, {\n sourceType: \"script\",\n allowReturnOutsideFunction: true,\n });\n}\n\nexport function generate(ast: t.Node): string {\n return generator.generate(ast, {\n jsescOption: { minimal: true, quotes: \"single\" },\n }).code;\n}\n\nexport async function applyTransformAsync<TOptions>(\n ast: t.Node,\n transform: AsyncTransform<TOptions>,\n options?: TOptions,\n): Promise<TransformState> {\n logger(`${transform.name}: started`);\n const state: TransformState = { changes: 0 };\n\n await transform.run?.(ast, state, options);\n if (transform.visitor) {\n traverse(ast, transform.visitor(options), undefined, state);\n }\n\n logger(`${transform.name}: finished with ${state.changes} changes`);\n return state;\n}\n\nexport function applyTransform<TOptions>(\n ast: t.Node,\n transform: Transform<TOptions>,\n options?: TOptions,\n noScopeOverride?: boolean,\n): TransformState {\n logger(`${transform.name}: started`);\n const state: TransformState = { changes: 0 };\n transform.run?.(ast, state, options);\n\n if (transform.visitor) {\n const visitor = transform.visitor(options);\n visitor.noScope = noScopeOverride ?? !transform.scope;\n traverse(ast, visitor, undefined, state);\n }\n\n logger(`${transform.name}: finished with ${state.changes} changes`);\n return state;\n}\n\nexport function applyTransforms(\n ast: t.Node,\n transforms: Transform[],\n options: { noScope?: boolean; name?: string; log?: boolean } = {},\n): TransformState {\n options.log ??= true;\n const name = options.name ?? transforms.map((t) => t.name).join(\", \");\n if (options.log) {\n logger(`${name}: started`);\n }\n\n const state: TransformState = { changes: 0 };\n\n for (const transform of transforms) {\n transform.run?.(ast, state);\n }\n\n const traverseOptions = transforms.flatMap((t) => t.visitor?.() ?? []);\n if (traverseOptions.length > 0) {\n const visitor: TraverseOptions & Visitor<TransformState> = visitors.merge(\n traverseOptions,\n );\n visitor.noScope = options.noScope ?? transforms.every((t) => !t.scope);\n traverse(ast, visitor, undefined, state);\n }\n\n if (options.log) {\n logger(`${name}: finished with ${state.changes} changes`);\n }\n\n return state;\n}\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport traverse, {\n type TraverseOptions,\n type Visitor,\n visitors,\n} from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport { createDebug } from \"npm:obug@^2.1.2\";\n\nconst logger = createDebug(\"webcrack:transforms\");\n\nexport async function applyTransformAsync<TOptions>(\n ast: t.Node,\n transform: AsyncTransform<TOptions>,\n options?: TOptions,\n): Promise<TransformState> {\n logger(`${transform.name}: started`);\n const state: TransformState = { changes: 0 };\n\n await transform.run?.(ast, state, options);\n if (transform.visitor) {\n traverse(ast, transform.visitor(options), undefined, state);\n }\n\n logger(`${transform.name}: finished with ${state.changes} changes`);\n return state;\n}\n\nexport function applyTransform<TOptions>(\n ast: t.Node,\n transform: Transform<TOptions>,\n options?: TOptions,\n): TransformState {\n logger(`${transform.name}: started`);\n const state: TransformState = { changes: 0 };\n transform.run?.(ast, state, options);\n\n if (transform.visitor) {\n const visitor = transform.visitor(\n options,\n );\n visitor.noScope = !transform.scope;\n traverse(ast, visitor, undefined, state);\n }\n\n logger(`${transform.name}: finished with ${state.changes} changes`);\n return state;\n}\n\nexport function applyTransforms(\n ast: t.Node,\n transforms: Transform[],\n options: { noScope?: boolean; name?: string; log?: boolean } = {},\n): TransformState {\n options.log ??= true;\n const name = options.name ?? transforms.map((t) => t.name).join(\", \");\n if (options.log) logger(`${name}: started`);\n const state: TransformState = { changes: 0 };\n\n for (const transform of transforms) {\n transform.run?.(ast, state);\n }\n\n const traverseOptions = transforms.flatMap((t) => t.visitor?.() ?? []);\n if (traverseOptions.length > 0) {\n const visitor: TraverseOptions & Visitor<TransformState> = visitors.merge(\n traverseOptions,\n );\n visitor.noScope = options.noScope || transforms.every((t) => !t.scope);\n traverse(ast, visitor, undefined, state);\n }\n\n if (options.log) logger(`${name}: finished with ${state.changes} changes`);\n return state;\n}\n\nexport function mergeTransforms(options: {\n name: string;\n tags: Tag[];\n transforms: Transform[];\n}): Transform {\n return {\n name: options.name,\n tags: options.tags,\n scope: options.transforms.some((t) => t.scope),\n visitor() {\n return visitors.merge(\n options.transforms.flatMap((t) => t.visitor?.() ?? []),\n );\n },\n };\n}\n\nexport interface TransformState {\n changes: number;\n}\n\nexport interface Transform<TOptions = unknown> {\n name: string;\n tags: Tag[];\n scope?: boolean;\n run?: (ast: t.Node, state: TransformState, options?: TOptions) => void;\n visitor?: (options?: TOptions) => TraverseOptions & Visitor<TransformState>;\n}\n\nexport interface AsyncTransform<TOptions = unknown> extends\n Omit<\n Transform<TOptions>,\n \"run\"\n > {\n run?: (\n ast: t.Node,\n state: TransformState,\n options?: TOptions,\n ) => Promise<void>;\n}\n\nexport type Tag = \"safe\" | \"unsafe\";\n", "export * from \"npm:@babel/types@^8.0.0-rc.5\";\n", "export class Matcher<T> {\n match(value: unknown, keys: ReadonlyArray<PropertyKey> = []): value is T {\n return this.matchValue(value, keys);\n }\n\n matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is T {\n void value;\n void keys;\n throw new Error(`${this.constructor.name}#matchValue is not implemented`);\n }\n}\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { Matcher } from \"./Matcher.ts\";\n\nexport class AnyExpressionMatcher extends Matcher<t.Expression> {\n override matchValue(value: unknown): value is t.Expression {\n return t.isNode(value) && t.isExpression(value);\n }\n}\n\nexport function anyExpression(): Matcher<t.Expression> {\n return new AnyExpressionMatcher();\n}\n", "import type { SliceMatcher } from \"../matchers/slice.ts\";\n\n/**\n * Iterates through the possible allocations of `available` across `slices`.\n */\nexport function* distributeAcrossSlices(\n slices: Array<SliceMatcher<unknown>>,\n available: number,\n): IterableIterator<Array<number>> {\n if (slices.length === 0) {\n yield [];\n } else if (slices.length === 1) {\n const spacer = slices[0];\n\n if (spacer.min <= available && available <= spacer.max) {\n yield [available];\n }\n } else {\n const last = slices[slices.length - 1];\n\n for (\n let allocateToLast = last.min;\n allocateToLast <= last.max && allocateToLast <= available;\n allocateToLast++\n ) {\n const allButLast = slices.slice(0, -1);\n\n for (\n const allButLastAllocations of distributeAcrossSlices(\n allButLast,\n available - allocateToLast,\n )\n ) {\n yield [...allButLastAllocations, allocateToLast];\n }\n }\n }\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport class AnythingMatcher<T> extends Matcher<T> {\n override matchValue(_value: unknown): _value is T {\n return true;\n }\n}\n\nexport function anything<T>(): Matcher<T> {\n return new AnythingMatcher();\n}\n", "import { anything } from \"./anything.ts\";\nimport { Matcher } from \"./Matcher.ts\";\n\nexport class SliceMatcher<T> extends Matcher<T> {\n constructor(\n readonly min: number,\n readonly max: number,\n readonly matcher: Matcher<T>,\n ) {\n super();\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is T {\n return this.matcher.matchValue(value, keys);\n }\n}\n\n/**\n * Match zero or more elements. For use with `anyList`.\n *\n * @example\n *\n * ```ts\n * // matches `['foo', 1]` and `['foo', 'bar', 2]` and `['foo', 'bar', 'baz', 3]` but not `['foo']` or `['foo', 'bar']`\n * m.anyList([m.anyString(), m.zeroOrMore(), m.anyNumber()])\n * ```\n */\nexport function zeroOrMore<T>(\n matcher: Matcher<T> = anything(),\n): SliceMatcher<T> {\n return new SliceMatcher(0, Infinity, matcher);\n}\n\n/**\n * Match one or more elements. For use with `anyList`.\n *\n * @example\n *\n * ```ts\n * // matches `['foo']` and `['foo', 'bar']` but not `[]`\n * m.anyList([m.oneOrMore()])\n * ```\n */\nexport function oneOrMore<T>(\n matcher: Matcher<T> = anything(),\n): SliceMatcher<T> {\n return new SliceMatcher(1, Infinity, matcher);\n}\n\n/**\n * Options for {@link slice}.\n */\nexport interface SliceOptions<T> {\n min?: number;\n max?: number;\n matcher?: Matcher<T>;\n}\n\n/**\n * Match a slice of an array. For use with `anyList`.\n *\n * @example\n *\n * ```ts\n * // matches `['foo', 'bar', 'baz']` but not `['foo']` or `['foo', 'bar', 'baz', 'qux']`\n * m.anyList([m.anyString(), m.slice({ min: 1, max: 2 })])\n * ```\n */\nexport function slice<T>(options: SliceOptions<T>): SliceMatcher<T>;\n\n/**\n * Match a slice of an array of the given length. For use with `anyList`.\n *\n * @example\n *\n * ```ts\n * // matches `['foo', 'bar', 'baz']` but not `['foo']` or `['foo', 'bar', 'baz', 'qux']`\n * m.anyList([m.anyString(), m.slice(2)])\n * ```\n */\nexport function slice<T>(length: number, matcher?: Matcher<T>): SliceMatcher<T>;\n\n/**\n * Match a slice of an array. For use with `anyList`.\n *\n * @example\n *\n * ```ts\n * // matches `['foo', 'bar', 'baz']` but not `['foo']` or `['foo', 'bar', 'baz', 'qux']`\n * m.anyList([m.anyString(), m.slice({ min: 1, max: 2 })])\n * ```\n */\nexport function slice<T>(\n optionsOrLength: SliceOptions<T> | number,\n matcherOrUndefined?: Matcher<T>,\n): SliceMatcher<T> {\n let min: number;\n let max: number;\n let matcher: Matcher<T>;\n\n if (typeof optionsOrLength === \"number\") {\n min = optionsOrLength;\n max = optionsOrLength;\n matcher = matcherOrUndefined ?? anything();\n } else if (\n typeof optionsOrLength === \"object\" &&\n typeof matcherOrUndefined === \"undefined\"\n ) {\n min = optionsOrLength.min ?? 0;\n max = optionsOrLength.max ?? Infinity;\n matcher = optionsOrLength.matcher ?? anything();\n } else {\n throw new TypeError(\"Invalid arguments\");\n }\n\n return new SliceMatcher(min, max, matcher);\n}\n", "import { distributeAcrossSlices } from \"../utils/distributeAcrossSlices.ts\";\nimport { Matcher } from \"./Matcher.ts\";\nimport { SliceMatcher } from \"./slice.ts\";\n\nexport class AnyListMatcher<T> extends Matcher<Array<T>> {\n private readonly sliceMatchers: Array<SliceMatcher<T>> = [];\n\n constructor(private readonly matchers: Array<Matcher<T>>) {\n super();\n\n for (const matcher of matchers) {\n if (matcher instanceof SliceMatcher) {\n this.sliceMatchers.push(matcher as SliceMatcher<T>);\n }\n }\n }\n\n override matchValue(\n array: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): array is Array<T> {\n if (!Array.isArray(array)) {\n return false;\n }\n\n if (this.matchers.length === 0 && array.length === 0) {\n return true;\n }\n\n const spacerAllocations = distributeAcrossSlices(\n this.sliceMatchers,\n array.length - this.matchers.length + this.sliceMatchers.length,\n );\n\n for (const allocations of spacerAllocations) {\n const valuesToMatch: Array<T> = array.slice() as T[];\n let matchedAll = true;\n let key = 0;\n\n for (const matcher of this.matchers) {\n if (matcher instanceof SliceMatcher) {\n let sliceValueCount = allocations.shift() ?? 0;\n\n while (sliceValueCount > 0) {\n const valueToMatch = valuesToMatch.shift();\n if (!matcher.matchValue(valueToMatch, [...keys, key])) {\n matchedAll = false;\n break;\n }\n sliceValueCount--;\n key++;\n }\n } else if (!matcher.matchValue(valuesToMatch.shift(), [...keys, key])) {\n matchedAll = false;\n break;\n } else {\n key++;\n }\n }\n\n if (matchedAll) {\n if (valuesToMatch.length > 0) {\n throw new Error(\n `expected to consume all elements to match but ${valuesToMatch.length} remain!`,\n );\n }\n\n return true;\n }\n }\n\n return false;\n }\n}\n\nexport function anyList<T>(...elements: Array<Matcher<T>>): Matcher<Array<T>> {\n return new AnyListMatcher(elements);\n}\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { Matcher } from \"./Matcher.ts\";\n\nexport class AnyNodeMatcher extends Matcher<t.Node> {\n override matchValue(value: unknown): value is t.Node {\n return t.isNode(value);\n }\n}\n\nexport function anyNode(): Matcher<t.Node> {\n return new AnyNodeMatcher();\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport class NumberMatcher extends Matcher<number> {\n override matchValue(value: unknown): value is number {\n return typeof value === \"number\" || value instanceof Number;\n }\n}\n\nexport function anyNumber(): Matcher<number> {\n return new NumberMatcher();\n}\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { Matcher } from \"./Matcher.ts\";\n\nexport class AnyStatementMatcher extends Matcher<t.Statement> {\n override matchValue(value: unknown): value is t.Statement {\n return t.isNode(value) && t.isStatement(value);\n }\n}\n\nexport function anyStatement(): Matcher<t.Statement> {\n return new AnyStatementMatcher();\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport class StringMatcher extends Matcher<string> {\n override matchValue(value: unknown): value is string {\n return typeof value === \"string\" || value instanceof String;\n }\n}\n\nexport function anyString(): Matcher<string> {\n return new StringMatcher();\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport class ArrayOfMatcher<T> extends Matcher<Array<T>> {\n constructor(private readonly elementMatcher: Matcher<T>) {\n super();\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is Array<T> {\n if (!Array.isArray(value)) {\n return false;\n }\n\n for (const [i, element] of value.entries()) {\n if (!this.elementMatcher.matchValue(element, [...keys, i])) {\n return false;\n }\n }\n\n return true;\n }\n}\n\nexport function arrayOf<T>(elementMatcher: Matcher<T>): Matcher<Array<T>> {\n return new ArrayOfMatcher(elementMatcher);\n}\n", "import { anything } from \"./anything.ts\";\nimport { Matcher } from \"./Matcher.ts\";\n\nexport interface CaptureBase {\n // deno-lint-ignore no-explicit-any\n [key: string]: any;\n}\n\nexport class CapturedMatcher<C, M = C> extends Matcher<M> {\n private _current?: C;\n private _currentKeys?: ReadonlyArray<PropertyKey>;\n\n constructor(private readonly matcher: Matcher<C> = anything()) {\n super();\n }\n\n get current(): C | undefined {\n return this._current;\n }\n\n get currentKeys(): ReadonlyArray<PropertyKey> | undefined {\n return this._currentKeys;\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is M {\n if (this.matcher.matchValue(value, keys)) {\n this.capture(value as unknown as C, keys);\n return true;\n } else {\n return false;\n }\n }\n\n protected capture(value: C, keys: ReadonlyArray<PropertyKey>): void {\n this._current = value;\n this._currentKeys = keys;\n }\n}\n\nexport function capture<C, M = C>(matcher?: Matcher<C>): CapturedMatcher<C, M> {\n return new CapturedMatcher(matcher);\n}\n", "import type { Matcher } from \"./Matcher.ts\";\nimport * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { CapturedMatcher } from \"./capture.ts\";\n\n/**\n * Matches and captures using another matcher by recursively checking all\n * descendants of a given node. The matched descendant is captured as the\n * current value of this capturing matcher.\n */\nexport class ContainerOfMatcher<\n C extends t.Node,\n M extends t.Node = C,\n> extends CapturedMatcher<C, M> {\n constructor(private readonly containedMatcher: Matcher<C>) {\n super();\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is M {\n if (!t.isNode(value)) {\n return false;\n }\n\n if (this.containedMatcher.matchValue(value, keys)) {\n this.capture(value, keys);\n return true;\n }\n\n for (const key in value) {\n const valueAtKey = value[key as keyof typeof value];\n if (Array.isArray(valueAtKey)) {\n for (const [i, element] of valueAtKey.entries()) {\n if (this.matchValue(element, [...keys, key, i])) {\n return true;\n }\n }\n } else if (this.matchValue(valueAtKey, [...keys, key])) {\n return true;\n }\n }\n\n return false;\n }\n}\n\nexport function containerOf<C extends t.Node, M extends t.Node = C>(\n containedMatcher: Matcher<C>,\n): ContainerOfMatcher<C, M> {\n return new ContainerOfMatcher(containedMatcher);\n}\n", "import type { NodePath } from \"npm:@babel/traverse@^8.0.0-rc.5\";\nimport traverse from \"npm:@babel/traverse@^8.0.0-rc.5\";\nimport * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { parse } from \"jsr:@codemod/parser@^2.1.0\";\n\nexport type Replacement =\n | t.Statement\n | t.Expression\n | Array<t.Statement>\n | Array<t.Expression>;\n\nexport interface ReplacementsBase {\n [key: string]: Replacement;\n}\n\nexport function program<R extends ReplacementsBase>(\n template: string,\n): (replacements?: R) => t.File {\n const ast = parse(template, {\n plugins: [\"placeholders\"],\n });\n\n return (replacements = {} as R) => {\n const unusedReplacements = new Set(Object.keys(replacements));\n\n traverse(ast, {\n Placeholder(path: NodePath<t.Placeholder>): void {\n const name = path.node.name.name;\n const replacement = replacements[name];\n\n if (replacement !== undefined) {\n throw new Error(\n `no replacement found for placeholder with name: ${name}`,\n );\n }\n\n if (Array.isArray(replacement)) {\n path.replaceWithMultiple(replacement);\n } else {\n path.replaceWith(replacement);\n }\n\n unusedReplacements.delete(name);\n },\n });\n\n if (unusedReplacements.size > 0) {\n const names = Array.from(unusedReplacements).join(\", \");\n\n throw new Error(`template replacements were not used: ${names}`);\n }\n\n return ast;\n };\n}\n\nexport function statement<R extends ReplacementsBase>(\n template: string,\n): (replacements?: R) => t.Statement {\n const builder = program(template);\n return (replacements) =>\n getSingleStatement(builder(replacements).program.body);\n}\n\nexport function expression<R extends ReplacementsBase>(\n template: string,\n): (replacements?: R) => t.Expression {\n const builder = program(template);\n return (replacements) =>\n getSingleExpression(builder(replacements).program.body);\n}\n\nfunction getSingleStatement(statements: Array<t.Statement>): t.Statement {\n if (statements.length !== 1) {\n throw new TypeError(\n `expected a single statement but ${statements.length} statements`,\n );\n }\n\n return statements[0];\n}\n\nfunction getSingleExpression(statements: Array<t.Statement>): t.Expression {\n if (statements.length !== 1) {\n throw new TypeError(\n `expected a single expression but ${statements.length} statements`,\n );\n }\n\n const statement = statements[0];\n\n if (!t.isExpressionStatement(statement)) {\n throw new TypeError(\n `expected a single expression but got a single ${statement.type}`,\n );\n }\n\n return statement.expression;\n}\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\n\nexport interface ArrayValidator {\n each: Validator;\n}\n\nexport interface ChainOfValidator {\n chainOf: Array<Validator>;\n}\n\nexport interface OneOfValidator {\n oneOf: Array<string | boolean | number>;\n}\n\nexport interface OneOfNodeTypesValidator {\n oneOfNodeTypes: Array<string>;\n}\n\nexport interface OneOfNodeOrValueTypesValidator {\n oneOfNodeOrValueTypes: Array<string>;\n}\n\nexport interface Type {\n type: string;\n}\n\nexport type Validator =\n | ArrayValidator\n | ChainOfValidator\n | OneOfValidator\n | OneOfNodeTypesValidator\n | OneOfNodeOrValueTypesValidator\n | Type;\n\nexport interface BuilderKeysByType {\n [key: string]: Array<string>;\n}\n\nexport interface NodeFieldsByType {\n [key: string]: NodeFields;\n}\n\nexport interface NodeFields {\n [key: string]: NodeField;\n}\n\nexport interface NodeField<T = unknown> {\n default: T | null;\n optional?: boolean;\n validate: Validator;\n}\n\nexport const BUILDER_KEYS = t.BUILDER_KEYS as BuilderKeysByType;\nexport const NODE_FIELDS = t.NODE_FIELDS as NodeFieldsByType;\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { parse } from \"jsr:@codemod/parser@^2.1.0\";\nimport { NODE_FIELDS } from \"./NodeTypes.ts\";\n\nfunction fieldsForNodeType(nodeType: string): Set<string> {\n return new Set([\"type\", ...Object.keys(NODE_FIELDS[nodeType])]);\n}\n\nexport function js(code: string): t.File {\n return stripExtras(parse(code));\n}\n\nfunction stripExtras<N extends t.Node>(node: N): N {\n const fieldsToKeep = fieldsForNodeType(node.type) as Set<keyof typeof node>;\n const allFields = Object.keys(node) as (keyof typeof node)[];\n\n for (const field of allFields) {\n const nodeObj = node;\n\n if (!fieldsToKeep.has(field)) {\n delete nodeObj[field];\n } else {\n const children = Array.isArray(nodeObj[field])\n ? nodeObj[field]\n : [nodeObj[field]];\n\n for (const child of children) {\n if (t.isNode(child)) {\n stripExtras(child);\n }\n }\n }\n }\n\n return node;\n}\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { NODE_FIELDS } from \"./NodeTypes.ts\";\n\n/**\n * Determines whether two `@babel/types` nodes are equivalent.\n */\nexport function nodesEquivalent(a: t.Node, b: t.Node): boolean {\n if (a === b) {\n return true;\n }\n\n if (a.type !== b.type) {\n return false;\n }\n\n const fields = NODE_FIELDS[a.type];\n const aProps = a as unknown as { [key: string]: unknown };\n const bProps = b as unknown as { [key: string]: unknown };\n\n for (const [k, field] of Object.entries(fields)) {\n const key = k as keyof typeof fields;\n\n if (field.optional && aProps[key] == null && bProps[key] == null) {\n continue;\n }\n\n const aVal = aProps[key];\n const bVal = bProps[key];\n\n if (aVal === bVal) {\n continue;\n }\n\n if (aVal == null || bVal == null) {\n return false;\n }\n\n if (Array.isArray(aVal) && Array.isArray(bVal)) {\n if (aVal.length !== bVal.length) {\n return false;\n }\n\n for (let i = 0; i < aVal.length; i++) {\n if (!nodesEquivalent(aVal[i] as t.Node, bVal[i] as t.Node)) {\n return false;\n }\n }\n\n continue;\n }\n\n if (t.isNode(aVal) && t.isNode(bVal)) {\n if (!nodesEquivalent(aVal, bVal)) {\n return false;\n }\n\n continue;\n }\n\n return false;\n }\n\n return true;\n}\n", "export * from \"./lib/builders.ts\";\nexport * from \"./lib/js.ts\";\nexport * from \"./lib/nodesEquivalent.ts\";\nexport * from \"./lib/NodeTypes.ts\";\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport type { CapturedMatcher } from \"./capture.ts\";\nimport { nodesEquivalent } from \"jsr:@codemod/utils@^2.2.0\";\nimport { Matcher } from \"./Matcher.ts\";\n\nexport class FromCaptureMatcher<T> extends Matcher<T> {\n constructor(private readonly capturedMatcher: CapturedMatcher<T>) {\n super();\n }\n\n override matchValue(value: unknown): value is T {\n if (t.isNode(this.capturedMatcher.current) && t.isNode(value)) {\n return nodesEquivalent(this.capturedMatcher.current, value);\n }\n return this.capturedMatcher.current === value;\n }\n}\n\nexport function fromCapture<T>(\n capturedMatcher: CapturedMatcher<T>,\n): Matcher<T> {\n return new FromCaptureMatcher(capturedMatcher);\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport class TupleOfMatcher<\n T,\n A extends Array<T> = Array<T>,\n> extends Matcher<A> {\n private readonly matchers: Array<Matcher<T>>;\n\n constructor(...matchers: Array<Matcher<T>>) {\n super();\n this.matchers = matchers;\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is A {\n if (!Array.isArray(value)) {\n return false;\n }\n\n if (value.length !== this.matchers.length) {\n return false;\n }\n\n for (let i = 0; i < this.matchers.length; i++) {\n const matcher = this.matchers[i];\n const element: unknown = value[i];\n\n if (!matcher.matchValue(element, [...keys, i])) {\n return false;\n }\n }\n\n return true;\n }\n}\n\nexport function tupleOf<T, A extends Array<T> = Array<T>>(\n ...matchers: Array<Matcher<T>>\n): Matcher<A> {\n return new TupleOfMatcher(...matchers);\n}\n", "import * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport { Matcher } from \"./Matcher.ts\";\nimport { tupleOf } from \"./tupleOf.ts\";\n\nexport class FunctionMatcher extends Matcher<t.Function> {\n constructor(\n private readonly params?: Matcher<Array<t.LVal>> | Array<Matcher<t.LVal>>,\n private readonly body?: Matcher<t.Expression | t.BlockStatement>,\n ) {\n super();\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is t.Function {\n if (!t.isNode(value) || !t.isFunction(value)) {\n return false;\n }\n\n if (this.params) {\n if (Array.isArray(this.params)) {\n if (\n !tupleOf(...this.params).matchValue(value.params, [...keys, \"params\"])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(value.params, [...keys, \"params\"])) {\n return false;\n }\n }\n\n if (this.body && !this.body.matchValue(value.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function Function(\n params?: Matcher<Array<t.LVal>> | Array<Matcher<t.LVal>>,\n body?: Matcher<t.Expression | t.BlockStatement>,\n): Matcher<t.Function> {\n return new FunctionMatcher(params, body);\n}\n\nexport { Function as function };\n", "/* DO NOT EDIT. This file was generated by 'script/rebuild' */\n// deno-lint-ignore-file\n\nimport * as t from \"npm:@babel/types@^8.0.0-rc.5\";\n\nimport { tupleOf } from \"./tupleOf.ts\";\nimport { Matcher } from \"./Matcher.ts\";\n\n// aliases for keyword-named functions\n\nexport { Import as import };\nexport { Super as super };\n\nexport class AnyTypeAnnotationMatcher extends Matcher<t.AnyTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.AnyTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isAnyTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function anyTypeAnnotation(): Matcher<t.AnyTypeAnnotation> {\n return new AnyTypeAnnotationMatcher();\n}\nexport class ArgumentPlaceholderMatcher extends Matcher<t.ArgumentPlaceholder> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ArgumentPlaceholder {\n if (\n !t.isNode(node) ||\n !t.isArgumentPlaceholder(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function argumentPlaceholder(): Matcher<t.ArgumentPlaceholder> {\n return new ArgumentPlaceholderMatcher();\n}\nexport class ArrayExpressionMatcher extends Matcher<t.ArrayExpression> {\n constructor(\n private readonly elements?:\n | Matcher<Array<null | t.Expression | t.SpreadElement>>\n | Array<Matcher<null> | Matcher<t.Expression> | Matcher<t.SpreadElement>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ArrayExpression {\n if (\n !t.isNode(node) ||\n !t.isArrayExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.elements === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.elements)) {\n if (\n !tupleOf<unknown>(...this.elements).matchValue(node.elements, [\n ...keys,\n \"elements\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.elements.matchValue(node.elements, [...keys, \"elements\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function arrayExpression(\n elements?:\n | Matcher<Array<null | t.Expression | t.SpreadElement>>\n | Array<Matcher<null> | Matcher<t.Expression> | Matcher<t.SpreadElement>>,\n): Matcher<t.ArrayExpression> {\n return new ArrayExpressionMatcher(\n elements,\n );\n}\nexport class ArrayPatternMatcher extends Matcher<t.ArrayPattern> {\n constructor(\n private readonly elements?:\n | Matcher<Array<null | t.PatternLike>>\n | Array<Matcher<null> | Matcher<t.PatternLike>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ArrayPattern {\n if (\n !t.isNode(node) ||\n !t.isArrayPattern(node)\n ) {\n return false;\n }\n\n if (typeof this.elements === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.elements)) {\n if (\n !tupleOf<unknown>(...this.elements).matchValue(node.elements, [\n ...keys,\n \"elements\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.elements.matchValue(node.elements, [...keys, \"elements\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function arrayPattern(\n elements?:\n | Matcher<Array<null | t.PatternLike>>\n | Array<Matcher<null> | Matcher<t.PatternLike>>,\n): Matcher<t.ArrayPattern> {\n return new ArrayPatternMatcher(\n elements,\n );\n}\nexport class ArrayTypeAnnotationMatcher extends Matcher<t.ArrayTypeAnnotation> {\n constructor(\n private readonly elementType?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ArrayTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isArrayTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.elementType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.elementType.matchValue(node.elementType, [...keys, \"elementType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function arrayTypeAnnotation(\n elementType?: Matcher<t.FlowType>,\n): Matcher<t.ArrayTypeAnnotation> {\n return new ArrayTypeAnnotationMatcher(\n elementType,\n );\n}\nexport class ArrowFunctionExpressionMatcher\n extends Matcher<t.ArrowFunctionExpression> {\n constructor(\n private readonly params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n private readonly body?: Matcher<t.BlockStatement | t.Expression>,\n private readonly async?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ArrowFunctionExpression {\n if (\n !t.isNode(node) ||\n !t.isArrowFunctionExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.async === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.async === \"boolean\") {\n if (this.async !== node.async) {\n return false;\n }\n } else if (!this.async.matchValue(node.async, [...keys, \"async\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function arrowFunctionExpression(\n params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n body?: Matcher<t.BlockStatement | t.Expression>,\n async?: Matcher<boolean> | boolean,\n): Matcher<t.ArrowFunctionExpression> {\n return new ArrowFunctionExpressionMatcher(\n params,\n body,\n async,\n );\n}\nexport class AssignmentExpressionMatcher\n extends Matcher<t.AssignmentExpression> {\n constructor(\n private readonly operator?:\n | Matcher<\n | \"=\"\n | \"+=\"\n | \"-=\"\n | \"/=\"\n | \"%=\"\n | \"*=\"\n | \"**=\"\n | \"&=\"\n | \"|=\"\n | \">>=\"\n | \">>>=\"\n | \"<<=\"\n | \"^=\"\n | \"||=\"\n | \"&&=\"\n | \"??=\"\n >\n | string,\n private readonly left?: Matcher<\n | t.Identifier\n | t.MemberExpression\n | t.OptionalMemberExpression\n | t.ArrayPattern\n | t.ObjectPattern\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n private readonly right?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.AssignmentExpression {\n if (\n !t.isNode(node) ||\n !t.isAssignmentExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.operator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.operator === \"string\") {\n if (this.operator !== node.operator) {\n return false;\n }\n } else if (\n !this.operator.matchValue(node.operator, [...keys, \"operator\"])\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function assignmentExpression(\n operator?:\n | Matcher<\n | \"=\"\n | \"+=\"\n | \"-=\"\n | \"/=\"\n | \"%=\"\n | \"*=\"\n | \"**=\"\n | \"&=\"\n | \"|=\"\n | \">>=\"\n | \">>>=\"\n | \"<<=\"\n | \"^=\"\n | \"||=\"\n | \"&&=\"\n | \"??=\"\n >\n | string,\n left?: Matcher<\n | t.Identifier\n | t.MemberExpression\n | t.OptionalMemberExpression\n | t.ArrayPattern\n | t.ObjectPattern\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n right?: Matcher<t.Expression>,\n): Matcher<t.AssignmentExpression> {\n return new AssignmentExpressionMatcher(\n operator,\n left,\n right,\n );\n}\nexport class AssignmentPatternMatcher extends Matcher<t.AssignmentPattern> {\n constructor(\n private readonly left?: Matcher<\n | t.Identifier\n | t.ObjectPattern\n | t.ArrayPattern\n | t.MemberExpression\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n private readonly right?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.AssignmentPattern {\n if (\n !t.isNode(node) ||\n !t.isAssignmentPattern(node)\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function assignmentPattern(\n left?: Matcher<\n | t.Identifier\n | t.ObjectPattern\n | t.ArrayPattern\n | t.MemberExpression\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n right?: Matcher<t.Expression>,\n): Matcher<t.AssignmentPattern> {\n return new AssignmentPatternMatcher(\n left,\n right,\n );\n}\nexport class AwaitExpressionMatcher extends Matcher<t.AwaitExpression> {\n constructor(\n private readonly argument?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.AwaitExpression {\n if (\n !t.isNode(node) ||\n !t.isAwaitExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function awaitExpression(\n argument?: Matcher<t.Expression>,\n): Matcher<t.AwaitExpression> {\n return new AwaitExpressionMatcher(\n argument,\n );\n}\nexport class BigIntLiteralMatcher extends Matcher<t.BigIntLiteral> {\n constructor(\n private readonly value?: Matcher<bigint> | bigint,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BigIntLiteral {\n if (\n !t.isNode(node) ||\n !t.isBigIntLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"bigint\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function bigIntLiteral(\n value?: Matcher<bigint> | bigint,\n): Matcher<t.BigIntLiteral> {\n return new BigIntLiteralMatcher(\n value,\n );\n}\nexport class BigIntLiteralTypeAnnotationMatcher\n extends Matcher<t.BigIntLiteralTypeAnnotation> {\n constructor(\n private readonly value?: Matcher<bigint> | bigint,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BigIntLiteralTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isBigIntLiteralTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"bigint\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function bigIntLiteralTypeAnnotation(\n value?: Matcher<bigint> | bigint,\n): Matcher<t.BigIntLiteralTypeAnnotation> {\n return new BigIntLiteralTypeAnnotationMatcher(\n value,\n );\n}\nexport class BinaryExpressionMatcher extends Matcher<t.BinaryExpression> {\n constructor(\n private readonly operator?:\n | Matcher<\n | \"+\"\n | \"-\"\n | \"/\"\n | \"%\"\n | \"*\"\n | \"**\"\n | \"&\"\n | \"|\"\n | \">>\"\n | \">>>\"\n | \"<<\"\n | \"^\"\n | \"==\"\n | \"===\"\n | \"!=\"\n | \"!==\"\n | \"in\"\n | \"instanceof\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\"\n | \"|>\"\n >\n | string,\n private readonly left?: Matcher<t.Expression | t.PrivateName>,\n private readonly right?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BinaryExpression {\n if (\n !t.isNode(node) ||\n !t.isBinaryExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.operator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.operator === \"string\") {\n if (this.operator !== node.operator) {\n return false;\n }\n } else if (\n !this.operator.matchValue(node.operator, [...keys, \"operator\"])\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function binaryExpression(\n operator?:\n | Matcher<\n | \"+\"\n | \"-\"\n | \"/\"\n | \"%\"\n | \"*\"\n | \"**\"\n | \"&\"\n | \"|\"\n | \">>\"\n | \">>>\"\n | \"<<\"\n | \"^\"\n | \"==\"\n | \"===\"\n | \"!=\"\n | \"!==\"\n | \"in\"\n | \"instanceof\"\n | \">\"\n | \"<\"\n | \">=\"\n | \"<=\"\n | \"|>\"\n >\n | string,\n left?: Matcher<t.Expression | t.PrivateName>,\n right?: Matcher<t.Expression>,\n): Matcher<t.BinaryExpression> {\n return new BinaryExpressionMatcher(\n operator,\n left,\n right,\n );\n}\nexport class BindExpressionMatcher extends Matcher<t.BindExpression> {\n constructor(\n private readonly object?: Matcher<null | t.Expression>,\n private readonly callee?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BindExpression {\n if (\n !t.isNode(node) ||\n !t.isBindExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.object === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.object.matchValue(node.object, [...keys, \"object\"])) {\n return false;\n }\n\n if (typeof this.callee === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.callee.matchValue(node.callee, [...keys, \"callee\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function bindExpression(\n object?: Matcher<null | t.Expression>,\n callee?: Matcher<t.Expression>,\n): Matcher<t.BindExpression> {\n return new BindExpressionMatcher(\n object,\n callee,\n );\n}\nexport class BlockStatementMatcher extends Matcher<t.BlockStatement> {\n constructor(\n private readonly body?:\n | Matcher<Array<t.Statement>>\n | Array<Matcher<t.Statement>>,\n private readonly directives?:\n | Matcher<Array<t.Directive>>\n | Array<Matcher<t.Directive>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BlockStatement {\n if (\n !t.isNode(node) ||\n !t.isBlockStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.body)) {\n if (\n !tupleOf<unknown>(...this.body).matchValue(node.body, [...keys, \"body\"])\n ) {\n return false;\n }\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.directives === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.directives)) {\n if (\n !tupleOf<unknown>(...this.directives).matchValue(node.directives, [\n ...keys,\n \"directives\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.directives.matchValue(node.directives, [...keys, \"directives\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function blockStatement(\n body?: Matcher<Array<t.Statement>> | Array<Matcher<t.Statement>>,\n directives?: Matcher<Array<t.Directive>> | Array<Matcher<t.Directive>>,\n): Matcher<t.BlockStatement> {\n return new BlockStatementMatcher(\n body,\n directives,\n );\n}\nexport class BooleanLiteralMatcher extends Matcher<t.BooleanLiteral> {\n constructor(\n private readonly value?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BooleanLiteral {\n if (\n !t.isNode(node) ||\n !t.isBooleanLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"boolean\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function booleanLiteral(\n value?: Matcher<boolean> | boolean,\n): Matcher<t.BooleanLiteral> {\n return new BooleanLiteralMatcher(\n value,\n );\n}\nexport class BooleanLiteralTypeAnnotationMatcher\n extends Matcher<t.BooleanLiteralTypeAnnotation> {\n constructor(\n private readonly value?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BooleanLiteralTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isBooleanLiteralTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"boolean\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function booleanLiteralTypeAnnotation(\n value?: Matcher<boolean> | boolean,\n): Matcher<t.BooleanLiteralTypeAnnotation> {\n return new BooleanLiteralTypeAnnotationMatcher(\n value,\n );\n}\nexport class BooleanTypeAnnotationMatcher\n extends Matcher<t.BooleanTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BooleanTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isBooleanTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function booleanTypeAnnotation(): Matcher<t.BooleanTypeAnnotation> {\n return new BooleanTypeAnnotationMatcher();\n}\nexport class BreakStatementMatcher extends Matcher<t.BreakStatement> {\n constructor(\n private readonly label?: Matcher<t.Identifier> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.BreakStatement {\n if (\n !t.isNode(node) ||\n !t.isBreakStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.label === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.label === null) {\n // null matcher means we expect null value\n if (node.label !== null) {\n return false;\n }\n } else if (!this.label.matchValue(node.label, [...keys, \"label\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function breakStatement(\n label?: Matcher<t.Identifier> | null,\n): Matcher<t.BreakStatement> {\n return new BreakStatementMatcher(\n label,\n );\n}\nexport class CallExpressionMatcher extends Matcher<t.CallExpression> {\n constructor(\n private readonly callee?: Matcher<\n t.Expression | t.Super | t.Import | t.V8IntrinsicIdentifier\n >,\n private readonly _arguments?:\n | Matcher<Array<t.Expression | t.SpreadElement | t.ArgumentPlaceholder>>\n | Array<\n | Matcher<t.Expression>\n | Matcher<t.SpreadElement>\n | Matcher<t.ArgumentPlaceholder>\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.CallExpression {\n if (\n !t.isNode(node) ||\n !t.isCallExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.callee === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.callee.matchValue(node.callee, [...keys, \"callee\"])) {\n return false;\n }\n\n if (typeof this._arguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this._arguments)) {\n if (\n !tupleOf<unknown>(...this._arguments).matchValue(node.arguments, [\n ...keys,\n \"arguments\",\n ])\n ) {\n return false;\n }\n } else if (\n !this._arguments.matchValue(node.arguments, [...keys, \"arguments\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function callExpression(\n callee?: Matcher<t.Expression | t.Super | t.Import | t.V8IntrinsicIdentifier>,\n _arguments?:\n | Matcher<Array<t.Expression | t.SpreadElement | t.ArgumentPlaceholder>>\n | Array<\n | Matcher<t.Expression>\n | Matcher<t.SpreadElement>\n | Matcher<t.ArgumentPlaceholder>\n >,\n): Matcher<t.CallExpression> {\n return new CallExpressionMatcher(\n callee,\n _arguments,\n );\n}\nexport class CatchClauseMatcher extends Matcher<t.CatchClause> {\n constructor(\n private readonly param?:\n | Matcher<t.Identifier | t.ArrayPattern | t.ObjectPattern>\n | null,\n private readonly body?: Matcher<t.BlockStatement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.CatchClause {\n if (\n !t.isNode(node) ||\n !t.isCatchClause(node)\n ) {\n return false;\n }\n\n if (typeof this.param === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.param === null) {\n // null matcher means we expect null value\n if (node.param !== null) {\n return false;\n }\n } else if (!this.param.matchValue(node.param, [...keys, \"param\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function catchClause(\n param?: Matcher<t.Identifier | t.ArrayPattern | t.ObjectPattern> | null,\n body?: Matcher<t.BlockStatement>,\n): Matcher<t.CatchClause> {\n return new CatchClauseMatcher(\n param,\n body,\n );\n}\nexport class ClassAccessorPropertyMatcher\n extends Matcher<t.ClassAccessorProperty> {\n constructor(\n private readonly key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n | t.PrivateName\n >,\n private readonly value?: Matcher<t.Expression> | null,\n private readonly typeAnnotation?:\n | Matcher<t.TypeAnnotation | t.TSTypeAnnotation>\n | null,\n private readonly decorators?:\n | Matcher<Array<t.Decorator>>\n | Array<Matcher<t.Decorator>>\n | null,\n private readonly computed?: Matcher<boolean> | boolean,\n private readonly _static?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassAccessorProperty {\n if (\n !t.isNode(node) ||\n !t.isClassAccessorProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.value === null) {\n // null matcher means we expect null value\n if (node.value !== null) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeAnnotation === null) {\n // null matcher means we expect null value\n if (node.typeAnnotation !== null) {\n return false;\n }\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.decorators === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.decorators === null) {\n // null matcher means we expect null value\n if (node.decorators !== null) {\n return false;\n }\n } else if (Array.isArray(this.decorators)) {\n if (\n !tupleOf<unknown>(...this.decorators).matchValue(node.decorators, [\n ...keys,\n \"decorators\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.decorators.matchValue(node.decorators, [...keys, \"decorators\"])\n ) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n if (typeof this._static === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._static === \"boolean\") {\n if (this._static !== node.static) {\n return false;\n }\n } else if (!this._static.matchValue(node.static, [...keys, \"static\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classAccessorProperty(\n key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n | t.PrivateName\n >,\n value?: Matcher<t.Expression> | null,\n typeAnnotation?: Matcher<t.TypeAnnotation | t.TSTypeAnnotation> | null,\n decorators?: Matcher<Array<t.Decorator>> | Array<Matcher<t.Decorator>> | null,\n computed?: Matcher<boolean> | boolean,\n _static?: Matcher<boolean> | boolean,\n): Matcher<t.ClassAccessorProperty> {\n return new ClassAccessorPropertyMatcher(\n key,\n value,\n typeAnnotation,\n decorators,\n computed,\n _static,\n );\n}\nexport class ClassBodyMatcher extends Matcher<t.ClassBody> {\n constructor(\n private readonly body?:\n | Matcher<\n Array<\n | t.ClassMethod\n | t.ClassPrivateMethod\n | t.ClassProperty\n | t.ClassPrivateProperty\n | t.ClassAccessorProperty\n | t.TSDeclareMethod\n | t.TSIndexSignature\n | t.StaticBlock\n >\n >\n | Array<\n | Matcher<t.ClassMethod>\n | Matcher<t.ClassPrivateMethod>\n | Matcher<t.ClassProperty>\n | Matcher<t.ClassPrivateProperty>\n | Matcher<t.ClassAccessorProperty>\n | Matcher<t.TSDeclareMethod>\n | Matcher<t.TSIndexSignature>\n | Matcher<t.StaticBlock>\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassBody {\n if (\n !t.isNode(node) ||\n !t.isClassBody(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.body)) {\n if (\n !tupleOf<unknown>(...this.body).matchValue(node.body, [...keys, \"body\"])\n ) {\n return false;\n }\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classBody(\n body?:\n | Matcher<\n Array<\n | t.ClassMethod\n | t.ClassPrivateMethod\n | t.ClassProperty\n | t.ClassPrivateProperty\n | t.ClassAccessorProperty\n | t.TSDeclareMethod\n | t.TSIndexSignature\n | t.StaticBlock\n >\n >\n | Array<\n | Matcher<t.ClassMethod>\n | Matcher<t.ClassPrivateMethod>\n | Matcher<t.ClassProperty>\n | Matcher<t.ClassPrivateProperty>\n | Matcher<t.ClassAccessorProperty>\n | Matcher<t.TSDeclareMethod>\n | Matcher<t.TSIndexSignature>\n | Matcher<t.StaticBlock>\n >,\n): Matcher<t.ClassBody> {\n return new ClassBodyMatcher(\n body,\n );\n}\nexport class ClassDeclarationMatcher extends Matcher<t.ClassDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier> | null,\n private readonly superClass?: Matcher<t.Expression> | null,\n private readonly body?: Matcher<t.ClassBody>,\n private readonly decorators?:\n | Matcher<Array<t.Decorator>>\n | Array<Matcher<t.Decorator>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassDeclaration {\n if (\n !t.isNode(node) ||\n !t.isClassDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.id === null) {\n // null matcher means we expect null value\n if (node.id !== null) {\n return false;\n }\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.superClass === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.superClass === null) {\n // null matcher means we expect null value\n if (node.superClass !== null) {\n return false;\n }\n } else if (\n !this.superClass.matchValue(node.superClass, [...keys, \"superClass\"])\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.decorators === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.decorators === null) {\n // null matcher means we expect null value\n if (node.decorators !== null) {\n return false;\n }\n } else if (Array.isArray(this.decorators)) {\n if (\n !tupleOf<unknown>(...this.decorators).matchValue(node.decorators, [\n ...keys,\n \"decorators\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.decorators.matchValue(node.decorators, [...keys, \"decorators\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classDeclaration(\n id?: Matcher<t.Identifier> | null,\n superClass?: Matcher<t.Expression> | null,\n body?: Matcher<t.ClassBody>,\n decorators?: Matcher<Array<t.Decorator>> | Array<Matcher<t.Decorator>> | null,\n): Matcher<t.ClassDeclaration> {\n return new ClassDeclarationMatcher(\n id,\n superClass,\n body,\n decorators,\n );\n}\nexport class ClassExpressionMatcher extends Matcher<t.ClassExpression> {\n constructor(\n private readonly id?: Matcher<t.Identifier> | null,\n private readonly superClass?: Matcher<t.Expression> | null,\n private readonly body?: Matcher<t.ClassBody>,\n private readonly decorators?:\n | Matcher<Array<t.Decorator>>\n | Array<Matcher<t.Decorator>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassExpression {\n if (\n !t.isNode(node) ||\n !t.isClassExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.id === null) {\n // null matcher means we expect null value\n if (node.id !== null) {\n return false;\n }\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.superClass === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.superClass === null) {\n // null matcher means we expect null value\n if (node.superClass !== null) {\n return false;\n }\n } else if (\n !this.superClass.matchValue(node.superClass, [...keys, \"superClass\"])\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.decorators === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.decorators === null) {\n // null matcher means we expect null value\n if (node.decorators !== null) {\n return false;\n }\n } else if (Array.isArray(this.decorators)) {\n if (\n !tupleOf<unknown>(...this.decorators).matchValue(node.decorators, [\n ...keys,\n \"decorators\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.decorators.matchValue(node.decorators, [...keys, \"decorators\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classExpression(\n id?: Matcher<t.Identifier> | null,\n superClass?: Matcher<t.Expression> | null,\n body?: Matcher<t.ClassBody>,\n decorators?: Matcher<Array<t.Decorator>> | Array<Matcher<t.Decorator>> | null,\n): Matcher<t.ClassExpression> {\n return new ClassExpressionMatcher(\n id,\n superClass,\n body,\n decorators,\n );\n}\nexport class ClassImplementsMatcher extends Matcher<t.ClassImplements> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassImplements {\n if (\n !t.isNode(node) ||\n !t.isClassImplements(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classImplements(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterInstantiation> | null,\n): Matcher<t.ClassImplements> {\n return new ClassImplementsMatcher(\n id,\n typeParameters,\n );\n}\nexport class ClassMethodMatcher extends Matcher<t.ClassMethod> {\n constructor(\n private readonly kind?:\n | Matcher<\"get\" | \"set\" | \"method\" | \"constructor\">\n | string,\n private readonly key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n >,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter | t.TSParameterProperty>>\n | Array<Matcher<t.FunctionParameter> | Matcher<t.TSParameterProperty>>,\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly computed?: Matcher<boolean> | boolean,\n private readonly _static?: Matcher<boolean> | boolean,\n private readonly generator?: Matcher<boolean> | boolean,\n private readonly async?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassMethod {\n if (\n !t.isNode(node) ||\n !t.isClassMethod(node)\n ) {\n return false;\n }\n\n if (typeof this.kind === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.kind === \"string\") {\n if (this.kind !== node.kind) {\n return false;\n }\n } else if (!this.kind.matchValue(node.kind, [...keys, \"kind\"])) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n if (typeof this._static === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._static === \"boolean\") {\n if (this._static !== node.static) {\n return false;\n }\n } else if (!this._static.matchValue(node.static, [...keys, \"static\"])) {\n return false;\n }\n\n if (typeof this.generator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.generator === \"boolean\") {\n if (this.generator !== node.generator) {\n return false;\n }\n } else if (\n !this.generator.matchValue(node.generator, [...keys, \"generator\"])\n ) {\n return false;\n }\n\n if (typeof this.async === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.async === \"boolean\") {\n if (this.async !== node.async) {\n return false;\n }\n } else if (!this.async.matchValue(node.async, [...keys, \"async\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classMethod(\n kind?: Matcher<\"get\" | \"set\" | \"method\" | \"constructor\"> | string,\n key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n >,\n params?:\n | Matcher<Array<t.FunctionParameter | t.TSParameterProperty>>\n | Array<Matcher<t.FunctionParameter> | Matcher<t.TSParameterProperty>>,\n body?: Matcher<t.BlockStatement>,\n computed?: Matcher<boolean> | boolean,\n _static?: Matcher<boolean> | boolean,\n generator?: Matcher<boolean> | boolean,\n async?: Matcher<boolean> | boolean,\n): Matcher<t.ClassMethod> {\n return new ClassMethodMatcher(\n kind,\n key,\n params,\n body,\n computed,\n _static,\n generator,\n async,\n );\n}\nexport class ClassPrivateMethodMatcher extends Matcher<t.ClassPrivateMethod> {\n constructor(\n private readonly kind?: Matcher<\"get\" | \"set\" | \"method\"> | string,\n private readonly key?: Matcher<t.PrivateName>,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter | t.TSParameterProperty>>\n | Array<Matcher<t.FunctionParameter> | Matcher<t.TSParameterProperty>>,\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly _static?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassPrivateMethod {\n if (\n !t.isNode(node) ||\n !t.isClassPrivateMethod(node)\n ) {\n return false;\n }\n\n if (typeof this.kind === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.kind === \"string\") {\n if (this.kind !== node.kind) {\n return false;\n }\n } else if (!this.kind.matchValue(node.kind, [...keys, \"kind\"])) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this._static === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._static === \"boolean\") {\n if (this._static !== node.static) {\n return false;\n }\n } else if (!this._static.matchValue(node.static, [...keys, \"static\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classPrivateMethod(\n kind?: Matcher<\"get\" | \"set\" | \"method\"> | string,\n key?: Matcher<t.PrivateName>,\n params?:\n | Matcher<Array<t.FunctionParameter | t.TSParameterProperty>>\n | Array<Matcher<t.FunctionParameter> | Matcher<t.TSParameterProperty>>,\n body?: Matcher<t.BlockStatement>,\n _static?: Matcher<boolean> | boolean,\n): Matcher<t.ClassPrivateMethod> {\n return new ClassPrivateMethodMatcher(\n kind,\n key,\n params,\n body,\n _static,\n );\n}\nexport class ClassPrivatePropertyMatcher\n extends Matcher<t.ClassPrivateProperty> {\n constructor(\n private readonly key?: Matcher<t.PrivateName>,\n private readonly value?: Matcher<t.Expression> | null,\n private readonly decorators?:\n | Matcher<Array<t.Decorator>>\n | Array<Matcher<t.Decorator>>\n | null,\n private readonly _static?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassPrivateProperty {\n if (\n !t.isNode(node) ||\n !t.isClassPrivateProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.value === null) {\n // null matcher means we expect null value\n if (node.value !== null) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.decorators === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.decorators === null) {\n // null matcher means we expect null value\n if (node.decorators !== null) {\n return false;\n }\n } else if (Array.isArray(this.decorators)) {\n if (\n !tupleOf<unknown>(...this.decorators).matchValue(node.decorators, [\n ...keys,\n \"decorators\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.decorators.matchValue(node.decorators, [...keys, \"decorators\"])\n ) {\n return false;\n }\n\n if (typeof this._static === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._static === \"boolean\") {\n if (this._static !== node.static) {\n return false;\n }\n } else if (!this._static.matchValue(node.static, [...keys, \"static\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classPrivateProperty(\n key?: Matcher<t.PrivateName>,\n value?: Matcher<t.Expression> | null,\n decorators?: Matcher<Array<t.Decorator>> | Array<Matcher<t.Decorator>> | null,\n _static?: Matcher<boolean> | boolean,\n): Matcher<t.ClassPrivateProperty> {\n return new ClassPrivatePropertyMatcher(\n key,\n value,\n decorators,\n _static,\n );\n}\nexport class ClassPropertyMatcher extends Matcher<t.ClassProperty> {\n constructor(\n private readonly key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n >,\n private readonly value?: Matcher<t.Expression> | null,\n private readonly typeAnnotation?:\n | Matcher<t.TypeAnnotation | t.TSTypeAnnotation>\n | null,\n private readonly decorators?:\n | Matcher<Array<t.Decorator>>\n | Array<Matcher<t.Decorator>>\n | null,\n private readonly computed?: Matcher<boolean> | boolean,\n private readonly _static?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ClassProperty {\n if (\n !t.isNode(node) ||\n !t.isClassProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.value === null) {\n // null matcher means we expect null value\n if (node.value !== null) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeAnnotation === null) {\n // null matcher means we expect null value\n if (node.typeAnnotation !== null) {\n return false;\n }\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.decorators === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.decorators === null) {\n // null matcher means we expect null value\n if (node.decorators !== null) {\n return false;\n }\n } else if (Array.isArray(this.decorators)) {\n if (\n !tupleOf<unknown>(...this.decorators).matchValue(node.decorators, [\n ...keys,\n \"decorators\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.decorators.matchValue(node.decorators, [...keys, \"decorators\"])\n ) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n if (typeof this._static === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._static === \"boolean\") {\n if (this._static !== node.static) {\n return false;\n }\n } else if (!this._static.matchValue(node.static, [...keys, \"static\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function classProperty(\n key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n >,\n value?: Matcher<t.Expression> | null,\n typeAnnotation?: Matcher<t.TypeAnnotation | t.TSTypeAnnotation> | null,\n decorators?: Matcher<Array<t.Decorator>> | Array<Matcher<t.Decorator>> | null,\n computed?: Matcher<boolean> | boolean,\n _static?: Matcher<boolean> | boolean,\n): Matcher<t.ClassProperty> {\n return new ClassPropertyMatcher(\n key,\n value,\n typeAnnotation,\n decorators,\n computed,\n _static,\n );\n}\nexport class ConditionalExpressionMatcher\n extends Matcher<t.ConditionalExpression> {\n constructor(\n private readonly test?: Matcher<t.Expression>,\n private readonly consequent?: Matcher<t.Expression>,\n private readonly alternate?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ConditionalExpression {\n if (\n !t.isNode(node) ||\n !t.isConditionalExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.test === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.test.matchValue(node.test, [...keys, \"test\"])) {\n return false;\n }\n\n if (typeof this.consequent === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.consequent.matchValue(node.consequent, [...keys, \"consequent\"])\n ) {\n return false;\n }\n\n if (typeof this.alternate === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.alternate.matchValue(node.alternate, [...keys, \"alternate\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function conditionalExpression(\n test?: Matcher<t.Expression>,\n consequent?: Matcher<t.Expression>,\n alternate?: Matcher<t.Expression>,\n): Matcher<t.ConditionalExpression> {\n return new ConditionalExpressionMatcher(\n test,\n consequent,\n alternate,\n );\n}\nexport class ContinueStatementMatcher extends Matcher<t.ContinueStatement> {\n constructor(\n private readonly label?: Matcher<t.Identifier> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ContinueStatement {\n if (\n !t.isNode(node) ||\n !t.isContinueStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.label === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.label === null) {\n // null matcher means we expect null value\n if (node.label !== null) {\n return false;\n }\n } else if (!this.label.matchValue(node.label, [...keys, \"label\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function continueStatement(\n label?: Matcher<t.Identifier> | null,\n): Matcher<t.ContinueStatement> {\n return new ContinueStatementMatcher(\n label,\n );\n}\nexport class DebuggerStatementMatcher extends Matcher<t.DebuggerStatement> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DebuggerStatement {\n if (\n !t.isNode(node) ||\n !t.isDebuggerStatement(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function debuggerStatement(): Matcher<t.DebuggerStatement> {\n return new DebuggerStatementMatcher();\n}\nexport class DeclareClassMatcher extends Matcher<t.DeclareClass> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n private readonly body?: Matcher<t.ObjectTypeAnnotation>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareClass {\n if (\n !t.isNode(node) ||\n !t.isDeclareClass(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this._extends === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._extends === null) {\n // null matcher means we expect null value\n if (node.extends !== null) {\n return false;\n }\n } else if (Array.isArray(this._extends)) {\n if (\n !tupleOf<unknown>(...this._extends).matchValue(node.extends, [\n ...keys,\n \"extends\",\n ])\n ) {\n return false;\n }\n } else if (!this._extends.matchValue(node.extends, [...keys, \"extends\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareClass(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n body?: Matcher<t.ObjectTypeAnnotation>,\n): Matcher<t.DeclareClass> {\n return new DeclareClassMatcher(\n id,\n typeParameters,\n _extends,\n body,\n );\n}\nexport class DeclareExportAllDeclarationMatcher\n extends Matcher<t.DeclareExportAllDeclaration> {\n constructor(\n private readonly source?: Matcher<t.StringLiteral>,\n private readonly attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareExportAllDeclaration {\n if (\n !t.isNode(node) ||\n !t.isDeclareExportAllDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.attributes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.attributes === null) {\n // null matcher means we expect null value\n if (node.attributes !== null) {\n return false;\n }\n } else if (Array.isArray(this.attributes)) {\n if (\n !tupleOf<unknown>(...this.attributes).matchValue(node.attributes, [\n ...keys,\n \"attributes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.attributes.matchValue(node.attributes, [...keys, \"attributes\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareExportAllDeclaration(\n source?: Matcher<t.StringLiteral>,\n attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n): Matcher<t.DeclareExportAllDeclaration> {\n return new DeclareExportAllDeclarationMatcher(\n source,\n attributes,\n );\n}\nexport class DeclareExportDeclarationMatcher\n extends Matcher<t.DeclareExportDeclaration> {\n constructor(\n private readonly declaration?: Matcher<t.Flow> | null,\n private readonly specifiers?:\n | Matcher<Array<t.ExportSpecifier | t.ExportNamespaceSpecifier>>\n | Array<Matcher<t.ExportSpecifier> | Matcher<t.ExportNamespaceSpecifier>>\n | null,\n private readonly source?: Matcher<t.StringLiteral> | null,\n private readonly attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareExportDeclaration {\n if (\n !t.isNode(node) ||\n !t.isDeclareExportDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.declaration === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.declaration === null) {\n // null matcher means we expect null value\n if (node.declaration !== null) {\n return false;\n }\n } else if (\n !this.declaration.matchValue(node.declaration, [...keys, \"declaration\"])\n ) {\n return false;\n }\n\n if (typeof this.specifiers === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.specifiers === null) {\n // null matcher means we expect null value\n if (node.specifiers !== null) {\n return false;\n }\n } else if (Array.isArray(this.specifiers)) {\n if (\n !tupleOf<unknown>(...this.specifiers).matchValue(node.specifiers, [\n ...keys,\n \"specifiers\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.specifiers.matchValue(node.specifiers, [...keys, \"specifiers\"])\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.source === null) {\n // null matcher means we expect null value\n if (node.source !== null) {\n return false;\n }\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.attributes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.attributes === null) {\n // null matcher means we expect null value\n if (node.attributes !== null) {\n return false;\n }\n } else if (Array.isArray(this.attributes)) {\n if (\n !tupleOf<unknown>(...this.attributes).matchValue(node.attributes, [\n ...keys,\n \"attributes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.attributes.matchValue(node.attributes, [...keys, \"attributes\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareExportDeclaration(\n declaration?: Matcher<t.Flow> | null,\n specifiers?:\n | Matcher<Array<t.ExportSpecifier | t.ExportNamespaceSpecifier>>\n | Array<Matcher<t.ExportSpecifier> | Matcher<t.ExportNamespaceSpecifier>>\n | null,\n source?: Matcher<t.StringLiteral> | null,\n attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n): Matcher<t.DeclareExportDeclaration> {\n return new DeclareExportDeclarationMatcher(\n declaration,\n specifiers,\n source,\n attributes,\n );\n}\nexport class DeclareFunctionMatcher extends Matcher<t.DeclareFunction> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareFunction {\n if (\n !t.isNode(node) ||\n !t.isDeclareFunction(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareFunction(\n id?: Matcher<t.Identifier>,\n): Matcher<t.DeclareFunction> {\n return new DeclareFunctionMatcher(\n id,\n );\n}\nexport class DeclareInterfaceMatcher extends Matcher<t.DeclareInterface> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n private readonly body?: Matcher<t.ObjectTypeAnnotation>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareInterface {\n if (\n !t.isNode(node) ||\n !t.isDeclareInterface(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this._extends === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._extends === null) {\n // null matcher means we expect null value\n if (node.extends !== null) {\n return false;\n }\n } else if (Array.isArray(this._extends)) {\n if (\n !tupleOf<unknown>(...this._extends).matchValue(node.extends, [\n ...keys,\n \"extends\",\n ])\n ) {\n return false;\n }\n } else if (!this._extends.matchValue(node.extends, [...keys, \"extends\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareInterface(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n body?: Matcher<t.ObjectTypeAnnotation>,\n): Matcher<t.DeclareInterface> {\n return new DeclareInterfaceMatcher(\n id,\n typeParameters,\n _extends,\n body,\n );\n}\nexport class DeclareModuleMatcher extends Matcher<t.DeclareModule> {\n constructor(\n private readonly id?: Matcher<t.Identifier | t.StringLiteral>,\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly kind?: Matcher<\"CommonJS\" | \"ES\"> | string | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareModule {\n if (\n !t.isNode(node) ||\n !t.isDeclareModule(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.kind === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.kind === \"string\") {\n if (this.kind !== node.kind) {\n return false;\n }\n } else if (this.kind === null) {\n // null matcher means we expect null value\n if (node.kind !== null) {\n return false;\n }\n } else if (!this.kind.matchValue(node.kind, [...keys, \"kind\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareModule(\n id?: Matcher<t.Identifier | t.StringLiteral>,\n body?: Matcher<t.BlockStatement>,\n kind?: Matcher<\"CommonJS\" | \"ES\"> | string | null,\n): Matcher<t.DeclareModule> {\n return new DeclareModuleMatcher(\n id,\n body,\n kind,\n );\n}\nexport class DeclareModuleExportsMatcher\n extends Matcher<t.DeclareModuleExports> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TypeAnnotation>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareModuleExports {\n if (\n !t.isNode(node) ||\n !t.isDeclareModuleExports(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareModuleExports(\n typeAnnotation?: Matcher<t.TypeAnnotation>,\n): Matcher<t.DeclareModuleExports> {\n return new DeclareModuleExportsMatcher(\n typeAnnotation,\n );\n}\nexport class DeclareOpaqueTypeMatcher extends Matcher<t.DeclareOpaqueType> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly supertype?: Matcher<t.FlowType> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareOpaqueType {\n if (\n !t.isNode(node) ||\n !t.isDeclareOpaqueType(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.supertype === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.supertype === null) {\n // null matcher means we expect null value\n if (node.supertype !== null) {\n return false;\n }\n } else if (\n !this.supertype.matchValue(node.supertype, [...keys, \"supertype\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareOpaqueType(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n supertype?: Matcher<t.FlowType> | null,\n): Matcher<t.DeclareOpaqueType> {\n return new DeclareOpaqueTypeMatcher(\n id,\n typeParameters,\n supertype,\n );\n}\nexport class DeclareTypeAliasMatcher extends Matcher<t.DeclareTypeAlias> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly right?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareTypeAlias {\n if (\n !t.isNode(node) ||\n !t.isDeclareTypeAlias(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareTypeAlias(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n right?: Matcher<t.FlowType>,\n): Matcher<t.DeclareTypeAlias> {\n return new DeclareTypeAliasMatcher(\n id,\n typeParameters,\n right,\n );\n}\nexport class DeclareVariableMatcher extends Matcher<t.DeclareVariable> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclareVariable {\n if (\n !t.isNode(node) ||\n !t.isDeclareVariable(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declareVariable(\n id?: Matcher<t.Identifier>,\n): Matcher<t.DeclareVariable> {\n return new DeclareVariableMatcher(\n id,\n );\n}\nexport class DeclaredPredicateMatcher extends Matcher<t.DeclaredPredicate> {\n constructor(\n private readonly value?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DeclaredPredicate {\n if (\n !t.isNode(node) ||\n !t.isDeclaredPredicate(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function declaredPredicate(\n value?: Matcher<t.Expression>,\n): Matcher<t.DeclaredPredicate> {\n return new DeclaredPredicateMatcher(\n value,\n );\n}\nexport class DecoratorMatcher extends Matcher<t.Decorator> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Decorator {\n if (\n !t.isNode(node) ||\n !t.isDecorator(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function decorator(\n expression?: Matcher<t.Expression>,\n): Matcher<t.Decorator> {\n return new DecoratorMatcher(\n expression,\n );\n}\nexport class DirectiveMatcher extends Matcher<t.Directive> {\n constructor(\n private readonly value?: Matcher<t.DirectiveLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Directive {\n if (\n !t.isNode(node) ||\n !t.isDirective(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function directive(\n value?: Matcher<t.DirectiveLiteral>,\n): Matcher<t.Directive> {\n return new DirectiveMatcher(\n value,\n );\n}\nexport class DirectiveLiteralMatcher extends Matcher<t.DirectiveLiteral> {\n constructor(\n private readonly value?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DirectiveLiteral {\n if (\n !t.isNode(node) ||\n !t.isDirectiveLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"string\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function directiveLiteral(\n value?: Matcher<string> | string,\n): Matcher<t.DirectiveLiteral> {\n return new DirectiveLiteralMatcher(\n value,\n );\n}\nexport class DoExpressionMatcher extends Matcher<t.DoExpression> {\n constructor(\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly async?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DoExpression {\n if (\n !t.isNode(node) ||\n !t.isDoExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.async === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.async === \"boolean\") {\n if (this.async !== node.async) {\n return false;\n }\n } else if (!this.async.matchValue(node.async, [...keys, \"async\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function doExpression(\n body?: Matcher<t.BlockStatement>,\n async?: Matcher<boolean> | boolean,\n): Matcher<t.DoExpression> {\n return new DoExpressionMatcher(\n body,\n async,\n );\n}\nexport class DoWhileStatementMatcher extends Matcher<t.DoWhileStatement> {\n constructor(\n private readonly test?: Matcher<t.Expression>,\n private readonly body?: Matcher<t.Statement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.DoWhileStatement {\n if (\n !t.isNode(node) ||\n !t.isDoWhileStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.test === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.test.matchValue(node.test, [...keys, \"test\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function doWhileStatement(\n test?: Matcher<t.Expression>,\n body?: Matcher<t.Statement>,\n): Matcher<t.DoWhileStatement> {\n return new DoWhileStatementMatcher(\n test,\n body,\n );\n}\nexport class EmptyStatementMatcher extends Matcher<t.EmptyStatement> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EmptyStatement {\n if (\n !t.isNode(node) ||\n !t.isEmptyStatement(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function emptyStatement(): Matcher<t.EmptyStatement> {\n return new EmptyStatementMatcher();\n}\nexport class EmptyTypeAnnotationMatcher extends Matcher<t.EmptyTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EmptyTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isEmptyTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function emptyTypeAnnotation(): Matcher<t.EmptyTypeAnnotation> {\n return new EmptyTypeAnnotationMatcher();\n}\nexport class EnumBooleanBodyMatcher extends Matcher<t.EnumBooleanBody> {\n constructor(\n private readonly members?:\n | Matcher<Array<t.EnumBooleanMember>>\n | Array<Matcher<t.EnumBooleanMember>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumBooleanBody {\n if (\n !t.isNode(node) ||\n !t.isEnumBooleanBody(node)\n ) {\n return false;\n }\n\n if (typeof this.members === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.members)) {\n if (\n !tupleOf<unknown>(...this.members).matchValue(node.members, [\n ...keys,\n \"members\",\n ])\n ) {\n return false;\n }\n } else if (!this.members.matchValue(node.members, [...keys, \"members\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumBooleanBody(\n members?:\n | Matcher<Array<t.EnumBooleanMember>>\n | Array<Matcher<t.EnumBooleanMember>>,\n): Matcher<t.EnumBooleanBody> {\n return new EnumBooleanBodyMatcher(\n members,\n );\n}\nexport class EnumBooleanMemberMatcher extends Matcher<t.EnumBooleanMember> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly init?: Matcher<t.BooleanLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumBooleanMember {\n if (\n !t.isNode(node) ||\n !t.isEnumBooleanMember(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.init === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.init.matchValue(node.init, [...keys, \"init\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumBooleanMember(\n id?: Matcher<t.Identifier>,\n init?: Matcher<t.BooleanLiteral>,\n): Matcher<t.EnumBooleanMember> {\n return new EnumBooleanMemberMatcher(\n id,\n init,\n );\n}\nexport class EnumDeclarationMatcher extends Matcher<t.EnumDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly body?: Matcher<\n t.EnumBooleanBody | t.EnumNumberBody | t.EnumStringBody | t.EnumSymbolBody\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumDeclaration {\n if (\n !t.isNode(node) ||\n !t.isEnumDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumDeclaration(\n id?: Matcher<t.Identifier>,\n body?: Matcher<\n t.EnumBooleanBody | t.EnumNumberBody | t.EnumStringBody | t.EnumSymbolBody\n >,\n): Matcher<t.EnumDeclaration> {\n return new EnumDeclarationMatcher(\n id,\n body,\n );\n}\nexport class EnumDefaultedMemberMatcher extends Matcher<t.EnumDefaultedMember> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumDefaultedMember {\n if (\n !t.isNode(node) ||\n !t.isEnumDefaultedMember(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumDefaultedMember(\n id?: Matcher<t.Identifier>,\n): Matcher<t.EnumDefaultedMember> {\n return new EnumDefaultedMemberMatcher(\n id,\n );\n}\nexport class EnumNumberBodyMatcher extends Matcher<t.EnumNumberBody> {\n constructor(\n private readonly members?:\n | Matcher<Array<t.EnumNumberMember>>\n | Array<Matcher<t.EnumNumberMember>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumNumberBody {\n if (\n !t.isNode(node) ||\n !t.isEnumNumberBody(node)\n ) {\n return false;\n }\n\n if (typeof this.members === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.members)) {\n if (\n !tupleOf<unknown>(...this.members).matchValue(node.members, [\n ...keys,\n \"members\",\n ])\n ) {\n return false;\n }\n } else if (!this.members.matchValue(node.members, [...keys, \"members\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumNumberBody(\n members?:\n | Matcher<Array<t.EnumNumberMember>>\n | Array<Matcher<t.EnumNumberMember>>,\n): Matcher<t.EnumNumberBody> {\n return new EnumNumberBodyMatcher(\n members,\n );\n}\nexport class EnumNumberMemberMatcher extends Matcher<t.EnumNumberMember> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly init?: Matcher<t.NumericLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumNumberMember {\n if (\n !t.isNode(node) ||\n !t.isEnumNumberMember(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.init === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.init.matchValue(node.init, [...keys, \"init\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumNumberMember(\n id?: Matcher<t.Identifier>,\n init?: Matcher<t.NumericLiteral>,\n): Matcher<t.EnumNumberMember> {\n return new EnumNumberMemberMatcher(\n id,\n init,\n );\n}\nexport class EnumStringBodyMatcher extends Matcher<t.EnumStringBody> {\n constructor(\n private readonly members?:\n | Matcher<Array<t.EnumStringMember | t.EnumDefaultedMember>>\n | Array<Matcher<t.EnumStringMember> | Matcher<t.EnumDefaultedMember>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumStringBody {\n if (\n !t.isNode(node) ||\n !t.isEnumStringBody(node)\n ) {\n return false;\n }\n\n if (typeof this.members === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.members)) {\n if (\n !tupleOf<unknown>(...this.members).matchValue(node.members, [\n ...keys,\n \"members\",\n ])\n ) {\n return false;\n }\n } else if (!this.members.matchValue(node.members, [...keys, \"members\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumStringBody(\n members?:\n | Matcher<Array<t.EnumStringMember | t.EnumDefaultedMember>>\n | Array<Matcher<t.EnumStringMember> | Matcher<t.EnumDefaultedMember>>,\n): Matcher<t.EnumStringBody> {\n return new EnumStringBodyMatcher(\n members,\n );\n}\nexport class EnumStringMemberMatcher extends Matcher<t.EnumStringMember> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly init?: Matcher<t.StringLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumStringMember {\n if (\n !t.isNode(node) ||\n !t.isEnumStringMember(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.init === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.init.matchValue(node.init, [...keys, \"init\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumStringMember(\n id?: Matcher<t.Identifier>,\n init?: Matcher<t.StringLiteral>,\n): Matcher<t.EnumStringMember> {\n return new EnumStringMemberMatcher(\n id,\n init,\n );\n}\nexport class EnumSymbolBodyMatcher extends Matcher<t.EnumSymbolBody> {\n constructor(\n private readonly members?:\n | Matcher<Array<t.EnumDefaultedMember>>\n | Array<Matcher<t.EnumDefaultedMember>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.EnumSymbolBody {\n if (\n !t.isNode(node) ||\n !t.isEnumSymbolBody(node)\n ) {\n return false;\n }\n\n if (typeof this.members === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.members)) {\n if (\n !tupleOf<unknown>(...this.members).matchValue(node.members, [\n ...keys,\n \"members\",\n ])\n ) {\n return false;\n }\n } else if (!this.members.matchValue(node.members, [...keys, \"members\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function enumSymbolBody(\n members?:\n | Matcher<Array<t.EnumDefaultedMember>>\n | Array<Matcher<t.EnumDefaultedMember>>,\n): Matcher<t.EnumSymbolBody> {\n return new EnumSymbolBodyMatcher(\n members,\n );\n}\nexport class ExistsTypeAnnotationMatcher\n extends Matcher<t.ExistsTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExistsTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isExistsTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function existsTypeAnnotation(): Matcher<t.ExistsTypeAnnotation> {\n return new ExistsTypeAnnotationMatcher();\n}\nexport class ExportAllDeclarationMatcher\n extends Matcher<t.ExportAllDeclaration> {\n constructor(\n private readonly source?: Matcher<t.StringLiteral>,\n private readonly attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExportAllDeclaration {\n if (\n !t.isNode(node) ||\n !t.isExportAllDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.attributes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.attributes === null) {\n // null matcher means we expect null value\n if (node.attributes !== null) {\n return false;\n }\n } else if (Array.isArray(this.attributes)) {\n if (\n !tupleOf<unknown>(...this.attributes).matchValue(node.attributes, [\n ...keys,\n \"attributes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.attributes.matchValue(node.attributes, [...keys, \"attributes\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function exportAllDeclaration(\n source?: Matcher<t.StringLiteral>,\n attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n): Matcher<t.ExportAllDeclaration> {\n return new ExportAllDeclarationMatcher(\n source,\n attributes,\n );\n}\nexport class ExportDefaultDeclarationMatcher\n extends Matcher<t.ExportDefaultDeclaration> {\n constructor(\n private readonly declaration?: Matcher<\n | t.FunctionDeclaration\n | t.ClassDeclaration\n | t.Expression\n | t.TSDeclareFunction\n | t.TSInterfaceDeclaration\n | t.EnumDeclaration\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExportDefaultDeclaration {\n if (\n !t.isNode(node) ||\n !t.isExportDefaultDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.declaration === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.declaration.matchValue(node.declaration, [...keys, \"declaration\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function exportDefaultDeclaration(\n declaration?: Matcher<\n | t.FunctionDeclaration\n | t.ClassDeclaration\n | t.Expression\n | t.TSDeclareFunction\n | t.TSInterfaceDeclaration\n | t.EnumDeclaration\n >,\n): Matcher<t.ExportDefaultDeclaration> {\n return new ExportDefaultDeclarationMatcher(\n declaration,\n );\n}\nexport class ExportDefaultSpecifierMatcher\n extends Matcher<t.ExportDefaultSpecifier> {\n constructor(\n private readonly exported?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExportDefaultSpecifier {\n if (\n !t.isNode(node) ||\n !t.isExportDefaultSpecifier(node)\n ) {\n return false;\n }\n\n if (typeof this.exported === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.exported.matchValue(node.exported, [...keys, \"exported\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function exportDefaultSpecifier(\n exported?: Matcher<t.Identifier>,\n): Matcher<t.ExportDefaultSpecifier> {\n return new ExportDefaultSpecifierMatcher(\n exported,\n );\n}\nexport class ExportNamedDeclarationMatcher\n extends Matcher<t.ExportNamedDeclaration> {\n constructor(\n private readonly declaration?:\n | Matcher<\n | t.VariableDeclaration\n | t.FunctionDeclaration\n | t.ClassDeclaration\n | t.TSDeclareFunction\n | t.TSEnumDeclaration\n | t.TSImportEqualsDeclaration\n | t.TSInterfaceDeclaration\n | t.TSModuleDeclaration\n | t.TSTypeAliasDeclaration\n | t.EnumDeclaration\n | t.InterfaceDeclaration\n | t.OpaqueType\n | t.TypeAlias\n >\n | null,\n private readonly specifiers?:\n | Matcher<\n Array<\n | t.ExportSpecifier\n | t.ExportDefaultSpecifier\n | t.ExportNamespaceSpecifier\n >\n >\n | Array<\n | Matcher<t.ExportSpecifier>\n | Matcher<t.ExportDefaultSpecifier>\n | Matcher<t.ExportNamespaceSpecifier>\n >,\n private readonly source?: Matcher<t.StringLiteral> | null,\n private readonly attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExportNamedDeclaration {\n if (\n !t.isNode(node) ||\n !t.isExportNamedDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.declaration === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.declaration === null) {\n // null matcher means we expect null value\n if (node.declaration !== null) {\n return false;\n }\n } else if (\n !this.declaration.matchValue(node.declaration, [...keys, \"declaration\"])\n ) {\n return false;\n }\n\n if (typeof this.specifiers === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.specifiers)) {\n if (\n !tupleOf<unknown>(...this.specifiers).matchValue(node.specifiers, [\n ...keys,\n \"specifiers\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.specifiers.matchValue(node.specifiers, [...keys, \"specifiers\"])\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.source === null) {\n // null matcher means we expect null value\n if (node.source !== null) {\n return false;\n }\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.attributes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.attributes === null) {\n // null matcher means we expect null value\n if (node.attributes !== null) {\n return false;\n }\n } else if (Array.isArray(this.attributes)) {\n if (\n !tupleOf<unknown>(...this.attributes).matchValue(node.attributes, [\n ...keys,\n \"attributes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.attributes.matchValue(node.attributes, [...keys, \"attributes\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function exportNamedDeclaration(\n declaration?:\n | Matcher<\n | t.VariableDeclaration\n | t.FunctionDeclaration\n | t.ClassDeclaration\n | t.TSDeclareFunction\n | t.TSEnumDeclaration\n | t.TSImportEqualsDeclaration\n | t.TSInterfaceDeclaration\n | t.TSModuleDeclaration\n | t.TSTypeAliasDeclaration\n | t.EnumDeclaration\n | t.InterfaceDeclaration\n | t.OpaqueType\n | t.TypeAlias\n >\n | null,\n specifiers?:\n | Matcher<\n Array<\n | t.ExportSpecifier\n | t.ExportDefaultSpecifier\n | t.ExportNamespaceSpecifier\n >\n >\n | Array<\n | Matcher<t.ExportSpecifier>\n | Matcher<t.ExportDefaultSpecifier>\n | Matcher<t.ExportNamespaceSpecifier>\n >,\n source?: Matcher<t.StringLiteral> | null,\n attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n): Matcher<t.ExportNamedDeclaration> {\n return new ExportNamedDeclarationMatcher(\n declaration,\n specifiers,\n source,\n attributes,\n );\n}\nexport class ExportNamespaceSpecifierMatcher\n extends Matcher<t.ExportNamespaceSpecifier> {\n constructor(\n private readonly exported?: Matcher<t.Identifier | t.StringLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExportNamespaceSpecifier {\n if (\n !t.isNode(node) ||\n !t.isExportNamespaceSpecifier(node)\n ) {\n return false;\n }\n\n if (typeof this.exported === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.exported.matchValue(node.exported, [...keys, \"exported\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function exportNamespaceSpecifier(\n exported?: Matcher<t.Identifier | t.StringLiteral>,\n): Matcher<t.ExportNamespaceSpecifier> {\n return new ExportNamespaceSpecifierMatcher(\n exported,\n );\n}\nexport class ExportSpecifierMatcher extends Matcher<t.ExportSpecifier> {\n constructor(\n private readonly local?: Matcher<t.Identifier>,\n private readonly exported?: Matcher<t.Identifier | t.StringLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExportSpecifier {\n if (\n !t.isNode(node) ||\n !t.isExportSpecifier(node)\n ) {\n return false;\n }\n\n if (typeof this.local === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.local.matchValue(node.local, [...keys, \"local\"])) {\n return false;\n }\n\n if (typeof this.exported === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.exported.matchValue(node.exported, [...keys, \"exported\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function exportSpecifier(\n local?: Matcher<t.Identifier>,\n exported?: Matcher<t.Identifier | t.StringLiteral>,\n): Matcher<t.ExportSpecifier> {\n return new ExportSpecifierMatcher(\n local,\n exported,\n );\n}\nexport class ExpressionStatementMatcher extends Matcher<t.ExpressionStatement> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ExpressionStatement {\n if (\n !t.isNode(node) ||\n !t.isExpressionStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function expressionStatement(\n expression?: Matcher<t.Expression>,\n): Matcher<t.ExpressionStatement> {\n return new ExpressionStatementMatcher(\n expression,\n );\n}\nexport class FileMatcher extends Matcher<t.File> {\n constructor(\n private readonly program?: Matcher<t.Program>,\n private readonly comments?:\n | Matcher<Array<t.CommentBlock | t.CommentLine>>\n | null,\n private readonly tokens?: Matcher<Array<any>> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.File {\n if (\n !t.isNode(node) ||\n !t.isFile(node)\n ) {\n return false;\n }\n\n if (typeof this.program === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.program.matchValue(node.program, [...keys, \"program\"])) {\n return false;\n }\n\n if (typeof this.comments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.comments === null) {\n // null matcher means we expect null value\n if (node.comments !== null) {\n return false;\n }\n } else if (\n !this.comments.matchValue(node.comments, [...keys, \"comments\"])\n ) {\n return false;\n }\n\n if (typeof this.tokens === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.tokens === null) {\n // null matcher means we expect null value\n if (node.tokens !== null) {\n return false;\n }\n } else if (!this.tokens.matchValue(node.tokens, [...keys, \"tokens\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function file(\n program?: Matcher<t.Program>,\n comments?: Matcher<Array<t.CommentBlock | t.CommentLine>> | null,\n tokens?: Matcher<Array<any>> | null,\n): Matcher<t.File> {\n return new FileMatcher(\n program,\n comments,\n tokens,\n );\n}\nexport class ForInStatementMatcher extends Matcher<t.ForInStatement> {\n constructor(\n private readonly left?: Matcher<\n | t.VariableDeclaration\n | t.Identifier\n | t.MemberExpression\n | t.ArrayPattern\n | t.ObjectPattern\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n private readonly right?: Matcher<t.Expression>,\n private readonly body?: Matcher<t.Statement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ForInStatement {\n if (\n !t.isNode(node) ||\n !t.isForInStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function forInStatement(\n left?: Matcher<\n | t.VariableDeclaration\n | t.Identifier\n | t.MemberExpression\n | t.ArrayPattern\n | t.ObjectPattern\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n right?: Matcher<t.Expression>,\n body?: Matcher<t.Statement>,\n): Matcher<t.ForInStatement> {\n return new ForInStatementMatcher(\n left,\n right,\n body,\n );\n}\nexport class ForOfStatementMatcher extends Matcher<t.ForOfStatement> {\n constructor(\n private readonly left?: Matcher<\n | t.VariableDeclaration\n | t.Identifier\n | t.MemberExpression\n | t.ArrayPattern\n | t.ObjectPattern\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n private readonly right?: Matcher<t.Expression>,\n private readonly body?: Matcher<t.Statement>,\n private readonly _await?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ForOfStatement {\n if (\n !t.isNode(node) ||\n !t.isForOfStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this._await === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._await === \"boolean\") {\n if (this._await !== node.await) {\n return false;\n }\n } else if (!this._await.matchValue(node.await, [...keys, \"await\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function forOfStatement(\n left?: Matcher<\n | t.VariableDeclaration\n | t.Identifier\n | t.MemberExpression\n | t.ArrayPattern\n | t.ObjectPattern\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n right?: Matcher<t.Expression>,\n body?: Matcher<t.Statement>,\n _await?: Matcher<boolean> | boolean,\n): Matcher<t.ForOfStatement> {\n return new ForOfStatementMatcher(\n left,\n right,\n body,\n _await,\n );\n}\nexport class ForStatementMatcher extends Matcher<t.ForStatement> {\n constructor(\n private readonly init?:\n | Matcher<t.VariableDeclaration | t.Expression>\n | null,\n private readonly test?: Matcher<t.Expression> | null,\n private readonly update?: Matcher<t.Expression> | null,\n private readonly body?: Matcher<t.Statement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ForStatement {\n if (\n !t.isNode(node) ||\n !t.isForStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.init === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.init === null) {\n // null matcher means we expect null value\n if (node.init !== null) {\n return false;\n }\n } else if (!this.init.matchValue(node.init, [...keys, \"init\"])) {\n return false;\n }\n\n if (typeof this.test === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.test === null) {\n // null matcher means we expect null value\n if (node.test !== null) {\n return false;\n }\n } else if (!this.test.matchValue(node.test, [...keys, \"test\"])) {\n return false;\n }\n\n if (typeof this.update === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.update === null) {\n // null matcher means we expect null value\n if (node.update !== null) {\n return false;\n }\n } else if (!this.update.matchValue(node.update, [...keys, \"update\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function forStatement(\n init?: Matcher<t.VariableDeclaration | t.Expression> | null,\n test?: Matcher<t.Expression> | null,\n update?: Matcher<t.Expression> | null,\n body?: Matcher<t.Statement>,\n): Matcher<t.ForStatement> {\n return new ForStatementMatcher(\n init,\n test,\n update,\n body,\n );\n}\nexport class FunctionDeclarationMatcher extends Matcher<t.FunctionDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier> | null,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly generator?: Matcher<boolean> | boolean,\n private readonly async?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.FunctionDeclaration {\n if (\n !t.isNode(node) ||\n !t.isFunctionDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.id === null) {\n // null matcher means we expect null value\n if (node.id !== null) {\n return false;\n }\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.generator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.generator === \"boolean\") {\n if (this.generator !== node.generator) {\n return false;\n }\n } else if (\n !this.generator.matchValue(node.generator, [...keys, \"generator\"])\n ) {\n return false;\n }\n\n if (typeof this.async === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.async === \"boolean\") {\n if (this.async !== node.async) {\n return false;\n }\n } else if (!this.async.matchValue(node.async, [...keys, \"async\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function functionDeclaration(\n id?: Matcher<t.Identifier> | null,\n params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n body?: Matcher<t.BlockStatement>,\n generator?: Matcher<boolean> | boolean,\n async?: Matcher<boolean> | boolean,\n): Matcher<t.FunctionDeclaration> {\n return new FunctionDeclarationMatcher(\n id,\n params,\n body,\n generator,\n async,\n );\n}\nexport class FunctionExpressionMatcher extends Matcher<t.FunctionExpression> {\n constructor(\n private readonly id?: Matcher<t.Identifier> | null,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly generator?: Matcher<boolean> | boolean,\n private readonly async?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.FunctionExpression {\n if (\n !t.isNode(node) ||\n !t.isFunctionExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.id === null) {\n // null matcher means we expect null value\n if (node.id !== null) {\n return false;\n }\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.generator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.generator === \"boolean\") {\n if (this.generator !== node.generator) {\n return false;\n }\n } else if (\n !this.generator.matchValue(node.generator, [...keys, \"generator\"])\n ) {\n return false;\n }\n\n if (typeof this.async === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.async === \"boolean\") {\n if (this.async !== node.async) {\n return false;\n }\n } else if (!this.async.matchValue(node.async, [...keys, \"async\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function functionExpression(\n id?: Matcher<t.Identifier> | null,\n params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n body?: Matcher<t.BlockStatement>,\n generator?: Matcher<boolean> | boolean,\n async?: Matcher<boolean> | boolean,\n): Matcher<t.FunctionExpression> {\n return new FunctionExpressionMatcher(\n id,\n params,\n body,\n generator,\n async,\n );\n}\nexport class FunctionTypeAnnotationMatcher\n extends Matcher<t.FunctionTypeAnnotation> {\n constructor(\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<Array<t.FunctionTypeParam>>\n | Array<Matcher<t.FunctionTypeParam>>,\n private readonly rest?: Matcher<t.FunctionTypeParam> | null,\n private readonly returnType?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.FunctionTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isFunctionTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.rest === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.rest === null) {\n // null matcher means we expect null value\n if (node.rest !== null) {\n return false;\n }\n } else if (!this.rest.matchValue(node.rest, [...keys, \"rest\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function functionTypeAnnotation(\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n params?:\n | Matcher<Array<t.FunctionTypeParam>>\n | Array<Matcher<t.FunctionTypeParam>>,\n rest?: Matcher<t.FunctionTypeParam> | null,\n returnType?: Matcher<t.FlowType>,\n): Matcher<t.FunctionTypeAnnotation> {\n return new FunctionTypeAnnotationMatcher(\n typeParameters,\n params,\n rest,\n returnType,\n );\n}\nexport class FunctionTypeParamMatcher extends Matcher<t.FunctionTypeParam> {\n constructor(\n private readonly name?: Matcher<t.Identifier> | null,\n private readonly typeAnnotation?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.FunctionTypeParam {\n if (\n !t.isNode(node) ||\n !t.isFunctionTypeParam(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.name === null) {\n // null matcher means we expect null value\n if (node.name !== null) {\n return false;\n }\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function functionTypeParam(\n name?: Matcher<t.Identifier> | null,\n typeAnnotation?: Matcher<t.FlowType>,\n): Matcher<t.FunctionTypeParam> {\n return new FunctionTypeParamMatcher(\n name,\n typeAnnotation,\n );\n}\nexport class GenericTypeAnnotationMatcher\n extends Matcher<t.GenericTypeAnnotation> {\n constructor(\n private readonly id?: Matcher<t.Identifier | t.QualifiedTypeIdentifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.GenericTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isGenericTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function genericTypeAnnotation(\n id?: Matcher<t.Identifier | t.QualifiedTypeIdentifier>,\n typeParameters?: Matcher<t.TypeParameterInstantiation> | null,\n): Matcher<t.GenericTypeAnnotation> {\n return new GenericTypeAnnotationMatcher(\n id,\n typeParameters,\n );\n}\nexport class IdentifierMatcher extends Matcher<t.Identifier> {\n constructor(\n private readonly name?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Identifier {\n if (\n !t.isNode(node) ||\n !t.isIdentifier(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.name === \"string\") {\n if (this.name !== node.name) {\n return false;\n }\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function identifier(\n name?: Matcher<string> | string,\n): Matcher<t.Identifier> {\n return new IdentifierMatcher(\n name,\n );\n}\nexport class IfStatementMatcher extends Matcher<t.IfStatement> {\n constructor(\n private readonly test?: Matcher<t.Expression>,\n private readonly consequent?: Matcher<t.Statement>,\n private readonly alternate?: Matcher<t.Statement> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.IfStatement {\n if (\n !t.isNode(node) ||\n !t.isIfStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.test === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.test.matchValue(node.test, [...keys, \"test\"])) {\n return false;\n }\n\n if (typeof this.consequent === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.consequent.matchValue(node.consequent, [...keys, \"consequent\"])\n ) {\n return false;\n }\n\n if (typeof this.alternate === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.alternate === null) {\n // null matcher means we expect null value\n if (node.alternate !== null) {\n return false;\n }\n } else if (\n !this.alternate.matchValue(node.alternate, [...keys, \"alternate\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function ifStatement(\n test?: Matcher<t.Expression>,\n consequent?: Matcher<t.Statement>,\n alternate?: Matcher<t.Statement> | null,\n): Matcher<t.IfStatement> {\n return new IfStatementMatcher(\n test,\n consequent,\n alternate,\n );\n}\nexport class ImportMatcher extends Matcher<t.Import> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Import {\n if (\n !t.isNode(node) ||\n !t.isImport(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function Import(): Matcher<t.Import> {\n return new ImportMatcher();\n}\nexport class ImportAttributeMatcher extends Matcher<t.ImportAttribute> {\n constructor(\n private readonly key?: Matcher<t.Identifier | t.StringLiteral>,\n private readonly value?: Matcher<t.StringLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ImportAttribute {\n if (\n !t.isNode(node) ||\n !t.isImportAttribute(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function importAttribute(\n key?: Matcher<t.Identifier | t.StringLiteral>,\n value?: Matcher<t.StringLiteral>,\n): Matcher<t.ImportAttribute> {\n return new ImportAttributeMatcher(\n key,\n value,\n );\n}\nexport class ImportDeclarationMatcher extends Matcher<t.ImportDeclaration> {\n constructor(\n private readonly specifiers?:\n | Matcher<\n Array<\n | t.ImportSpecifier\n | t.ImportDefaultSpecifier\n | t.ImportNamespaceSpecifier\n >\n >\n | Array<\n | Matcher<t.ImportSpecifier>\n | Matcher<t.ImportDefaultSpecifier>\n | Matcher<t.ImportNamespaceSpecifier>\n >,\n private readonly source?: Matcher<t.StringLiteral>,\n private readonly attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ImportDeclaration {\n if (\n !t.isNode(node) ||\n !t.isImportDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.specifiers === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.specifiers)) {\n if (\n !tupleOf<unknown>(...this.specifiers).matchValue(node.specifiers, [\n ...keys,\n \"specifiers\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.specifiers.matchValue(node.specifiers, [...keys, \"specifiers\"])\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.attributes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.attributes === null) {\n // null matcher means we expect null value\n if (node.attributes !== null) {\n return false;\n }\n } else if (Array.isArray(this.attributes)) {\n if (\n !tupleOf<unknown>(...this.attributes).matchValue(node.attributes, [\n ...keys,\n \"attributes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.attributes.matchValue(node.attributes, [...keys, \"attributes\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function importDeclaration(\n specifiers?:\n | Matcher<\n Array<\n | t.ImportSpecifier\n | t.ImportDefaultSpecifier\n | t.ImportNamespaceSpecifier\n >\n >\n | Array<\n | Matcher<t.ImportSpecifier>\n | Matcher<t.ImportDefaultSpecifier>\n | Matcher<t.ImportNamespaceSpecifier>\n >,\n source?: Matcher<t.StringLiteral>,\n attributes?:\n | Matcher<Array<t.ImportAttribute>>\n | Array<Matcher<t.ImportAttribute>>\n | null,\n): Matcher<t.ImportDeclaration> {\n return new ImportDeclarationMatcher(\n specifiers,\n source,\n attributes,\n );\n}\nexport class ImportDefaultSpecifierMatcher\n extends Matcher<t.ImportDefaultSpecifier> {\n constructor(\n private readonly local?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ImportDefaultSpecifier {\n if (\n !t.isNode(node) ||\n !t.isImportDefaultSpecifier(node)\n ) {\n return false;\n }\n\n if (typeof this.local === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.local.matchValue(node.local, [...keys, \"local\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function importDefaultSpecifier(\n local?: Matcher<t.Identifier>,\n): Matcher<t.ImportDefaultSpecifier> {\n return new ImportDefaultSpecifierMatcher(\n local,\n );\n}\nexport class ImportExpressionMatcher extends Matcher<t.ImportExpression> {\n constructor(\n private readonly source?: Matcher<t.Expression>,\n private readonly options?: Matcher<t.Expression> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ImportExpression {\n if (\n !t.isNode(node) ||\n !t.isImportExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.options === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.options === null) {\n // null matcher means we expect null value\n if (node.options !== null) {\n return false;\n }\n } else if (!this.options.matchValue(node.options, [...keys, \"options\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function importExpression(\n source?: Matcher<t.Expression>,\n options?: Matcher<t.Expression> | null,\n): Matcher<t.ImportExpression> {\n return new ImportExpressionMatcher(\n source,\n options,\n );\n}\nexport class ImportNamespaceSpecifierMatcher\n extends Matcher<t.ImportNamespaceSpecifier> {\n constructor(\n private readonly local?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ImportNamespaceSpecifier {\n if (\n !t.isNode(node) ||\n !t.isImportNamespaceSpecifier(node)\n ) {\n return false;\n }\n\n if (typeof this.local === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.local.matchValue(node.local, [...keys, \"local\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function importNamespaceSpecifier(\n local?: Matcher<t.Identifier>,\n): Matcher<t.ImportNamespaceSpecifier> {\n return new ImportNamespaceSpecifierMatcher(\n local,\n );\n}\nexport class ImportSpecifierMatcher extends Matcher<t.ImportSpecifier> {\n constructor(\n private readonly local?: Matcher<t.Identifier>,\n private readonly imported?: Matcher<t.Identifier | t.StringLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ImportSpecifier {\n if (\n !t.isNode(node) ||\n !t.isImportSpecifier(node)\n ) {\n return false;\n }\n\n if (typeof this.local === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.local.matchValue(node.local, [...keys, \"local\"])) {\n return false;\n }\n\n if (typeof this.imported === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.imported.matchValue(node.imported, [...keys, \"imported\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function importSpecifier(\n local?: Matcher<t.Identifier>,\n imported?: Matcher<t.Identifier | t.StringLiteral>,\n): Matcher<t.ImportSpecifier> {\n return new ImportSpecifierMatcher(\n local,\n imported,\n );\n}\nexport class IndexedAccessTypeMatcher extends Matcher<t.IndexedAccessType> {\n constructor(\n private readonly objectType?: Matcher<t.FlowType>,\n private readonly indexType?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.IndexedAccessType {\n if (\n !t.isNode(node) ||\n !t.isIndexedAccessType(node)\n ) {\n return false;\n }\n\n if (typeof this.objectType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.objectType.matchValue(node.objectType, [...keys, \"objectType\"])\n ) {\n return false;\n }\n\n if (typeof this.indexType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.indexType.matchValue(node.indexType, [...keys, \"indexType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function indexedAccessType(\n objectType?: Matcher<t.FlowType>,\n indexType?: Matcher<t.FlowType>,\n): Matcher<t.IndexedAccessType> {\n return new IndexedAccessTypeMatcher(\n objectType,\n indexType,\n );\n}\nexport class InferredPredicateMatcher extends Matcher<t.InferredPredicate> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.InferredPredicate {\n if (\n !t.isNode(node) ||\n !t.isInferredPredicate(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function inferredPredicate(): Matcher<t.InferredPredicate> {\n return new InferredPredicateMatcher();\n}\nexport class InterfaceDeclarationMatcher\n extends Matcher<t.InterfaceDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n private readonly body?: Matcher<t.ObjectTypeAnnotation>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.InterfaceDeclaration {\n if (\n !t.isNode(node) ||\n !t.isInterfaceDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this._extends === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._extends === null) {\n // null matcher means we expect null value\n if (node.extends !== null) {\n return false;\n }\n } else if (Array.isArray(this._extends)) {\n if (\n !tupleOf<unknown>(...this._extends).matchValue(node.extends, [\n ...keys,\n \"extends\",\n ])\n ) {\n return false;\n }\n } else if (!this._extends.matchValue(node.extends, [...keys, \"extends\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function interfaceDeclaration(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n body?: Matcher<t.ObjectTypeAnnotation>,\n): Matcher<t.InterfaceDeclaration> {\n return new InterfaceDeclarationMatcher(\n id,\n typeParameters,\n _extends,\n body,\n );\n}\nexport class InterfaceExtendsMatcher extends Matcher<t.InterfaceExtends> {\n constructor(\n private readonly id?: Matcher<t.Identifier | t.QualifiedTypeIdentifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.InterfaceExtends {\n if (\n !t.isNode(node) ||\n !t.isInterfaceExtends(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function interfaceExtends(\n id?: Matcher<t.Identifier | t.QualifiedTypeIdentifier>,\n typeParameters?: Matcher<t.TypeParameterInstantiation> | null,\n): Matcher<t.InterfaceExtends> {\n return new InterfaceExtendsMatcher(\n id,\n typeParameters,\n );\n}\nexport class InterfaceTypeAnnotationMatcher\n extends Matcher<t.InterfaceTypeAnnotation> {\n constructor(\n private readonly _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n private readonly body?: Matcher<t.ObjectTypeAnnotation>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.InterfaceTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isInterfaceTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this._extends === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._extends === null) {\n // null matcher means we expect null value\n if (node.extends !== null) {\n return false;\n }\n } else if (Array.isArray(this._extends)) {\n if (\n !tupleOf<unknown>(...this._extends).matchValue(node.extends, [\n ...keys,\n \"extends\",\n ])\n ) {\n return false;\n }\n } else if (!this._extends.matchValue(node.extends, [...keys, \"extends\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function interfaceTypeAnnotation(\n _extends?:\n | Matcher<Array<t.InterfaceExtends>>\n | Array<Matcher<t.InterfaceExtends>>\n | null,\n body?: Matcher<t.ObjectTypeAnnotation>,\n): Matcher<t.InterfaceTypeAnnotation> {\n return new InterfaceTypeAnnotationMatcher(\n _extends,\n body,\n );\n}\nexport class InterpreterDirectiveMatcher\n extends Matcher<t.InterpreterDirective> {\n constructor(\n private readonly value?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.InterpreterDirective {\n if (\n !t.isNode(node) ||\n !t.isInterpreterDirective(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"string\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function interpreterDirective(\n value?: Matcher<string> | string,\n): Matcher<t.InterpreterDirective> {\n return new InterpreterDirectiveMatcher(\n value,\n );\n}\nexport class IntersectionTypeAnnotationMatcher\n extends Matcher<t.IntersectionTypeAnnotation> {\n constructor(\n private readonly types?:\n | Matcher<Array<t.FlowType>>\n | Array<Matcher<t.FlowType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.IntersectionTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isIntersectionTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.types === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.types)) {\n if (\n !tupleOf<unknown>(...this.types).matchValue(node.types, [\n ...keys,\n \"types\",\n ])\n ) {\n return false;\n }\n } else if (!this.types.matchValue(node.types, [...keys, \"types\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function intersectionTypeAnnotation(\n types?: Matcher<Array<t.FlowType>> | Array<Matcher<t.FlowType>>,\n): Matcher<t.IntersectionTypeAnnotation> {\n return new IntersectionTypeAnnotationMatcher(\n types,\n );\n}\nexport class JSXAttributeMatcher extends Matcher<t.JSXAttribute> {\n constructor(\n private readonly name?: Matcher<t.JSXIdentifier | t.JSXNamespacedName>,\n private readonly value?:\n | Matcher<\n | t.JSXElement\n | t.JSXFragment\n | t.StringLiteral\n | t.JSXExpressionContainer\n >\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXAttribute {\n if (\n !t.isNode(node) ||\n !t.isJSXAttribute(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.value === null) {\n // null matcher means we expect null value\n if (node.value !== null) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxAttribute(\n name?: Matcher<t.JSXIdentifier | t.JSXNamespacedName>,\n value?:\n | Matcher<\n t.JSXElement | t.JSXFragment | t.StringLiteral | t.JSXExpressionContainer\n >\n | null,\n): Matcher<t.JSXAttribute> {\n return new JSXAttributeMatcher(\n name,\n value,\n );\n}\nexport class JSXClosingElementMatcher extends Matcher<t.JSXClosingElement> {\n constructor(\n private readonly name?: Matcher<\n t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXClosingElement {\n if (\n !t.isNode(node) ||\n !t.isJSXClosingElement(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxClosingElement(\n name?: Matcher<t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName>,\n): Matcher<t.JSXClosingElement> {\n return new JSXClosingElementMatcher(\n name,\n );\n}\nexport class JSXClosingFragmentMatcher extends Matcher<t.JSXClosingFragment> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXClosingFragment {\n if (\n !t.isNode(node) ||\n !t.isJSXClosingFragment(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxClosingFragment(): Matcher<t.JSXClosingFragment> {\n return new JSXClosingFragmentMatcher();\n}\nexport class JSXElementMatcher extends Matcher<t.JSXElement> {\n constructor(\n private readonly openingElement?: Matcher<t.JSXOpeningElement>,\n private readonly closingElement?: Matcher<t.JSXClosingElement> | null,\n private readonly children?:\n | Matcher<\n Array<\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXSpreadChild\n | t.JSXElement\n | t.JSXFragment\n >\n >\n | Array<\n | Matcher<t.JSXText>\n | Matcher<t.JSXExpressionContainer>\n | Matcher<t.JSXSpreadChild>\n | Matcher<t.JSXElement>\n | Matcher<t.JSXFragment>\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXElement {\n if (\n !t.isNode(node) ||\n !t.isJSXElement(node)\n ) {\n return false;\n }\n\n if (typeof this.openingElement === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.openingElement.matchValue(node.openingElement, [\n ...keys,\n \"openingElement\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.closingElement === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.closingElement === null) {\n // null matcher means we expect null value\n if (node.closingElement !== null) {\n return false;\n }\n } else if (\n !this.closingElement.matchValue(node.closingElement, [\n ...keys,\n \"closingElement\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.children === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.children)) {\n if (\n !tupleOf<unknown>(...this.children).matchValue(node.children, [\n ...keys,\n \"children\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.children.matchValue(node.children, [...keys, \"children\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxElement(\n openingElement?: Matcher<t.JSXOpeningElement>,\n closingElement?: Matcher<t.JSXClosingElement> | null,\n children?:\n | Matcher<\n Array<\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXSpreadChild\n | t.JSXElement\n | t.JSXFragment\n >\n >\n | Array<\n | Matcher<t.JSXText>\n | Matcher<t.JSXExpressionContainer>\n | Matcher<t.JSXSpreadChild>\n | Matcher<t.JSXElement>\n | Matcher<t.JSXFragment>\n >,\n): Matcher<t.JSXElement> {\n return new JSXElementMatcher(\n openingElement,\n closingElement,\n children,\n );\n}\nexport class JSXEmptyExpressionMatcher extends Matcher<t.JSXEmptyExpression> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXEmptyExpression {\n if (\n !t.isNode(node) ||\n !t.isJSXEmptyExpression(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxEmptyExpression(): Matcher<t.JSXEmptyExpression> {\n return new JSXEmptyExpressionMatcher();\n}\nexport class JSXExpressionContainerMatcher\n extends Matcher<t.JSXExpressionContainer> {\n constructor(\n private readonly expression?: Matcher<t.Expression | t.JSXEmptyExpression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXExpressionContainer {\n if (\n !t.isNode(node) ||\n !t.isJSXExpressionContainer(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxExpressionContainer(\n expression?: Matcher<t.Expression | t.JSXEmptyExpression>,\n): Matcher<t.JSXExpressionContainer> {\n return new JSXExpressionContainerMatcher(\n expression,\n );\n}\nexport class JSXFragmentMatcher extends Matcher<t.JSXFragment> {\n constructor(\n private readonly openingFragment?: Matcher<t.JSXOpeningFragment>,\n private readonly closingFragment?: Matcher<t.JSXClosingFragment>,\n private readonly children?:\n | Matcher<\n Array<\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXSpreadChild\n | t.JSXElement\n | t.JSXFragment\n >\n >\n | Array<\n | Matcher<t.JSXText>\n | Matcher<t.JSXExpressionContainer>\n | Matcher<t.JSXSpreadChild>\n | Matcher<t.JSXElement>\n | Matcher<t.JSXFragment>\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXFragment {\n if (\n !t.isNode(node) ||\n !t.isJSXFragment(node)\n ) {\n return false;\n }\n\n if (typeof this.openingFragment === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.openingFragment.matchValue(node.openingFragment, [\n ...keys,\n \"openingFragment\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.closingFragment === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.closingFragment.matchValue(node.closingFragment, [\n ...keys,\n \"closingFragment\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.children === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.children)) {\n if (\n !tupleOf<unknown>(...this.children).matchValue(node.children, [\n ...keys,\n \"children\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.children.matchValue(node.children, [...keys, \"children\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxFragment(\n openingFragment?: Matcher<t.JSXOpeningFragment>,\n closingFragment?: Matcher<t.JSXClosingFragment>,\n children?:\n | Matcher<\n Array<\n | t.JSXText\n | t.JSXExpressionContainer\n | t.JSXSpreadChild\n | t.JSXElement\n | t.JSXFragment\n >\n >\n | Array<\n | Matcher<t.JSXText>\n | Matcher<t.JSXExpressionContainer>\n | Matcher<t.JSXSpreadChild>\n | Matcher<t.JSXElement>\n | Matcher<t.JSXFragment>\n >,\n): Matcher<t.JSXFragment> {\n return new JSXFragmentMatcher(\n openingFragment,\n closingFragment,\n children,\n );\n}\nexport class JSXIdentifierMatcher extends Matcher<t.JSXIdentifier> {\n constructor(\n private readonly name?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXIdentifier {\n if (\n !t.isNode(node) ||\n !t.isJSXIdentifier(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.name === \"string\") {\n if (this.name !== node.name) {\n return false;\n }\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxIdentifier(\n name?: Matcher<string> | string,\n): Matcher<t.JSXIdentifier> {\n return new JSXIdentifierMatcher(\n name,\n );\n}\nexport class JSXMemberExpressionMatcher extends Matcher<t.JSXMemberExpression> {\n constructor(\n private readonly object?: Matcher<t.JSXMemberExpression | t.JSXIdentifier>,\n private readonly property?: Matcher<t.JSXIdentifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXMemberExpression {\n if (\n !t.isNode(node) ||\n !t.isJSXMemberExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.object === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.object.matchValue(node.object, [...keys, \"object\"])) {\n return false;\n }\n\n if (typeof this.property === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.property.matchValue(node.property, [...keys, \"property\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxMemberExpression(\n object?: Matcher<t.JSXMemberExpression | t.JSXIdentifier>,\n property?: Matcher<t.JSXIdentifier>,\n): Matcher<t.JSXMemberExpression> {\n return new JSXMemberExpressionMatcher(\n object,\n property,\n );\n}\nexport class JSXNamespacedNameMatcher extends Matcher<t.JSXNamespacedName> {\n constructor(\n private readonly namespace?: Matcher<t.JSXIdentifier>,\n private readonly name?: Matcher<t.JSXIdentifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXNamespacedName {\n if (\n !t.isNode(node) ||\n !t.isJSXNamespacedName(node)\n ) {\n return false;\n }\n\n if (typeof this.namespace === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.namespace.matchValue(node.namespace, [...keys, \"namespace\"])\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxNamespacedName(\n namespace?: Matcher<t.JSXIdentifier>,\n name?: Matcher<t.JSXIdentifier>,\n): Matcher<t.JSXNamespacedName> {\n return new JSXNamespacedNameMatcher(\n namespace,\n name,\n );\n}\nexport class JSXOpeningElementMatcher extends Matcher<t.JSXOpeningElement> {\n constructor(\n private readonly name?: Matcher<\n t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName\n >,\n private readonly attributes?:\n | Matcher<Array<t.JSXAttribute | t.JSXSpreadAttribute>>\n | Array<Matcher<t.JSXAttribute> | Matcher<t.JSXSpreadAttribute>>,\n private readonly selfClosing?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXOpeningElement {\n if (\n !t.isNode(node) ||\n !t.isJSXOpeningElement(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n if (typeof this.attributes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.attributes)) {\n if (\n !tupleOf<unknown>(...this.attributes).matchValue(node.attributes, [\n ...keys,\n \"attributes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.attributes.matchValue(node.attributes, [...keys, \"attributes\"])\n ) {\n return false;\n }\n\n if (typeof this.selfClosing === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.selfClosing === \"boolean\") {\n if (this.selfClosing !== node.selfClosing) {\n return false;\n }\n } else if (\n !this.selfClosing.matchValue(node.selfClosing, [...keys, \"selfClosing\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxOpeningElement(\n name?: Matcher<t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName>,\n attributes?:\n | Matcher<Array<t.JSXAttribute | t.JSXSpreadAttribute>>\n | Array<Matcher<t.JSXAttribute> | Matcher<t.JSXSpreadAttribute>>,\n selfClosing?: Matcher<boolean> | boolean,\n): Matcher<t.JSXOpeningElement> {\n return new JSXOpeningElementMatcher(\n name,\n attributes,\n selfClosing,\n );\n}\nexport class JSXOpeningFragmentMatcher extends Matcher<t.JSXOpeningFragment> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXOpeningFragment {\n if (\n !t.isNode(node) ||\n !t.isJSXOpeningFragment(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxOpeningFragment(): Matcher<t.JSXOpeningFragment> {\n return new JSXOpeningFragmentMatcher();\n}\nexport class JSXSpreadAttributeMatcher extends Matcher<t.JSXSpreadAttribute> {\n constructor(\n private readonly argument?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXSpreadAttribute {\n if (\n !t.isNode(node) ||\n !t.isJSXSpreadAttribute(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxSpreadAttribute(\n argument?: Matcher<t.Expression>,\n): Matcher<t.JSXSpreadAttribute> {\n return new JSXSpreadAttributeMatcher(\n argument,\n );\n}\nexport class JSXSpreadChildMatcher extends Matcher<t.JSXSpreadChild> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXSpreadChild {\n if (\n !t.isNode(node) ||\n !t.isJSXSpreadChild(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxSpreadChild(\n expression?: Matcher<t.Expression>,\n): Matcher<t.JSXSpreadChild> {\n return new JSXSpreadChildMatcher(\n expression,\n );\n}\nexport class JSXTextMatcher extends Matcher<t.JSXText> {\n constructor(\n private readonly value?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.JSXText {\n if (\n !t.isNode(node) ||\n !t.isJSXText(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"string\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function jsxText(\n value?: Matcher<string> | string,\n): Matcher<t.JSXText> {\n return new JSXTextMatcher(\n value,\n );\n}\nexport class LabeledStatementMatcher extends Matcher<t.LabeledStatement> {\n constructor(\n private readonly label?: Matcher<t.Identifier>,\n private readonly body?: Matcher<t.Statement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.LabeledStatement {\n if (\n !t.isNode(node) ||\n !t.isLabeledStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.label === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.label.matchValue(node.label, [...keys, \"label\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function labeledStatement(\n label?: Matcher<t.Identifier>,\n body?: Matcher<t.Statement>,\n): Matcher<t.LabeledStatement> {\n return new LabeledStatementMatcher(\n label,\n body,\n );\n}\nexport class LogicalExpressionMatcher extends Matcher<t.LogicalExpression> {\n constructor(\n private readonly operator?: Matcher<\"||\" | \"&&\" | \"??\"> | string,\n private readonly left?: Matcher<t.Expression>,\n private readonly right?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.LogicalExpression {\n if (\n !t.isNode(node) ||\n !t.isLogicalExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.operator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.operator === \"string\") {\n if (this.operator !== node.operator) {\n return false;\n }\n } else if (\n !this.operator.matchValue(node.operator, [...keys, \"operator\"])\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function logicalExpression(\n operator?: Matcher<\"||\" | \"&&\" | \"??\"> | string,\n left?: Matcher<t.Expression>,\n right?: Matcher<t.Expression>,\n): Matcher<t.LogicalExpression> {\n return new LogicalExpressionMatcher(\n operator,\n left,\n right,\n );\n}\nexport class MemberExpressionMatcher extends Matcher<t.MemberExpression> {\n constructor(\n private readonly object?: Matcher<t.Expression | t.Super>,\n private readonly property?: Matcher<\n t.Expression | t.Identifier | t.PrivateName\n >,\n private readonly computed?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.MemberExpression {\n if (\n !t.isNode(node) ||\n !t.isMemberExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.object === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.object.matchValue(node.object, [...keys, \"object\"])) {\n return false;\n }\n\n if (typeof this.property === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.property.matchValue(node.property, [...keys, \"property\"])\n ) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function memberExpression(\n object?: Matcher<t.Expression | t.Super>,\n property?: Matcher<t.Expression | t.Identifier | t.PrivateName>,\n computed?: Matcher<boolean> | boolean,\n): Matcher<t.MemberExpression> {\n return new MemberExpressionMatcher(\n object,\n property,\n computed,\n );\n}\nexport class MetaPropertyMatcher extends Matcher<t.MetaProperty> {\n constructor(\n private readonly meta?: Matcher<t.Identifier>,\n private readonly property?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.MetaProperty {\n if (\n !t.isNode(node) ||\n !t.isMetaProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.meta === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.meta.matchValue(node.meta, [...keys, \"meta\"])) {\n return false;\n }\n\n if (typeof this.property === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.property.matchValue(node.property, [...keys, \"property\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function metaProperty(\n meta?: Matcher<t.Identifier>,\n property?: Matcher<t.Identifier>,\n): Matcher<t.MetaProperty> {\n return new MetaPropertyMatcher(\n meta,\n property,\n );\n}\nexport class MixedTypeAnnotationMatcher extends Matcher<t.MixedTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.MixedTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isMixedTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function mixedTypeAnnotation(): Matcher<t.MixedTypeAnnotation> {\n return new MixedTypeAnnotationMatcher();\n}\nexport class ModuleExpressionMatcher extends Matcher<t.ModuleExpression> {\n constructor(\n private readonly body?: Matcher<t.Program>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ModuleExpression {\n if (\n !t.isNode(node) ||\n !t.isModuleExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function moduleExpression(\n body?: Matcher<t.Program>,\n): Matcher<t.ModuleExpression> {\n return new ModuleExpressionMatcher(\n body,\n );\n}\nexport class NewExpressionMatcher extends Matcher<t.NewExpression> {\n constructor(\n private readonly callee?: Matcher<t.Expression>,\n private readonly _arguments?:\n | Matcher<Array<t.Expression | t.SpreadElement | t.ArgumentPlaceholder>>\n | Array<\n | Matcher<t.Expression>\n | Matcher<t.SpreadElement>\n | Matcher<t.ArgumentPlaceholder>\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NewExpression {\n if (\n !t.isNode(node) ||\n !t.isNewExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.callee === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.callee.matchValue(node.callee, [...keys, \"callee\"])) {\n return false;\n }\n\n if (typeof this._arguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this._arguments)) {\n if (\n !tupleOf<unknown>(...this._arguments).matchValue(node.arguments, [\n ...keys,\n \"arguments\",\n ])\n ) {\n return false;\n }\n } else if (\n !this._arguments.matchValue(node.arguments, [...keys, \"arguments\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function newExpression(\n callee?: Matcher<t.Expression>,\n _arguments?:\n | Matcher<Array<t.Expression | t.SpreadElement | t.ArgumentPlaceholder>>\n | Array<\n | Matcher<t.Expression>\n | Matcher<t.SpreadElement>\n | Matcher<t.ArgumentPlaceholder>\n >,\n): Matcher<t.NewExpression> {\n return new NewExpressionMatcher(\n callee,\n _arguments,\n );\n}\nexport class NullLiteralMatcher extends Matcher<t.NullLiteral> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NullLiteral {\n if (\n !t.isNode(node) ||\n !t.isNullLiteral(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function nullLiteral(): Matcher<t.NullLiteral> {\n return new NullLiteralMatcher();\n}\nexport class NullLiteralTypeAnnotationMatcher\n extends Matcher<t.NullLiteralTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NullLiteralTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isNullLiteralTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function nullLiteralTypeAnnotation(): Matcher<\n t.NullLiteralTypeAnnotation\n> {\n return new NullLiteralTypeAnnotationMatcher();\n}\nexport class NullableTypeAnnotationMatcher\n extends Matcher<t.NullableTypeAnnotation> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NullableTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isNullableTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function nullableTypeAnnotation(\n typeAnnotation?: Matcher<t.FlowType>,\n): Matcher<t.NullableTypeAnnotation> {\n return new NullableTypeAnnotationMatcher(\n typeAnnotation,\n );\n}\nexport class NumberLiteralTypeAnnotationMatcher\n extends Matcher<t.NumberLiteralTypeAnnotation> {\n constructor(\n private readonly value?: Matcher<number> | number,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NumberLiteralTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isNumberLiteralTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"number\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function numberLiteralTypeAnnotation(\n value?: Matcher<number> | number,\n): Matcher<t.NumberLiteralTypeAnnotation> {\n return new NumberLiteralTypeAnnotationMatcher(\n value,\n );\n}\nexport class NumberTypeAnnotationMatcher\n extends Matcher<t.NumberTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NumberTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isNumberTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function numberTypeAnnotation(): Matcher<t.NumberTypeAnnotation> {\n return new NumberTypeAnnotationMatcher();\n}\nexport class NumericLiteralMatcher extends Matcher<t.NumericLiteral> {\n constructor(\n private readonly value?: Matcher<number> | number,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.NumericLiteral {\n if (\n !t.isNode(node) ||\n !t.isNumericLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"number\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function numericLiteral(\n value?: Matcher<number> | number,\n): Matcher<t.NumericLiteral> {\n return new NumericLiteralMatcher(\n value,\n );\n}\nexport class ObjectExpressionMatcher extends Matcher<t.ObjectExpression> {\n constructor(\n private readonly properties?:\n | Matcher<Array<t.ObjectMethod | t.ObjectProperty | t.SpreadElement>>\n | Array<\n | Matcher<t.ObjectMethod>\n | Matcher<t.ObjectProperty>\n | Matcher<t.SpreadElement>\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectExpression {\n if (\n !t.isNode(node) ||\n !t.isObjectExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.properties === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.properties)) {\n if (\n !tupleOf<unknown>(...this.properties).matchValue(node.properties, [\n ...keys,\n \"properties\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.properties.matchValue(node.properties, [...keys, \"properties\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectExpression(\n properties?:\n | Matcher<Array<t.ObjectMethod | t.ObjectProperty | t.SpreadElement>>\n | Array<\n | Matcher<t.ObjectMethod>\n | Matcher<t.ObjectProperty>\n | Matcher<t.SpreadElement>\n >,\n): Matcher<t.ObjectExpression> {\n return new ObjectExpressionMatcher(\n properties,\n );\n}\nexport class ObjectMethodMatcher extends Matcher<t.ObjectMethod> {\n constructor(\n private readonly kind?: Matcher<\"method\" | \"get\" | \"set\"> | string,\n private readonly key?: Matcher<\n | t.Expression\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n >,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n private readonly body?: Matcher<t.BlockStatement>,\n private readonly computed?: Matcher<boolean> | boolean,\n private readonly generator?: Matcher<boolean> | boolean,\n private readonly async?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectMethod {\n if (\n !t.isNode(node) ||\n !t.isObjectMethod(node)\n ) {\n return false;\n }\n\n if (typeof this.kind === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.kind === \"string\") {\n if (this.kind !== node.kind) {\n return false;\n }\n } else if (!this.kind.matchValue(node.kind, [...keys, \"kind\"])) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n if (typeof this.generator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.generator === \"boolean\") {\n if (this.generator !== node.generator) {\n return false;\n }\n } else if (\n !this.generator.matchValue(node.generator, [...keys, \"generator\"])\n ) {\n return false;\n }\n\n if (typeof this.async === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.async === \"boolean\") {\n if (this.async !== node.async) {\n return false;\n }\n } else if (!this.async.matchValue(node.async, [...keys, \"async\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectMethod(\n kind?: Matcher<\"method\" | \"get\" | \"set\"> | string,\n key?: Matcher<\n | t.Expression\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n >,\n params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n body?: Matcher<t.BlockStatement>,\n computed?: Matcher<boolean> | boolean,\n generator?: Matcher<boolean> | boolean,\n async?: Matcher<boolean> | boolean,\n): Matcher<t.ObjectMethod> {\n return new ObjectMethodMatcher(\n kind,\n key,\n params,\n body,\n computed,\n generator,\n async,\n );\n}\nexport class ObjectPatternMatcher extends Matcher<t.ObjectPattern> {\n constructor(\n private readonly properties?:\n | Matcher<Array<t.RestElement | t.ObjectProperty>>\n | Array<Matcher<t.RestElement> | Matcher<t.ObjectProperty>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectPattern {\n if (\n !t.isNode(node) ||\n !t.isObjectPattern(node)\n ) {\n return false;\n }\n\n if (typeof this.properties === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.properties)) {\n if (\n !tupleOf<unknown>(...this.properties).matchValue(node.properties, [\n ...keys,\n \"properties\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.properties.matchValue(node.properties, [...keys, \"properties\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectPattern(\n properties?:\n | Matcher<Array<t.RestElement | t.ObjectProperty>>\n | Array<Matcher<t.RestElement> | Matcher<t.ObjectProperty>>,\n): Matcher<t.ObjectPattern> {\n return new ObjectPatternMatcher(\n properties,\n );\n}\nexport class ObjectPropertyMatcher extends Matcher<t.ObjectProperty> {\n constructor(\n private readonly key?: Matcher<\n | t.Expression\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.PrivateName\n >,\n private readonly value?: Matcher<t.Expression | t.PatternLike>,\n private readonly computed?: Matcher<boolean> | boolean,\n private readonly shorthand?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectProperty {\n if (\n !t.isNode(node) ||\n !t.isObjectProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n if (typeof this.shorthand === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.shorthand === \"boolean\") {\n if (this.shorthand !== node.shorthand) {\n return false;\n }\n } else if (\n !this.shorthand.matchValue(node.shorthand, [...keys, \"shorthand\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectProperty(\n key?: Matcher<\n | t.Expression\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.PrivateName\n >,\n value?: Matcher<t.Expression | t.PatternLike>,\n computed?: Matcher<boolean> | boolean,\n shorthand?: Matcher<boolean> | boolean,\n): Matcher<t.ObjectProperty> {\n return new ObjectPropertyMatcher(\n key,\n value,\n computed,\n shorthand,\n );\n}\nexport class ObjectTypeAnnotationMatcher\n extends Matcher<t.ObjectTypeAnnotation> {\n constructor(\n private readonly properties?:\n | Matcher<Array<t.ObjectTypeProperty | t.ObjectTypeSpreadProperty>>\n | Array<\n Matcher<t.ObjectTypeProperty> | Matcher<t.ObjectTypeSpreadProperty>\n >,\n private readonly indexers?:\n | Matcher<Array<t.ObjectTypeIndexer>>\n | Array<Matcher<t.ObjectTypeIndexer>>,\n private readonly callProperties?:\n | Matcher<Array<t.ObjectTypeCallProperty>>\n | Array<Matcher<t.ObjectTypeCallProperty>>,\n private readonly internalSlots?:\n | Matcher<Array<t.ObjectTypeInternalSlot>>\n | Array<Matcher<t.ObjectTypeInternalSlot>>,\n private readonly exact?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isObjectTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.properties === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.properties)) {\n if (\n !tupleOf<unknown>(...this.properties).matchValue(node.properties, [\n ...keys,\n \"properties\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.properties.matchValue(node.properties, [...keys, \"properties\"])\n ) {\n return false;\n }\n\n if (typeof this.indexers === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.indexers)) {\n if (\n !tupleOf<unknown>(...this.indexers).matchValue(node.indexers, [\n ...keys,\n \"indexers\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.indexers.matchValue(node.indexers, [...keys, \"indexers\"])\n ) {\n return false;\n }\n\n if (typeof this.callProperties === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.callProperties)) {\n if (\n !tupleOf<unknown>(...this.callProperties).matchValue(\n node.callProperties,\n [...keys, \"callProperties\"],\n )\n ) {\n return false;\n }\n } else if (\n !this.callProperties.matchValue(node.callProperties, [\n ...keys,\n \"callProperties\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.internalSlots === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.internalSlots)) {\n if (\n !tupleOf<unknown>(...this.internalSlots).matchValue(\n node.internalSlots,\n [...keys, \"internalSlots\"],\n )\n ) {\n return false;\n }\n } else if (\n !this.internalSlots.matchValue(node.internalSlots, [\n ...keys,\n \"internalSlots\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.exact === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.exact === \"boolean\") {\n if (this.exact !== node.exact) {\n return false;\n }\n } else if (!this.exact.matchValue(node.exact, [...keys, \"exact\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectTypeAnnotation(\n properties?:\n | Matcher<Array<t.ObjectTypeProperty | t.ObjectTypeSpreadProperty>>\n | Array<\n Matcher<t.ObjectTypeProperty> | Matcher<t.ObjectTypeSpreadProperty>\n >,\n indexers?:\n | Matcher<Array<t.ObjectTypeIndexer>>\n | Array<Matcher<t.ObjectTypeIndexer>>,\n callProperties?:\n | Matcher<Array<t.ObjectTypeCallProperty>>\n | Array<Matcher<t.ObjectTypeCallProperty>>,\n internalSlots?:\n | Matcher<Array<t.ObjectTypeInternalSlot>>\n | Array<Matcher<t.ObjectTypeInternalSlot>>,\n exact?: Matcher<boolean> | boolean,\n): Matcher<t.ObjectTypeAnnotation> {\n return new ObjectTypeAnnotationMatcher(\n properties,\n indexers,\n callProperties,\n internalSlots,\n exact,\n );\n}\nexport class ObjectTypeCallPropertyMatcher\n extends Matcher<t.ObjectTypeCallProperty> {\n constructor(\n private readonly value?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectTypeCallProperty {\n if (\n !t.isNode(node) ||\n !t.isObjectTypeCallProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectTypeCallProperty(\n value?: Matcher<t.FlowType>,\n): Matcher<t.ObjectTypeCallProperty> {\n return new ObjectTypeCallPropertyMatcher(\n value,\n );\n}\nexport class ObjectTypeIndexerMatcher extends Matcher<t.ObjectTypeIndexer> {\n constructor(\n private readonly id?: Matcher<t.Identifier> | null,\n private readonly key?: Matcher<t.FlowType>,\n private readonly value?: Matcher<t.FlowType>,\n private readonly variance?: Matcher<t.Variance> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectTypeIndexer {\n if (\n !t.isNode(node) ||\n !t.isObjectTypeIndexer(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.id === null) {\n // null matcher means we expect null value\n if (node.id !== null) {\n return false;\n }\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.variance === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.variance === null) {\n // null matcher means we expect null value\n if (node.variance !== null) {\n return false;\n }\n } else if (\n !this.variance.matchValue(node.variance, [...keys, \"variance\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectTypeIndexer(\n id?: Matcher<t.Identifier> | null,\n key?: Matcher<t.FlowType>,\n value?: Matcher<t.FlowType>,\n variance?: Matcher<t.Variance> | null,\n): Matcher<t.ObjectTypeIndexer> {\n return new ObjectTypeIndexerMatcher(\n id,\n key,\n value,\n variance,\n );\n}\nexport class ObjectTypeInternalSlotMatcher\n extends Matcher<t.ObjectTypeInternalSlot> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly value?: Matcher<t.FlowType>,\n private readonly optional?: Matcher<boolean> | boolean,\n private readonly _static?: Matcher<boolean> | boolean,\n private readonly method?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectTypeInternalSlot {\n if (\n !t.isNode(node) ||\n !t.isObjectTypeInternalSlot(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.optional === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.optional === \"boolean\") {\n if (this.optional !== node.optional) {\n return false;\n }\n } else if (\n !this.optional.matchValue(node.optional, [...keys, \"optional\"])\n ) {\n return false;\n }\n\n if (typeof this._static === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this._static === \"boolean\") {\n if (this._static !== node.static) {\n return false;\n }\n } else if (!this._static.matchValue(node.static, [...keys, \"static\"])) {\n return false;\n }\n\n if (typeof this.method === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.method === \"boolean\") {\n if (this.method !== node.method) {\n return false;\n }\n } else if (!this.method.matchValue(node.method, [...keys, \"method\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectTypeInternalSlot(\n id?: Matcher<t.Identifier>,\n value?: Matcher<t.FlowType>,\n optional?: Matcher<boolean> | boolean,\n _static?: Matcher<boolean> | boolean,\n method?: Matcher<boolean> | boolean,\n): Matcher<t.ObjectTypeInternalSlot> {\n return new ObjectTypeInternalSlotMatcher(\n id,\n value,\n optional,\n _static,\n method,\n );\n}\nexport class ObjectTypePropertyMatcher extends Matcher<t.ObjectTypeProperty> {\n constructor(\n private readonly key?: Matcher<\n t.Identifier | t.StringLiteral | t.NumericLiteral\n >,\n private readonly value?: Matcher<t.FlowType>,\n private readonly variance?: Matcher<t.Variance> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectTypeProperty {\n if (\n !t.isNode(node) ||\n !t.isObjectTypeProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.variance === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.variance === null) {\n // null matcher means we expect null value\n if (node.variance !== null) {\n return false;\n }\n } else if (\n !this.variance.matchValue(node.variance, [...keys, \"variance\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectTypeProperty(\n key?: Matcher<t.Identifier | t.StringLiteral | t.NumericLiteral>,\n value?: Matcher<t.FlowType>,\n variance?: Matcher<t.Variance> | null,\n): Matcher<t.ObjectTypeProperty> {\n return new ObjectTypePropertyMatcher(\n key,\n value,\n variance,\n );\n}\nexport class ObjectTypeSpreadPropertyMatcher\n extends Matcher<t.ObjectTypeSpreadProperty> {\n constructor(\n private readonly argument?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ObjectTypeSpreadProperty {\n if (\n !t.isNode(node) ||\n !t.isObjectTypeSpreadProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function objectTypeSpreadProperty(\n argument?: Matcher<t.FlowType>,\n): Matcher<t.ObjectTypeSpreadProperty> {\n return new ObjectTypeSpreadPropertyMatcher(\n argument,\n );\n}\nexport class OpaqueTypeMatcher extends Matcher<t.OpaqueType> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly supertype?: Matcher<t.FlowType> | null,\n private readonly impltype?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.OpaqueType {\n if (\n !t.isNode(node) ||\n !t.isOpaqueType(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.supertype === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.supertype === null) {\n // null matcher means we expect null value\n if (node.supertype !== null) {\n return false;\n }\n } else if (\n !this.supertype.matchValue(node.supertype, [...keys, \"supertype\"])\n ) {\n return false;\n }\n\n if (typeof this.impltype === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.impltype.matchValue(node.impltype, [...keys, \"impltype\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function opaqueType(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n supertype?: Matcher<t.FlowType> | null,\n impltype?: Matcher<t.FlowType>,\n): Matcher<t.OpaqueType> {\n return new OpaqueTypeMatcher(\n id,\n typeParameters,\n supertype,\n impltype,\n );\n}\nexport class OptionalCallExpressionMatcher\n extends Matcher<t.OptionalCallExpression> {\n constructor(\n private readonly callee?: Matcher<t.Expression>,\n private readonly _arguments?:\n | Matcher<Array<t.Expression | t.SpreadElement | t.ArgumentPlaceholder>>\n | Array<\n | Matcher<t.Expression>\n | Matcher<t.SpreadElement>\n | Matcher<t.ArgumentPlaceholder>\n >,\n private readonly optional?: Matcher<any> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.OptionalCallExpression {\n if (\n !t.isNode(node) ||\n !t.isOptionalCallExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.callee === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.callee.matchValue(node.callee, [...keys, \"callee\"])) {\n return false;\n }\n\n if (typeof this._arguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this._arguments)) {\n if (\n !tupleOf<unknown>(...this._arguments).matchValue(node.arguments, [\n ...keys,\n \"arguments\",\n ])\n ) {\n return false;\n }\n } else if (\n !this._arguments.matchValue(node.arguments, [...keys, \"arguments\"])\n ) {\n return false;\n }\n\n if (typeof this.optional === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.optional === \"boolean\") {\n if (this.optional !== node.optional) {\n return false;\n }\n } else if (\n !this.optional.matchValue(node.optional, [...keys, \"optional\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function optionalCallExpression(\n callee?: Matcher<t.Expression>,\n _arguments?:\n | Matcher<Array<t.Expression | t.SpreadElement | t.ArgumentPlaceholder>>\n | Array<\n | Matcher<t.Expression>\n | Matcher<t.SpreadElement>\n | Matcher<t.ArgumentPlaceholder>\n >,\n optional?: Matcher<any> | boolean,\n): Matcher<t.OptionalCallExpression> {\n return new OptionalCallExpressionMatcher(\n callee,\n _arguments,\n optional,\n );\n}\nexport class OptionalIndexedAccessTypeMatcher\n extends Matcher<t.OptionalIndexedAccessType> {\n constructor(\n private readonly objectType?: Matcher<t.FlowType>,\n private readonly indexType?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.OptionalIndexedAccessType {\n if (\n !t.isNode(node) ||\n !t.isOptionalIndexedAccessType(node)\n ) {\n return false;\n }\n\n if (typeof this.objectType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.objectType.matchValue(node.objectType, [...keys, \"objectType\"])\n ) {\n return false;\n }\n\n if (typeof this.indexType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.indexType.matchValue(node.indexType, [...keys, \"indexType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function optionalIndexedAccessType(\n objectType?: Matcher<t.FlowType>,\n indexType?: Matcher<t.FlowType>,\n): Matcher<t.OptionalIndexedAccessType> {\n return new OptionalIndexedAccessTypeMatcher(\n objectType,\n indexType,\n );\n}\nexport class OptionalMemberExpressionMatcher\n extends Matcher<t.OptionalMemberExpression> {\n constructor(\n private readonly object?: Matcher<t.Expression>,\n private readonly property?: Matcher<t.Expression | t.PrivateName>,\n private readonly computed?: Matcher<boolean> | boolean,\n private readonly optional?: Matcher<any> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.OptionalMemberExpression {\n if (\n !t.isNode(node) ||\n !t.isOptionalMemberExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.object === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.object.matchValue(node.object, [...keys, \"object\"])) {\n return false;\n }\n\n if (typeof this.property === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.property.matchValue(node.property, [...keys, \"property\"])\n ) {\n return false;\n }\n\n if (typeof this.computed === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.computed === \"boolean\") {\n if (this.computed !== node.computed) {\n return false;\n }\n } else if (\n !this.computed.matchValue(node.computed, [...keys, \"computed\"])\n ) {\n return false;\n }\n\n if (typeof this.optional === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.optional === \"boolean\") {\n if (this.optional !== node.optional) {\n return false;\n }\n } else if (\n !this.optional.matchValue(node.optional, [...keys, \"optional\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function optionalMemberExpression(\n object?: Matcher<t.Expression>,\n property?: Matcher<t.Expression | t.PrivateName>,\n computed?: Matcher<boolean> | boolean,\n optional?: Matcher<any> | boolean,\n): Matcher<t.OptionalMemberExpression> {\n return new OptionalMemberExpressionMatcher(\n object,\n property,\n computed,\n optional,\n );\n}\nexport class ParenthesizedExpressionMatcher\n extends Matcher<t.ParenthesizedExpression> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ParenthesizedExpression {\n if (\n !t.isNode(node) ||\n !t.isParenthesizedExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function parenthesizedExpression(\n expression?: Matcher<t.Expression>,\n): Matcher<t.ParenthesizedExpression> {\n return new ParenthesizedExpressionMatcher(\n expression,\n );\n}\nexport class PlaceholderMatcher extends Matcher<t.Placeholder> {\n constructor(\n private readonly expectedNode?:\n | Matcher<\n | \"Identifier\"\n | \"StringLiteral\"\n | \"Expression\"\n | \"Statement\"\n | \"Declaration\"\n | \"BlockStatement\"\n | \"ClassBody\"\n | \"Pattern\"\n >\n | string,\n private readonly name?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Placeholder {\n if (\n !t.isNode(node) ||\n !t.isPlaceholder(node)\n ) {\n return false;\n }\n\n if (typeof this.expectedNode === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.expectedNode === \"string\") {\n if (this.expectedNode !== node.expectedNode) {\n return false;\n }\n } else if (\n !this.expectedNode.matchValue(node.expectedNode, [\n ...keys,\n \"expectedNode\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function placeholder(\n expectedNode?:\n | Matcher<\n | \"Identifier\"\n | \"StringLiteral\"\n | \"Expression\"\n | \"Statement\"\n | \"Declaration\"\n | \"BlockStatement\"\n | \"ClassBody\"\n | \"Pattern\"\n >\n | string,\n name?: Matcher<t.Identifier>,\n): Matcher<t.Placeholder> {\n return new PlaceholderMatcher(\n expectedNode,\n name,\n );\n}\nexport class PrivateNameMatcher extends Matcher<t.PrivateName> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.PrivateName {\n if (\n !t.isNode(node) ||\n !t.isPrivateName(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function privateName(\n id?: Matcher<t.Identifier>,\n): Matcher<t.PrivateName> {\n return new PrivateNameMatcher(\n id,\n );\n}\nexport class ProgramMatcher extends Matcher<t.Program> {\n constructor(\n private readonly body?:\n | Matcher<Array<t.Statement>>\n | Array<Matcher<t.Statement>>,\n private readonly directives?:\n | Matcher<Array<t.Directive>>\n | Array<Matcher<t.Directive>>,\n private readonly sourceType?: Matcher<\"script\" | \"module\"> | string,\n private readonly interpreter?: Matcher<t.InterpreterDirective> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Program {\n if (\n !t.isNode(node) ||\n !t.isProgram(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.body)) {\n if (\n !tupleOf<unknown>(...this.body).matchValue(node.body, [...keys, \"body\"])\n ) {\n return false;\n }\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n if (typeof this.directives === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.directives)) {\n if (\n !tupleOf<unknown>(...this.directives).matchValue(node.directives, [\n ...keys,\n \"directives\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.directives.matchValue(node.directives, [...keys, \"directives\"])\n ) {\n return false;\n }\n\n if (typeof this.sourceType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.sourceType === \"string\") {\n if (this.sourceType !== node.sourceType) {\n return false;\n }\n } else if (\n !this.sourceType.matchValue(node.sourceType, [...keys, \"sourceType\"])\n ) {\n return false;\n }\n\n if (typeof this.interpreter === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.interpreter === null) {\n // null matcher means we expect null value\n if (node.interpreter !== null) {\n return false;\n }\n } else if (\n !this.interpreter.matchValue(node.interpreter, [...keys, \"interpreter\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function program(\n body?: Matcher<Array<t.Statement>> | Array<Matcher<t.Statement>>,\n directives?: Matcher<Array<t.Directive>> | Array<Matcher<t.Directive>>,\n sourceType?: Matcher<\"script\" | \"module\"> | string,\n interpreter?: Matcher<t.InterpreterDirective> | null,\n): Matcher<t.Program> {\n return new ProgramMatcher(\n body,\n directives,\n sourceType,\n interpreter,\n );\n}\nexport class QualifiedTypeIdentifierMatcher\n extends Matcher<t.QualifiedTypeIdentifier> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly qualification?: Matcher<\n t.Identifier | t.QualifiedTypeIdentifier\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.QualifiedTypeIdentifier {\n if (\n !t.isNode(node) ||\n !t.isQualifiedTypeIdentifier(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.qualification === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.qualification.matchValue(node.qualification, [\n ...keys,\n \"qualification\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function qualifiedTypeIdentifier(\n id?: Matcher<t.Identifier>,\n qualification?: Matcher<t.Identifier | t.QualifiedTypeIdentifier>,\n): Matcher<t.QualifiedTypeIdentifier> {\n return new QualifiedTypeIdentifierMatcher(\n id,\n qualification,\n );\n}\nexport class RegExpLiteralMatcher extends Matcher<t.RegExpLiteral> {\n constructor(\n private readonly pattern?: Matcher<string> | string,\n private readonly flags?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.RegExpLiteral {\n if (\n !t.isNode(node) ||\n !t.isRegExpLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.pattern === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.pattern === \"string\") {\n if (this.pattern !== node.pattern) {\n return false;\n }\n } else if (!this.pattern.matchValue(node.pattern, [...keys, \"pattern\"])) {\n return false;\n }\n\n if (typeof this.flags === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.flags === \"string\") {\n if (this.flags !== node.flags) {\n return false;\n }\n } else if (!this.flags.matchValue(node.flags, [...keys, \"flags\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function regExpLiteral(\n pattern?: Matcher<string> | string,\n flags?: Matcher<string> | string,\n): Matcher<t.RegExpLiteral> {\n return new RegExpLiteralMatcher(\n pattern,\n flags,\n );\n}\nexport class RestElementMatcher extends Matcher<t.RestElement> {\n constructor(\n private readonly argument?: Matcher<\n | t.Identifier\n | t.ArrayPattern\n | t.ObjectPattern\n | t.MemberExpression\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.RestElement {\n if (\n !t.isNode(node) ||\n !t.isRestElement(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function restElement(\n argument?: Matcher<\n | t.Identifier\n | t.ArrayPattern\n | t.ObjectPattern\n | t.MemberExpression\n | t.TSAsExpression\n | t.TSSatisfiesExpression\n | t.TSTypeAssertion\n | t.TSNonNullExpression\n >,\n): Matcher<t.RestElement> {\n return new RestElementMatcher(\n argument,\n );\n}\nexport class ReturnStatementMatcher extends Matcher<t.ReturnStatement> {\n constructor(\n private readonly argument?: Matcher<t.Expression> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ReturnStatement {\n if (\n !t.isNode(node) ||\n !t.isReturnStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.argument === null) {\n // null matcher means we expect null value\n if (node.argument !== null) {\n return false;\n }\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function returnStatement(\n argument?: Matcher<t.Expression> | null,\n): Matcher<t.ReturnStatement> {\n return new ReturnStatementMatcher(\n argument,\n );\n}\nexport class SequenceExpressionMatcher extends Matcher<t.SequenceExpression> {\n constructor(\n private readonly expressions?:\n | Matcher<Array<t.Expression>>\n | Array<Matcher<t.Expression>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.SequenceExpression {\n if (\n !t.isNode(node) ||\n !t.isSequenceExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expressions === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.expressions)) {\n if (\n !tupleOf<unknown>(...this.expressions).matchValue(node.expressions, [\n ...keys,\n \"expressions\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.expressions.matchValue(node.expressions, [...keys, \"expressions\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function sequenceExpression(\n expressions?: Matcher<Array<t.Expression>> | Array<Matcher<t.Expression>>,\n): Matcher<t.SequenceExpression> {\n return new SequenceExpressionMatcher(\n expressions,\n );\n}\nexport class SpreadElementMatcher extends Matcher<t.SpreadElement> {\n constructor(\n private readonly argument?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.SpreadElement {\n if (\n !t.isNode(node) ||\n !t.isSpreadElement(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function spreadElement(\n argument?: Matcher<t.Expression>,\n): Matcher<t.SpreadElement> {\n return new SpreadElementMatcher(\n argument,\n );\n}\nexport class StaticBlockMatcher extends Matcher<t.StaticBlock> {\n constructor(\n private readonly body?:\n | Matcher<Array<t.Statement>>\n | Array<Matcher<t.Statement>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.StaticBlock {\n if (\n !t.isNode(node) ||\n !t.isStaticBlock(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.body)) {\n if (\n !tupleOf<unknown>(...this.body).matchValue(node.body, [...keys, \"body\"])\n ) {\n return false;\n }\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function staticBlock(\n body?: Matcher<Array<t.Statement>> | Array<Matcher<t.Statement>>,\n): Matcher<t.StaticBlock> {\n return new StaticBlockMatcher(\n body,\n );\n}\nexport class StringLiteralMatcher extends Matcher<t.StringLiteral> {\n constructor(\n private readonly value?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.StringLiteral {\n if (\n !t.isNode(node) ||\n !t.isStringLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"string\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function stringLiteral(\n value?: Matcher<string> | string,\n): Matcher<t.StringLiteral> {\n return new StringLiteralMatcher(\n value,\n );\n}\nexport class StringLiteralTypeAnnotationMatcher\n extends Matcher<t.StringLiteralTypeAnnotation> {\n constructor(\n private readonly value?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.StringLiteralTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isStringLiteralTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.value === \"string\") {\n if (this.value !== node.value) {\n return false;\n }\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function stringLiteralTypeAnnotation(\n value?: Matcher<string> | string,\n): Matcher<t.StringLiteralTypeAnnotation> {\n return new StringLiteralTypeAnnotationMatcher(\n value,\n );\n}\nexport class StringTypeAnnotationMatcher\n extends Matcher<t.StringTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.StringTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isStringTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function stringTypeAnnotation(): Matcher<t.StringTypeAnnotation> {\n return new StringTypeAnnotationMatcher();\n}\nexport class SuperMatcher extends Matcher<t.Super> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Super {\n if (\n !t.isNode(node) ||\n !t.isSuper(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function Super(): Matcher<t.Super> {\n return new SuperMatcher();\n}\nexport class SwitchCaseMatcher extends Matcher<t.SwitchCase> {\n constructor(\n private readonly test?: Matcher<t.Expression> | null,\n private readonly consequent?:\n | Matcher<Array<t.Statement>>\n | Array<Matcher<t.Statement>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.SwitchCase {\n if (\n !t.isNode(node) ||\n !t.isSwitchCase(node)\n ) {\n return false;\n }\n\n if (typeof this.test === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.test === null) {\n // null matcher means we expect null value\n if (node.test !== null) {\n return false;\n }\n } else if (!this.test.matchValue(node.test, [...keys, \"test\"])) {\n return false;\n }\n\n if (typeof this.consequent === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.consequent)) {\n if (\n !tupleOf<unknown>(...this.consequent).matchValue(node.consequent, [\n ...keys,\n \"consequent\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.consequent.matchValue(node.consequent, [...keys, \"consequent\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function switchCase(\n test?: Matcher<t.Expression> | null,\n consequent?: Matcher<Array<t.Statement>> | Array<Matcher<t.Statement>>,\n): Matcher<t.SwitchCase> {\n return new SwitchCaseMatcher(\n test,\n consequent,\n );\n}\nexport class SwitchStatementMatcher extends Matcher<t.SwitchStatement> {\n constructor(\n private readonly discriminant?: Matcher<t.Expression>,\n private readonly cases?:\n | Matcher<Array<t.SwitchCase>>\n | Array<Matcher<t.SwitchCase>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.SwitchStatement {\n if (\n !t.isNode(node) ||\n !t.isSwitchStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.discriminant === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.discriminant.matchValue(node.discriminant, [\n ...keys,\n \"discriminant\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.cases === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.cases)) {\n if (\n !tupleOf<unknown>(...this.cases).matchValue(node.cases, [\n ...keys,\n \"cases\",\n ])\n ) {\n return false;\n }\n } else if (!this.cases.matchValue(node.cases, [...keys, \"cases\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function switchStatement(\n discriminant?: Matcher<t.Expression>,\n cases?: Matcher<Array<t.SwitchCase>> | Array<Matcher<t.SwitchCase>>,\n): Matcher<t.SwitchStatement> {\n return new SwitchStatementMatcher(\n discriminant,\n cases,\n );\n}\nexport class SymbolTypeAnnotationMatcher\n extends Matcher<t.SymbolTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.SymbolTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isSymbolTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function symbolTypeAnnotation(): Matcher<t.SymbolTypeAnnotation> {\n return new SymbolTypeAnnotationMatcher();\n}\nexport class TSAnyKeywordMatcher extends Matcher<t.TSAnyKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSAnyKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSAnyKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsAnyKeyword(): Matcher<t.TSAnyKeyword> {\n return new TSAnyKeywordMatcher();\n}\nexport class TSArrayTypeMatcher extends Matcher<t.TSArrayType> {\n constructor(\n private readonly elementType?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSArrayType {\n if (\n !t.isNode(node) ||\n !t.isTSArrayType(node)\n ) {\n return false;\n }\n\n if (typeof this.elementType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.elementType.matchValue(node.elementType, [...keys, \"elementType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsArrayType(\n elementType?: Matcher<t.TSType>,\n): Matcher<t.TSArrayType> {\n return new TSArrayTypeMatcher(\n elementType,\n );\n}\nexport class TSAsExpressionMatcher extends Matcher<t.TSAsExpression> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSAsExpression {\n if (\n !t.isNode(node) ||\n !t.isTSAsExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsAsExpression(\n expression?: Matcher<t.Expression>,\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSAsExpression> {\n return new TSAsExpressionMatcher(\n expression,\n typeAnnotation,\n );\n}\nexport class TSBigIntKeywordMatcher extends Matcher<t.TSBigIntKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSBigIntKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSBigIntKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsBigIntKeyword(): Matcher<t.TSBigIntKeyword> {\n return new TSBigIntKeywordMatcher();\n}\nexport class TSBooleanKeywordMatcher extends Matcher<t.TSBooleanKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSBooleanKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSBooleanKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsBooleanKeyword(): Matcher<t.TSBooleanKeyword> {\n return new TSBooleanKeywordMatcher();\n}\nexport class TSCallSignatureDeclarationMatcher\n extends Matcher<t.TSCallSignatureDeclaration> {\n constructor(\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSCallSignatureDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSCallSignatureDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsCallSignatureDeclaration(\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSCallSignatureDeclaration> {\n return new TSCallSignatureDeclarationMatcher(\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSClassImplementsMatcher extends Matcher<t.TSClassImplements> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n private readonly typeArguments?:\n | Matcher<t.TSTypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSClassImplements {\n if (\n !t.isNode(node) ||\n !t.isTSClassImplements(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n if (typeof this.typeArguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeArguments === null) {\n // null matcher means we expect null value\n if (node.typeArguments !== null) {\n return false;\n }\n } else if (\n !this.typeArguments.matchValue(node.typeArguments, [\n ...keys,\n \"typeArguments\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsClassImplements(\n expression?: Matcher<t.Expression>,\n typeArguments?: Matcher<t.TSTypeParameterInstantiation> | null,\n): Matcher<t.TSClassImplements> {\n return new TSClassImplementsMatcher(\n expression,\n typeArguments,\n );\n}\nexport class TSConditionalTypeMatcher extends Matcher<t.TSConditionalType> {\n constructor(\n private readonly checkType?: Matcher<t.TSType>,\n private readonly extendsType?: Matcher<t.TSType>,\n private readonly trueType?: Matcher<t.TSType>,\n private readonly falseType?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSConditionalType {\n if (\n !t.isNode(node) ||\n !t.isTSConditionalType(node)\n ) {\n return false;\n }\n\n if (typeof this.checkType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.checkType.matchValue(node.checkType, [...keys, \"checkType\"])\n ) {\n return false;\n }\n\n if (typeof this.extendsType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.extendsType.matchValue(node.extendsType, [...keys, \"extendsType\"])\n ) {\n return false;\n }\n\n if (typeof this.trueType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.trueType.matchValue(node.trueType, [...keys, \"trueType\"])\n ) {\n return false;\n }\n\n if (typeof this.falseType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.falseType.matchValue(node.falseType, [...keys, \"falseType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsConditionalType(\n checkType?: Matcher<t.TSType>,\n extendsType?: Matcher<t.TSType>,\n trueType?: Matcher<t.TSType>,\n falseType?: Matcher<t.TSType>,\n): Matcher<t.TSConditionalType> {\n return new TSConditionalTypeMatcher(\n checkType,\n extendsType,\n trueType,\n falseType,\n );\n}\nexport class TSConstructSignatureDeclarationMatcher\n extends Matcher<t.TSConstructSignatureDeclaration> {\n constructor(\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSConstructSignatureDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSConstructSignatureDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsConstructSignatureDeclaration(\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSConstructSignatureDeclaration> {\n return new TSConstructSignatureDeclarationMatcher(\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSConstructorTypeMatcher extends Matcher<t.TSConstructorType> {\n constructor(\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSConstructorType {\n if (\n !t.isNode(node) ||\n !t.isTSConstructorType(node)\n ) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsConstructorType(\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSConstructorType> {\n return new TSConstructorTypeMatcher(\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSDeclareFunctionMatcher extends Matcher<t.TSDeclareFunction> {\n constructor(\n private readonly id?: Matcher<t.Identifier> | null,\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSDeclareFunction {\n if (\n !t.isNode(node) ||\n !t.isTSDeclareFunction(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.id === null) {\n // null matcher means we expect null value\n if (node.id !== null) {\n return false;\n }\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsDeclareFunction(\n id?: Matcher<t.Identifier> | null,\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<Array<t.FunctionParameter>>\n | Array<Matcher<t.FunctionParameter>>,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSDeclareFunction> {\n return new TSDeclareFunctionMatcher(\n id,\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSDeclareMethodMatcher extends Matcher<t.TSDeclareMethod> {\n constructor(\n private readonly key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n >,\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<Array<t.FunctionParameter | t.TSParameterProperty>>\n | Array<Matcher<t.FunctionParameter> | Matcher<t.TSParameterProperty>>,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSDeclareMethod {\n if (\n !t.isNode(node) ||\n !t.isTSDeclareMethod(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsDeclareMethod(\n key?: Matcher<\n | t.Identifier\n | t.StringLiteral\n | t.NumericLiteral\n | t.BigIntLiteral\n | t.Expression\n >,\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<Array<t.FunctionParameter | t.TSParameterProperty>>\n | Array<Matcher<t.FunctionParameter> | Matcher<t.TSParameterProperty>>,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSDeclareMethod> {\n return new TSDeclareMethodMatcher(\n key,\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSEnumBodyMatcher extends Matcher<t.TSEnumBody> {\n constructor(\n private readonly members?:\n | Matcher<Array<t.TSEnumMember>>\n | Array<Matcher<t.TSEnumMember>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSEnumBody {\n if (\n !t.isNode(node) ||\n !t.isTSEnumBody(node)\n ) {\n return false;\n }\n\n if (typeof this.members === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.members)) {\n if (\n !tupleOf<unknown>(...this.members).matchValue(node.members, [\n ...keys,\n \"members\",\n ])\n ) {\n return false;\n }\n } else if (!this.members.matchValue(node.members, [...keys, \"members\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsEnumBody(\n members?: Matcher<Array<t.TSEnumMember>> | Array<Matcher<t.TSEnumMember>>,\n): Matcher<t.TSEnumBody> {\n return new TSEnumBodyMatcher(\n members,\n );\n}\nexport class TSEnumDeclarationMatcher extends Matcher<t.TSEnumDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly body?: Matcher<t.TSEnumBody>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSEnumDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSEnumDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsEnumDeclaration(\n id?: Matcher<t.Identifier>,\n body?: Matcher<t.TSEnumBody>,\n): Matcher<t.TSEnumDeclaration> {\n return new TSEnumDeclarationMatcher(\n id,\n body,\n );\n}\nexport class TSEnumMemberMatcher extends Matcher<t.TSEnumMember> {\n constructor(\n private readonly id?: Matcher<t.Identifier | t.StringLiteral>,\n private readonly initializer?: Matcher<t.Expression> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSEnumMember {\n if (\n !t.isNode(node) ||\n !t.isTSEnumMember(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.initializer === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.initializer === null) {\n // null matcher means we expect null value\n if (node.initializer !== null) {\n return false;\n }\n } else if (\n !this.initializer.matchValue(node.initializer, [...keys, \"initializer\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsEnumMember(\n id?: Matcher<t.Identifier | t.StringLiteral>,\n initializer?: Matcher<t.Expression> | null,\n): Matcher<t.TSEnumMember> {\n return new TSEnumMemberMatcher(\n id,\n initializer,\n );\n}\nexport class TSExportAssignmentMatcher extends Matcher<t.TSExportAssignment> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSExportAssignment {\n if (\n !t.isNode(node) ||\n !t.isTSExportAssignment(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsExportAssignment(\n expression?: Matcher<t.Expression>,\n): Matcher<t.TSExportAssignment> {\n return new TSExportAssignmentMatcher(\n expression,\n );\n}\nexport class TSExternalModuleReferenceMatcher\n extends Matcher<t.TSExternalModuleReference> {\n constructor(\n private readonly expression?: Matcher<t.StringLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSExternalModuleReference {\n if (\n !t.isNode(node) ||\n !t.isTSExternalModuleReference(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsExternalModuleReference(\n expression?: Matcher<t.StringLiteral>,\n): Matcher<t.TSExternalModuleReference> {\n return new TSExternalModuleReferenceMatcher(\n expression,\n );\n}\nexport class TSFunctionTypeMatcher extends Matcher<t.TSFunctionType> {\n constructor(\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSFunctionType {\n if (\n !t.isNode(node) ||\n !t.isTSFunctionType(node)\n ) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsFunctionType(\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSFunctionType> {\n return new TSFunctionTypeMatcher(\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSImportEqualsDeclarationMatcher\n extends Matcher<t.TSImportEqualsDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly moduleReference?: Matcher<\n t.TSEntityName | t.TSExternalModuleReference\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSImportEqualsDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSImportEqualsDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.moduleReference === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.moduleReference.matchValue(node.moduleReference, [\n ...keys,\n \"moduleReference\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsImportEqualsDeclaration(\n id?: Matcher<t.Identifier>,\n moduleReference?: Matcher<t.TSEntityName | t.TSExternalModuleReference>,\n): Matcher<t.TSImportEqualsDeclaration> {\n return new TSImportEqualsDeclarationMatcher(\n id,\n moduleReference,\n );\n}\nexport class TSImportTypeMatcher extends Matcher<t.TSImportType> {\n constructor(\n private readonly source?: Matcher<t.StringLiteral>,\n private readonly qualifier?: Matcher<t.TSEntityName> | null,\n private readonly typeArguments?:\n | Matcher<t.TSTypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSImportType {\n if (\n !t.isNode(node) ||\n !t.isTSImportType(node)\n ) {\n return false;\n }\n\n if (typeof this.source === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.source.matchValue(node.source, [...keys, \"source\"])) {\n return false;\n }\n\n if (typeof this.qualifier === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.qualifier === null) {\n // null matcher means we expect null value\n if (node.qualifier !== null) {\n return false;\n }\n } else if (\n !this.qualifier.matchValue(node.qualifier, [...keys, \"qualifier\"])\n ) {\n return false;\n }\n\n if (typeof this.typeArguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeArguments === null) {\n // null matcher means we expect null value\n if (node.typeArguments !== null) {\n return false;\n }\n } else if (\n !this.typeArguments.matchValue(node.typeArguments, [\n ...keys,\n \"typeArguments\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsImportType(\n source?: Matcher<t.StringLiteral>,\n qualifier?: Matcher<t.TSEntityName> | null,\n typeArguments?: Matcher<t.TSTypeParameterInstantiation> | null,\n): Matcher<t.TSImportType> {\n return new TSImportTypeMatcher(\n source,\n qualifier,\n typeArguments,\n );\n}\nexport class TSIndexSignatureMatcher extends Matcher<t.TSIndexSignature> {\n constructor(\n private readonly parameters?:\n | Matcher<Array<t.Identifier>>\n | Array<Matcher<t.Identifier>>,\n private readonly typeAnnotation?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSIndexSignature {\n if (\n !t.isNode(node) ||\n !t.isTSIndexSignature(node)\n ) {\n return false;\n }\n\n if (typeof this.parameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.parameters)) {\n if (\n !tupleOf<unknown>(...this.parameters).matchValue(node.parameters, [\n ...keys,\n \"parameters\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.parameters.matchValue(node.parameters, [...keys, \"parameters\"])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeAnnotation === null) {\n // null matcher means we expect null value\n if (node.typeAnnotation !== null) {\n return false;\n }\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsIndexSignature(\n parameters?: Matcher<Array<t.Identifier>> | Array<Matcher<t.Identifier>>,\n typeAnnotation?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSIndexSignature> {\n return new TSIndexSignatureMatcher(\n parameters,\n typeAnnotation,\n );\n}\nexport class TSIndexedAccessTypeMatcher extends Matcher<t.TSIndexedAccessType> {\n constructor(\n private readonly objectType?: Matcher<t.TSType>,\n private readonly indexType?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSIndexedAccessType {\n if (\n !t.isNode(node) ||\n !t.isTSIndexedAccessType(node)\n ) {\n return false;\n }\n\n if (typeof this.objectType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.objectType.matchValue(node.objectType, [...keys, \"objectType\"])\n ) {\n return false;\n }\n\n if (typeof this.indexType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.indexType.matchValue(node.indexType, [...keys, \"indexType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsIndexedAccessType(\n objectType?: Matcher<t.TSType>,\n indexType?: Matcher<t.TSType>,\n): Matcher<t.TSIndexedAccessType> {\n return new TSIndexedAccessTypeMatcher(\n objectType,\n indexType,\n );\n}\nexport class TSInferTypeMatcher extends Matcher<t.TSInferType> {\n constructor(\n private readonly typeParameter?: Matcher<t.TSTypeParameter>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSInferType {\n if (\n !t.isNode(node) ||\n !t.isTSInferType(node)\n ) {\n return false;\n }\n\n if (typeof this.typeParameter === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeParameter.matchValue(node.typeParameter, [\n ...keys,\n \"typeParameter\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsInferType(\n typeParameter?: Matcher<t.TSTypeParameter>,\n): Matcher<t.TSInferType> {\n return new TSInferTypeMatcher(\n typeParameter,\n );\n}\nexport class TSInstantiationExpressionMatcher\n extends Matcher<t.TSInstantiationExpression> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n private readonly typeArguments?:\n | Matcher<t.TSTypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSInstantiationExpression {\n if (\n !t.isNode(node) ||\n !t.isTSInstantiationExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n if (typeof this.typeArguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeArguments === null) {\n // null matcher means we expect null value\n if (node.typeArguments !== null) {\n return false;\n }\n } else if (\n !this.typeArguments.matchValue(node.typeArguments, [\n ...keys,\n \"typeArguments\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsInstantiationExpression(\n expression?: Matcher<t.Expression>,\n typeArguments?: Matcher<t.TSTypeParameterInstantiation> | null,\n): Matcher<t.TSInstantiationExpression> {\n return new TSInstantiationExpressionMatcher(\n expression,\n typeArguments,\n );\n}\nexport class TSInterfaceBodyMatcher extends Matcher<t.TSInterfaceBody> {\n constructor(\n private readonly body?:\n | Matcher<Array<t.TSTypeElement>>\n | Array<Matcher<t.TSTypeElement>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSInterfaceBody {\n if (\n !t.isNode(node) ||\n !t.isTSInterfaceBody(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.body)) {\n if (\n !tupleOf<unknown>(...this.body).matchValue(node.body, [...keys, \"body\"])\n ) {\n return false;\n }\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsInterfaceBody(\n body?: Matcher<Array<t.TSTypeElement>> | Array<Matcher<t.TSTypeElement>>,\n): Matcher<t.TSInterfaceBody> {\n return new TSInterfaceBodyMatcher(\n body,\n );\n}\nexport class TSInterfaceDeclarationMatcher\n extends Matcher<t.TSInterfaceDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly _extends?:\n | Matcher<Array<t.TSInterfaceHeritage>>\n | Array<Matcher<t.TSInterfaceHeritage>>\n | null,\n private readonly body?: Matcher<t.TSInterfaceBody>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSInterfaceDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSInterfaceDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this._extends === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._extends === null) {\n // null matcher means we expect null value\n if (node.extends !== null) {\n return false;\n }\n } else if (Array.isArray(this._extends)) {\n if (\n !tupleOf<unknown>(...this._extends).matchValue(node.extends, [\n ...keys,\n \"extends\",\n ])\n ) {\n return false;\n }\n } else if (!this._extends.matchValue(node.extends, [...keys, \"extends\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsInterfaceDeclaration(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n _extends?:\n | Matcher<Array<t.TSInterfaceHeritage>>\n | Array<Matcher<t.TSInterfaceHeritage>>\n | null,\n body?: Matcher<t.TSInterfaceBody>,\n): Matcher<t.TSInterfaceDeclaration> {\n return new TSInterfaceDeclarationMatcher(\n id,\n typeParameters,\n _extends,\n body,\n );\n}\nexport class TSInterfaceHeritageMatcher extends Matcher<t.TSInterfaceHeritage> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n private readonly typeArguments?:\n | Matcher<t.TSTypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSInterfaceHeritage {\n if (\n !t.isNode(node) ||\n !t.isTSInterfaceHeritage(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n if (typeof this.typeArguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeArguments === null) {\n // null matcher means we expect null value\n if (node.typeArguments !== null) {\n return false;\n }\n } else if (\n !this.typeArguments.matchValue(node.typeArguments, [\n ...keys,\n \"typeArguments\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsInterfaceHeritage(\n expression?: Matcher<t.Expression>,\n typeArguments?: Matcher<t.TSTypeParameterInstantiation> | null,\n): Matcher<t.TSInterfaceHeritage> {\n return new TSInterfaceHeritageMatcher(\n expression,\n typeArguments,\n );\n}\nexport class TSIntersectionTypeMatcher extends Matcher<t.TSIntersectionType> {\n constructor(\n private readonly types?:\n | Matcher<Array<t.TSType>>\n | Array<Matcher<t.TSType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSIntersectionType {\n if (\n !t.isNode(node) ||\n !t.isTSIntersectionType(node)\n ) {\n return false;\n }\n\n if (typeof this.types === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.types)) {\n if (\n !tupleOf<unknown>(...this.types).matchValue(node.types, [\n ...keys,\n \"types\",\n ])\n ) {\n return false;\n }\n } else if (!this.types.matchValue(node.types, [...keys, \"types\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsIntersectionType(\n types?: Matcher<Array<t.TSType>> | Array<Matcher<t.TSType>>,\n): Matcher<t.TSIntersectionType> {\n return new TSIntersectionTypeMatcher(\n types,\n );\n}\nexport class TSIntrinsicKeywordMatcher extends Matcher<t.TSIntrinsicKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSIntrinsicKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSIntrinsicKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsIntrinsicKeyword(): Matcher<t.TSIntrinsicKeyword> {\n return new TSIntrinsicKeywordMatcher();\n}\nexport class TSLiteralTypeMatcher extends Matcher<t.TSLiteralType> {\n constructor(\n private readonly literal?: Matcher<\n | t.NumericLiteral\n | t.StringLiteral\n | t.BooleanLiteral\n | t.BigIntLiteral\n | t.TemplateLiteral\n | t.UnaryExpression\n >,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSLiteralType {\n if (\n !t.isNode(node) ||\n !t.isTSLiteralType(node)\n ) {\n return false;\n }\n\n if (typeof this.literal === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.literal.matchValue(node.literal, [...keys, \"literal\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsLiteralType(\n literal?: Matcher<\n | t.NumericLiteral\n | t.StringLiteral\n | t.BooleanLiteral\n | t.BigIntLiteral\n | t.TemplateLiteral\n | t.UnaryExpression\n >,\n): Matcher<t.TSLiteralType> {\n return new TSLiteralTypeMatcher(\n literal,\n );\n}\nexport class TSMappedTypeMatcher extends Matcher<t.TSMappedType> {\n constructor(\n private readonly key?: Matcher<t.Identifier>,\n private readonly constraint?: Matcher<t.TSType>,\n private readonly nameType?: Matcher<t.TSType> | null,\n private readonly typeAnnotation?: Matcher<t.TSType> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSMappedType {\n if (\n !t.isNode(node) ||\n !t.isTSMappedType(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.constraint === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.constraint.matchValue(node.constraint, [...keys, \"constraint\"])\n ) {\n return false;\n }\n\n if (typeof this.nameType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.nameType === null) {\n // null matcher means we expect null value\n if (node.nameType !== null) {\n return false;\n }\n } else if (\n !this.nameType.matchValue(node.nameType, [...keys, \"nameType\"])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeAnnotation === null) {\n // null matcher means we expect null value\n if (node.typeAnnotation !== null) {\n return false;\n }\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsMappedType(\n key?: Matcher<t.Identifier>,\n constraint?: Matcher<t.TSType>,\n nameType?: Matcher<t.TSType> | null,\n typeAnnotation?: Matcher<t.TSType> | null,\n): Matcher<t.TSMappedType> {\n return new TSMappedTypeMatcher(\n key,\n constraint,\n nameType,\n typeAnnotation,\n );\n}\nexport class TSMethodSignatureMatcher extends Matcher<t.TSMethodSignature> {\n constructor(\n private readonly key?: Matcher<t.Expression>,\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n private readonly returnType?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSMethodSignature {\n if (\n !t.isNode(node) ||\n !t.isTSMethodSignature(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n if (typeof this.returnType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.returnType === null) {\n // null matcher means we expect null value\n if (node.returnType !== null) {\n return false;\n }\n } else if (\n !this.returnType.matchValue(node.returnType, [...keys, \"returnType\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsMethodSignature(\n key?: Matcher<t.Expression>,\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n params?:\n | Matcher<\n Array<t.ArrayPattern | t.Identifier | t.ObjectPattern | t.RestElement>\n >\n | Array<\n | Matcher<t.ArrayPattern>\n | Matcher<t.Identifier>\n | Matcher<t.ObjectPattern>\n | Matcher<t.RestElement>\n >,\n returnType?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSMethodSignature> {\n return new TSMethodSignatureMatcher(\n key,\n typeParameters,\n params,\n returnType,\n );\n}\nexport class TSModuleBlockMatcher extends Matcher<t.TSModuleBlock> {\n constructor(\n private readonly body?:\n | Matcher<Array<t.Statement>>\n | Array<Matcher<t.Statement>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSModuleBlock {\n if (\n !t.isNode(node) ||\n !t.isTSModuleBlock(node)\n ) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.body)) {\n if (\n !tupleOf<unknown>(...this.body).matchValue(node.body, [...keys, \"body\"])\n ) {\n return false;\n }\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsModuleBlock(\n body?: Matcher<Array<t.Statement>> | Array<Matcher<t.Statement>>,\n): Matcher<t.TSModuleBlock> {\n return new TSModuleBlockMatcher(\n body,\n );\n}\nexport class TSModuleDeclarationMatcher extends Matcher<t.TSModuleDeclaration> {\n constructor(\n private readonly id?: Matcher<t.TSEntityName | t.StringLiteral>,\n private readonly body?: Matcher<t.TSModuleBlock>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSModuleDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSModuleDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsModuleDeclaration(\n id?: Matcher<t.TSEntityName | t.StringLiteral>,\n body?: Matcher<t.TSModuleBlock>,\n): Matcher<t.TSModuleDeclaration> {\n return new TSModuleDeclarationMatcher(\n id,\n body,\n );\n}\nexport class TSNamedTupleMemberMatcher extends Matcher<t.TSNamedTupleMember> {\n constructor(\n private readonly label?: Matcher<t.Identifier>,\n private readonly elementType?: Matcher<t.TSType>,\n private readonly optional?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSNamedTupleMember {\n if (\n !t.isNode(node) ||\n !t.isTSNamedTupleMember(node)\n ) {\n return false;\n }\n\n if (typeof this.label === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.label.matchValue(node.label, [...keys, \"label\"])) {\n return false;\n }\n\n if (typeof this.elementType === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.elementType.matchValue(node.elementType, [...keys, \"elementType\"])\n ) {\n return false;\n }\n\n if (typeof this.optional === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.optional === \"boolean\") {\n if (this.optional !== node.optional) {\n return false;\n }\n } else if (\n !this.optional.matchValue(node.optional, [...keys, \"optional\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsNamedTupleMember(\n label?: Matcher<t.Identifier>,\n elementType?: Matcher<t.TSType>,\n optional?: Matcher<boolean> | boolean,\n): Matcher<t.TSNamedTupleMember> {\n return new TSNamedTupleMemberMatcher(\n label,\n elementType,\n optional,\n );\n}\nexport class TSNamespaceExportDeclarationMatcher\n extends Matcher<t.TSNamespaceExportDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSNamespaceExportDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSNamespaceExportDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsNamespaceExportDeclaration(\n id?: Matcher<t.Identifier>,\n): Matcher<t.TSNamespaceExportDeclaration> {\n return new TSNamespaceExportDeclarationMatcher(\n id,\n );\n}\nexport class TSNeverKeywordMatcher extends Matcher<t.TSNeverKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSNeverKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSNeverKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsNeverKeyword(): Matcher<t.TSNeverKeyword> {\n return new TSNeverKeywordMatcher();\n}\nexport class TSNonNullExpressionMatcher extends Matcher<t.TSNonNullExpression> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSNonNullExpression {\n if (\n !t.isNode(node) ||\n !t.isTSNonNullExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsNonNullExpression(\n expression?: Matcher<t.Expression>,\n): Matcher<t.TSNonNullExpression> {\n return new TSNonNullExpressionMatcher(\n expression,\n );\n}\nexport class TSNullKeywordMatcher extends Matcher<t.TSNullKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSNullKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSNullKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsNullKeyword(): Matcher<t.TSNullKeyword> {\n return new TSNullKeywordMatcher();\n}\nexport class TSNumberKeywordMatcher extends Matcher<t.TSNumberKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSNumberKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSNumberKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsNumberKeyword(): Matcher<t.TSNumberKeyword> {\n return new TSNumberKeywordMatcher();\n}\nexport class TSObjectKeywordMatcher extends Matcher<t.TSObjectKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSObjectKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSObjectKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsObjectKeyword(): Matcher<t.TSObjectKeyword> {\n return new TSObjectKeywordMatcher();\n}\nexport class TSOptionalTypeMatcher extends Matcher<t.TSOptionalType> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSOptionalType {\n if (\n !t.isNode(node) ||\n !t.isTSOptionalType(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsOptionalType(\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSOptionalType> {\n return new TSOptionalTypeMatcher(\n typeAnnotation,\n );\n}\nexport class TSParameterPropertyMatcher extends Matcher<t.TSParameterProperty> {\n constructor(\n private readonly parameter?: Matcher<t.Identifier | t.AssignmentPattern>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSParameterProperty {\n if (\n !t.isNode(node) ||\n !t.isTSParameterProperty(node)\n ) {\n return false;\n }\n\n if (typeof this.parameter === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.parameter.matchValue(node.parameter, [...keys, \"parameter\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsParameterProperty(\n parameter?: Matcher<t.Identifier | t.AssignmentPattern>,\n): Matcher<t.TSParameterProperty> {\n return new TSParameterPropertyMatcher(\n parameter,\n );\n}\nexport class TSParenthesizedTypeMatcher extends Matcher<t.TSParenthesizedType> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSParenthesizedType {\n if (\n !t.isNode(node) ||\n !t.isTSParenthesizedType(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsParenthesizedType(\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSParenthesizedType> {\n return new TSParenthesizedTypeMatcher(\n typeAnnotation,\n );\n}\nexport class TSPropertySignatureMatcher extends Matcher<t.TSPropertySignature> {\n constructor(\n private readonly key?: Matcher<t.Expression>,\n private readonly typeAnnotation?: Matcher<t.TSTypeAnnotation> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSPropertySignature {\n if (\n !t.isNode(node) ||\n !t.isTSPropertySignature(node)\n ) {\n return false;\n }\n\n if (typeof this.key === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.key.matchValue(node.key, [...keys, \"key\"])) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeAnnotation === null) {\n // null matcher means we expect null value\n if (node.typeAnnotation !== null) {\n return false;\n }\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsPropertySignature(\n key?: Matcher<t.Expression>,\n typeAnnotation?: Matcher<t.TSTypeAnnotation> | null,\n): Matcher<t.TSPropertySignature> {\n return new TSPropertySignatureMatcher(\n key,\n typeAnnotation,\n );\n}\nexport class TSQualifiedNameMatcher extends Matcher<t.TSQualifiedName> {\n constructor(\n private readonly left?: Matcher<t.TSEntityName>,\n private readonly right?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSQualifiedName {\n if (\n !t.isNode(node) ||\n !t.isTSQualifiedName(node)\n ) {\n return false;\n }\n\n if (typeof this.left === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.left.matchValue(node.left, [...keys, \"left\"])) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsQualifiedName(\n left?: Matcher<t.TSEntityName>,\n right?: Matcher<t.Identifier>,\n): Matcher<t.TSQualifiedName> {\n return new TSQualifiedNameMatcher(\n left,\n right,\n );\n}\nexport class TSRestTypeMatcher extends Matcher<t.TSRestType> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSRestType {\n if (\n !t.isNode(node) ||\n !t.isTSRestType(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsRestType(\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSRestType> {\n return new TSRestTypeMatcher(\n typeAnnotation,\n );\n}\nexport class TSSatisfiesExpressionMatcher\n extends Matcher<t.TSSatisfiesExpression> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSSatisfiesExpression {\n if (\n !t.isNode(node) ||\n !t.isTSSatisfiesExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsSatisfiesExpression(\n expression?: Matcher<t.Expression>,\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSSatisfiesExpression> {\n return new TSSatisfiesExpressionMatcher(\n expression,\n typeAnnotation,\n );\n}\nexport class TSStringKeywordMatcher extends Matcher<t.TSStringKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSStringKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSStringKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsStringKeyword(): Matcher<t.TSStringKeyword> {\n return new TSStringKeywordMatcher();\n}\nexport class TSSymbolKeywordMatcher extends Matcher<t.TSSymbolKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSSymbolKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSSymbolKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsSymbolKeyword(): Matcher<t.TSSymbolKeyword> {\n return new TSSymbolKeywordMatcher();\n}\nexport class TSTemplateLiteralTypeMatcher\n extends Matcher<t.TSTemplateLiteralType> {\n constructor(\n private readonly quasis?:\n | Matcher<Array<t.TemplateElement>>\n | Array<Matcher<t.TemplateElement>>,\n private readonly types?:\n | Matcher<Array<t.TSType>>\n | Array<Matcher<t.TSType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTemplateLiteralType {\n if (\n !t.isNode(node) ||\n !t.isTSTemplateLiteralType(node)\n ) {\n return false;\n }\n\n if (typeof this.quasis === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.quasis)) {\n if (\n !tupleOf<unknown>(...this.quasis).matchValue(node.quasis, [\n ...keys,\n \"quasis\",\n ])\n ) {\n return false;\n }\n } else if (!this.quasis.matchValue(node.quasis, [...keys, \"quasis\"])) {\n return false;\n }\n\n if (typeof this.types === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.types)) {\n if (\n !tupleOf<unknown>(...this.types).matchValue(node.types, [\n ...keys,\n \"types\",\n ])\n ) {\n return false;\n }\n } else if (!this.types.matchValue(node.types, [...keys, \"types\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTemplateLiteralType(\n quasis?:\n | Matcher<Array<t.TemplateElement>>\n | Array<Matcher<t.TemplateElement>>,\n types?: Matcher<Array<t.TSType>> | Array<Matcher<t.TSType>>,\n): Matcher<t.TSTemplateLiteralType> {\n return new TSTemplateLiteralTypeMatcher(\n quasis,\n types,\n );\n}\nexport class TSThisTypeMatcher extends Matcher<t.TSThisType> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSThisType {\n if (\n !t.isNode(node) ||\n !t.isTSThisType(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsThisType(): Matcher<t.TSThisType> {\n return new TSThisTypeMatcher();\n}\nexport class TSTupleTypeMatcher extends Matcher<t.TSTupleType> {\n constructor(\n private readonly elementTypes?:\n | Matcher<Array<t.TSType | t.TSNamedTupleMember>>\n | Array<Matcher<t.TSType> | Matcher<t.TSNamedTupleMember>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTupleType {\n if (\n !t.isNode(node) ||\n !t.isTSTupleType(node)\n ) {\n return false;\n }\n\n if (typeof this.elementTypes === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.elementTypes)) {\n if (\n !tupleOf<unknown>(...this.elementTypes).matchValue(node.elementTypes, [\n ...keys,\n \"elementTypes\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.elementTypes.matchValue(node.elementTypes, [\n ...keys,\n \"elementTypes\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTupleType(\n elementTypes?:\n | Matcher<Array<t.TSType | t.TSNamedTupleMember>>\n | Array<Matcher<t.TSType> | Matcher<t.TSNamedTupleMember>>,\n): Matcher<t.TSTupleType> {\n return new TSTupleTypeMatcher(\n elementTypes,\n );\n}\nexport class TSTypeAliasDeclarationMatcher\n extends Matcher<t.TSTypeAliasDeclaration> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TSTypeParameterDeclaration>\n | null,\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeAliasDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSTypeAliasDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeAliasDeclaration(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TSTypeParameterDeclaration> | null,\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSTypeAliasDeclaration> {\n return new TSTypeAliasDeclarationMatcher(\n id,\n typeParameters,\n typeAnnotation,\n );\n}\nexport class TSTypeAnnotationMatcher extends Matcher<t.TSTypeAnnotation> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TSType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isTSTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeAnnotation(\n typeAnnotation?: Matcher<t.TSType>,\n): Matcher<t.TSTypeAnnotation> {\n return new TSTypeAnnotationMatcher(\n typeAnnotation,\n );\n}\nexport class TSTypeAssertionMatcher extends Matcher<t.TSTypeAssertion> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TSType>,\n private readonly expression?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeAssertion {\n if (\n !t.isNode(node) ||\n !t.isTSTypeAssertion(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeAssertion(\n typeAnnotation?: Matcher<t.TSType>,\n expression?: Matcher<t.Expression>,\n): Matcher<t.TSTypeAssertion> {\n return new TSTypeAssertionMatcher(\n typeAnnotation,\n expression,\n );\n}\nexport class TSTypeLiteralMatcher extends Matcher<t.TSTypeLiteral> {\n constructor(\n private readonly members?:\n | Matcher<Array<t.TSTypeElement>>\n | Array<Matcher<t.TSTypeElement>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeLiteral {\n if (\n !t.isNode(node) ||\n !t.isTSTypeLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.members === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.members)) {\n if (\n !tupleOf<unknown>(...this.members).matchValue(node.members, [\n ...keys,\n \"members\",\n ])\n ) {\n return false;\n }\n } else if (!this.members.matchValue(node.members, [...keys, \"members\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeLiteral(\n members?: Matcher<Array<t.TSTypeElement>> | Array<Matcher<t.TSTypeElement>>,\n): Matcher<t.TSTypeLiteral> {\n return new TSTypeLiteralMatcher(\n members,\n );\n}\nexport class TSTypeOperatorMatcher extends Matcher<t.TSTypeOperator> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.TSType>,\n private readonly operator?:\n | Matcher<\"keyof\" | \"readonly\" | \"unique\">\n | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeOperator {\n if (\n !t.isNode(node) ||\n !t.isTSTypeOperator(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.operator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.operator === \"string\") {\n if (this.operator !== node.operator) {\n return false;\n }\n } else if (\n !this.operator.matchValue(node.operator, [...keys, \"operator\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeOperator(\n typeAnnotation?: Matcher<t.TSType>,\n operator?: Matcher<\"keyof\" | \"readonly\" | \"unique\"> | string,\n): Matcher<t.TSTypeOperator> {\n return new TSTypeOperatorMatcher(\n typeAnnotation,\n operator,\n );\n}\nexport class TSTypeParameterMatcher extends Matcher<t.TSTypeParameter> {\n constructor(\n private readonly constraint?: Matcher<t.TSType> | null,\n private readonly _default?: Matcher<t.TSType> | null,\n private readonly name?: Matcher<t.Identifier>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeParameter {\n if (\n !t.isNode(node) ||\n !t.isTSTypeParameter(node)\n ) {\n return false;\n }\n\n if (typeof this.constraint === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.constraint === null) {\n // null matcher means we expect null value\n if (node.constraint !== null) {\n return false;\n }\n } else if (\n !this.constraint.matchValue(node.constraint, [...keys, \"constraint\"])\n ) {\n return false;\n }\n\n if (typeof this._default === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._default === null) {\n // null matcher means we expect null value\n if (node.default !== null) {\n return false;\n }\n } else if (!this._default.matchValue(node.default, [...keys, \"default\"])) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeParameter(\n constraint?: Matcher<t.TSType> | null,\n _default?: Matcher<t.TSType> | null,\n name?: Matcher<t.Identifier>,\n): Matcher<t.TSTypeParameter> {\n return new TSTypeParameterMatcher(\n constraint,\n _default,\n name,\n );\n}\nexport class TSTypeParameterDeclarationMatcher\n extends Matcher<t.TSTypeParameterDeclaration> {\n constructor(\n private readonly params?:\n | Matcher<Array<t.TSTypeParameter>>\n | Array<Matcher<t.TSTypeParameter>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeParameterDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTSTypeParameterDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeParameterDeclaration(\n params?:\n | Matcher<Array<t.TSTypeParameter>>\n | Array<Matcher<t.TSTypeParameter>>,\n): Matcher<t.TSTypeParameterDeclaration> {\n return new TSTypeParameterDeclarationMatcher(\n params,\n );\n}\nexport class TSTypeParameterInstantiationMatcher\n extends Matcher<t.TSTypeParameterInstantiation> {\n constructor(\n private readonly params?:\n | Matcher<Array<t.TSType>>\n | Array<Matcher<t.TSType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeParameterInstantiation {\n if (\n !t.isNode(node) ||\n !t.isTSTypeParameterInstantiation(node)\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeParameterInstantiation(\n params?: Matcher<Array<t.TSType>> | Array<Matcher<t.TSType>>,\n): Matcher<t.TSTypeParameterInstantiation> {\n return new TSTypeParameterInstantiationMatcher(\n params,\n );\n}\nexport class TSTypePredicateMatcher extends Matcher<t.TSTypePredicate> {\n constructor(\n private readonly parameterName?: Matcher<t.Identifier | t.TSThisType>,\n private readonly typeAnnotation?: Matcher<t.TSTypeAnnotation> | null,\n private readonly asserts?: Matcher<boolean> | boolean | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypePredicate {\n if (\n !t.isNode(node) ||\n !t.isTSTypePredicate(node)\n ) {\n return false;\n }\n\n if (typeof this.parameterName === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.parameterName.matchValue(node.parameterName, [\n ...keys,\n \"parameterName\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeAnnotation === null) {\n // null matcher means we expect null value\n if (node.typeAnnotation !== null) {\n return false;\n }\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.asserts === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.asserts === \"boolean\") {\n if (this.asserts !== node.asserts) {\n return false;\n }\n } else if (this.asserts === null) {\n // null matcher means we expect null value\n if (node.asserts !== null) {\n return false;\n }\n } else if (!this.asserts.matchValue(node.asserts, [...keys, \"asserts\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypePredicate(\n parameterName?: Matcher<t.Identifier | t.TSThisType>,\n typeAnnotation?: Matcher<t.TSTypeAnnotation> | null,\n asserts?: Matcher<boolean> | boolean | null,\n): Matcher<t.TSTypePredicate> {\n return new TSTypePredicateMatcher(\n parameterName,\n typeAnnotation,\n asserts,\n );\n}\nexport class TSTypeQueryMatcher extends Matcher<t.TSTypeQuery> {\n constructor(\n private readonly exprName?: Matcher<t.TSEntityName | t.TSImportType>,\n private readonly typeArguments?:\n | Matcher<t.TSTypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeQuery {\n if (\n !t.isNode(node) ||\n !t.isTSTypeQuery(node)\n ) {\n return false;\n }\n\n if (typeof this.exprName === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.exprName.matchValue(node.exprName, [...keys, \"exprName\"])\n ) {\n return false;\n }\n\n if (typeof this.typeArguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeArguments === null) {\n // null matcher means we expect null value\n if (node.typeArguments !== null) {\n return false;\n }\n } else if (\n !this.typeArguments.matchValue(node.typeArguments, [\n ...keys,\n \"typeArguments\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeQuery(\n exprName?: Matcher<t.TSEntityName | t.TSImportType>,\n typeArguments?: Matcher<t.TSTypeParameterInstantiation> | null,\n): Matcher<t.TSTypeQuery> {\n return new TSTypeQueryMatcher(\n exprName,\n typeArguments,\n );\n}\nexport class TSTypeReferenceMatcher extends Matcher<t.TSTypeReference> {\n constructor(\n private readonly typeName?: Matcher<t.TSEntityName>,\n private readonly typeArguments?:\n | Matcher<t.TSTypeParameterInstantiation>\n | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSTypeReference {\n if (\n !t.isNode(node) ||\n !t.isTSTypeReference(node)\n ) {\n return false;\n }\n\n if (typeof this.typeName === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeName.matchValue(node.typeName, [...keys, \"typeName\"])\n ) {\n return false;\n }\n\n if (typeof this.typeArguments === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeArguments === null) {\n // null matcher means we expect null value\n if (node.typeArguments !== null) {\n return false;\n }\n } else if (\n !this.typeArguments.matchValue(node.typeArguments, [\n ...keys,\n \"typeArguments\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsTypeReference(\n typeName?: Matcher<t.TSEntityName>,\n typeArguments?: Matcher<t.TSTypeParameterInstantiation> | null,\n): Matcher<t.TSTypeReference> {\n return new TSTypeReferenceMatcher(\n typeName,\n typeArguments,\n );\n}\nexport class TSUndefinedKeywordMatcher extends Matcher<t.TSUndefinedKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSUndefinedKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSUndefinedKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsUndefinedKeyword(): Matcher<t.TSUndefinedKeyword> {\n return new TSUndefinedKeywordMatcher();\n}\nexport class TSUnionTypeMatcher extends Matcher<t.TSUnionType> {\n constructor(\n private readonly types?:\n | Matcher<Array<t.TSType>>\n | Array<Matcher<t.TSType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSUnionType {\n if (\n !t.isNode(node) ||\n !t.isTSUnionType(node)\n ) {\n return false;\n }\n\n if (typeof this.types === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.types)) {\n if (\n !tupleOf<unknown>(...this.types).matchValue(node.types, [\n ...keys,\n \"types\",\n ])\n ) {\n return false;\n }\n } else if (!this.types.matchValue(node.types, [...keys, \"types\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsUnionType(\n types?: Matcher<Array<t.TSType>> | Array<Matcher<t.TSType>>,\n): Matcher<t.TSUnionType> {\n return new TSUnionTypeMatcher(\n types,\n );\n}\nexport class TSUnknownKeywordMatcher extends Matcher<t.TSUnknownKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSUnknownKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSUnknownKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsUnknownKeyword(): Matcher<t.TSUnknownKeyword> {\n return new TSUnknownKeywordMatcher();\n}\nexport class TSVoidKeywordMatcher extends Matcher<t.TSVoidKeyword> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TSVoidKeyword {\n if (\n !t.isNode(node) ||\n !t.isTSVoidKeyword(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tsVoidKeyword(): Matcher<t.TSVoidKeyword> {\n return new TSVoidKeywordMatcher();\n}\nexport class TaggedTemplateExpressionMatcher\n extends Matcher<t.TaggedTemplateExpression> {\n constructor(\n private readonly tag?: Matcher<t.Expression>,\n private readonly quasi?: Matcher<t.TemplateLiteral>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TaggedTemplateExpression {\n if (\n !t.isNode(node) ||\n !t.isTaggedTemplateExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.tag === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.tag.matchValue(node.tag, [...keys, \"tag\"])) {\n return false;\n }\n\n if (typeof this.quasi === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.quasi.matchValue(node.quasi, [...keys, \"quasi\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function taggedTemplateExpression(\n tag?: Matcher<t.Expression>,\n quasi?: Matcher<t.TemplateLiteral>,\n): Matcher<t.TaggedTemplateExpression> {\n return new TaggedTemplateExpressionMatcher(\n tag,\n quasi,\n );\n}\nexport class TemplateElementMatcher extends Matcher<t.TemplateElement> {\n constructor(\n private readonly value?: Matcher<any>,\n private readonly tail?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TemplateElement {\n if (\n !t.isNode(node) ||\n !t.isTemplateElement(node)\n ) {\n return false;\n }\n\n if (typeof this.value === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.value.matchValue(node.value, [...keys, \"value\"])) {\n return false;\n }\n\n if (typeof this.tail === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.tail === \"boolean\") {\n if (this.tail !== node.tail) {\n return false;\n }\n } else if (!this.tail.matchValue(node.tail, [...keys, \"tail\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function templateElement(\n value?: Matcher<any>,\n tail?: Matcher<boolean> | boolean,\n): Matcher<t.TemplateElement> {\n return new TemplateElementMatcher(\n value,\n tail,\n );\n}\nexport class TemplateLiteralMatcher extends Matcher<t.TemplateLiteral> {\n constructor(\n private readonly quasis?:\n | Matcher<Array<t.TemplateElement>>\n | Array<Matcher<t.TemplateElement>>,\n private readonly expressions?:\n | Matcher<Array<t.Expression | t.TSType>>\n | Array<Matcher<t.Expression> | Matcher<t.TSType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TemplateLiteral {\n if (\n !t.isNode(node) ||\n !t.isTemplateLiteral(node)\n ) {\n return false;\n }\n\n if (typeof this.quasis === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.quasis)) {\n if (\n !tupleOf<unknown>(...this.quasis).matchValue(node.quasis, [\n ...keys,\n \"quasis\",\n ])\n ) {\n return false;\n }\n } else if (!this.quasis.matchValue(node.quasis, [...keys, \"quasis\"])) {\n return false;\n }\n\n if (typeof this.expressions === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.expressions)) {\n if (\n !tupleOf<unknown>(...this.expressions).matchValue(node.expressions, [\n ...keys,\n \"expressions\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.expressions.matchValue(node.expressions, [...keys, \"expressions\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function templateLiteral(\n quasis?:\n | Matcher<Array<t.TemplateElement>>\n | Array<Matcher<t.TemplateElement>>,\n expressions?:\n | Matcher<Array<t.Expression | t.TSType>>\n | Array<Matcher<t.Expression> | Matcher<t.TSType>>,\n): Matcher<t.TemplateLiteral> {\n return new TemplateLiteralMatcher(\n quasis,\n expressions,\n );\n}\nexport class ThisExpressionMatcher extends Matcher<t.ThisExpression> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ThisExpression {\n if (\n !t.isNode(node) ||\n !t.isThisExpression(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function thisExpression(): Matcher<t.ThisExpression> {\n return new ThisExpressionMatcher();\n}\nexport class ThisTypeAnnotationMatcher extends Matcher<t.ThisTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ThisTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isThisTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function thisTypeAnnotation(): Matcher<t.ThisTypeAnnotation> {\n return new ThisTypeAnnotationMatcher();\n}\nexport class ThrowStatementMatcher extends Matcher<t.ThrowStatement> {\n constructor(\n private readonly argument?: Matcher<t.Expression>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.ThrowStatement {\n if (\n !t.isNode(node) ||\n !t.isThrowStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function throwStatement(\n argument?: Matcher<t.Expression>,\n): Matcher<t.ThrowStatement> {\n return new ThrowStatementMatcher(\n argument,\n );\n}\nexport class TopicReferenceMatcher extends Matcher<t.TopicReference> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TopicReference {\n if (\n !t.isNode(node) ||\n !t.isTopicReference(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function topicReference(): Matcher<t.TopicReference> {\n return new TopicReferenceMatcher();\n}\nexport class TryStatementMatcher extends Matcher<t.TryStatement> {\n constructor(\n private readonly block?: Matcher<t.BlockStatement>,\n private readonly handler?: Matcher<t.CatchClause> | null,\n private readonly finalizer?: Matcher<t.BlockStatement> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TryStatement {\n if (\n !t.isNode(node) ||\n !t.isTryStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.block === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.block.matchValue(node.block, [...keys, \"block\"])) {\n return false;\n }\n\n if (typeof this.handler === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.handler === null) {\n // null matcher means we expect null value\n if (node.handler !== null) {\n return false;\n }\n } else if (!this.handler.matchValue(node.handler, [...keys, \"handler\"])) {\n return false;\n }\n\n if (typeof this.finalizer === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.finalizer === null) {\n // null matcher means we expect null value\n if (node.finalizer !== null) {\n return false;\n }\n } else if (\n !this.finalizer.matchValue(node.finalizer, [...keys, \"finalizer\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tryStatement(\n block?: Matcher<t.BlockStatement>,\n handler?: Matcher<t.CatchClause> | null,\n finalizer?: Matcher<t.BlockStatement> | null,\n): Matcher<t.TryStatement> {\n return new TryStatementMatcher(\n block,\n handler,\n finalizer,\n );\n}\nexport class TupleTypeAnnotationMatcher extends Matcher<t.TupleTypeAnnotation> {\n constructor(\n private readonly types?:\n | Matcher<Array<t.FlowType>>\n | Array<Matcher<t.FlowType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TupleTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isTupleTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.types === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.types)) {\n if (\n !tupleOf<unknown>(...this.types).matchValue(node.types, [\n ...keys,\n \"types\",\n ])\n ) {\n return false;\n }\n } else if (!this.types.matchValue(node.types, [...keys, \"types\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function tupleTypeAnnotation(\n types?: Matcher<Array<t.FlowType>> | Array<Matcher<t.FlowType>>,\n): Matcher<t.TupleTypeAnnotation> {\n return new TupleTypeAnnotationMatcher(\n types,\n );\n}\nexport class TypeAliasMatcher extends Matcher<t.TypeAlias> {\n constructor(\n private readonly id?: Matcher<t.Identifier>,\n private readonly typeParameters?:\n | Matcher<t.TypeParameterDeclaration>\n | null,\n private readonly right?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeAlias {\n if (\n !t.isNode(node) ||\n !t.isTypeAlias(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.typeParameters === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.typeParameters === null) {\n // null matcher means we expect null value\n if (node.typeParameters !== null) {\n return false;\n }\n } else if (\n !this.typeParameters.matchValue(node.typeParameters, [\n ...keys,\n \"typeParameters\",\n ])\n ) {\n return false;\n }\n\n if (typeof this.right === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.right.matchValue(node.right, [...keys, \"right\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeAlias(\n id?: Matcher<t.Identifier>,\n typeParameters?: Matcher<t.TypeParameterDeclaration> | null,\n right?: Matcher<t.FlowType>,\n): Matcher<t.TypeAlias> {\n return new TypeAliasMatcher(\n id,\n typeParameters,\n right,\n );\n}\nexport class TypeAnnotationMatcher extends Matcher<t.TypeAnnotation> {\n constructor(\n private readonly typeAnnotation?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeAnnotation(\n typeAnnotation?: Matcher<t.FlowType>,\n): Matcher<t.TypeAnnotation> {\n return new TypeAnnotationMatcher(\n typeAnnotation,\n );\n}\nexport class TypeCastExpressionMatcher extends Matcher<t.TypeCastExpression> {\n constructor(\n private readonly expression?: Matcher<t.Expression>,\n private readonly typeAnnotation?: Matcher<t.TypeAnnotation>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeCastExpression {\n if (\n !t.isNode(node) ||\n !t.isTypeCastExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.expression === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.expression.matchValue(node.expression, [...keys, \"expression\"])\n ) {\n return false;\n }\n\n if (typeof this.typeAnnotation === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.typeAnnotation.matchValue(node.typeAnnotation, [\n ...keys,\n \"typeAnnotation\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeCastExpression(\n expression?: Matcher<t.Expression>,\n typeAnnotation?: Matcher<t.TypeAnnotation>,\n): Matcher<t.TypeCastExpression> {\n return new TypeCastExpressionMatcher(\n expression,\n typeAnnotation,\n );\n}\nexport class TypeParameterMatcher extends Matcher<t.TypeParameter> {\n constructor(\n private readonly name?: Matcher<string> | string,\n private readonly bound?: Matcher<t.TypeAnnotation> | null,\n private readonly _default?: Matcher<t.FlowType> | null,\n private readonly variance?: Matcher<t.Variance> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeParameter {\n if (\n !t.isNode(node) ||\n !t.isTypeParameter(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.name === \"string\") {\n if (this.name !== node.name) {\n return false;\n }\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n if (typeof this.bound === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.bound === null) {\n // null matcher means we expect null value\n if (node.bound !== null) {\n return false;\n }\n } else if (!this.bound.matchValue(node.bound, [...keys, \"bound\"])) {\n return false;\n }\n\n if (typeof this._default === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this._default === null) {\n // null matcher means we expect null value\n if (node.default !== null) {\n return false;\n }\n } else if (!this._default.matchValue(node.default, [...keys, \"default\"])) {\n return false;\n }\n\n if (typeof this.variance === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.variance === null) {\n // null matcher means we expect null value\n if (node.variance !== null) {\n return false;\n }\n } else if (\n !this.variance.matchValue(node.variance, [...keys, \"variance\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeParameter(\n name?: Matcher<string> | string,\n bound?: Matcher<t.TypeAnnotation> | null,\n _default?: Matcher<t.FlowType> | null,\n variance?: Matcher<t.Variance> | null,\n): Matcher<t.TypeParameter> {\n return new TypeParameterMatcher(\n name,\n bound,\n _default,\n variance,\n );\n}\nexport class TypeParameterDeclarationMatcher\n extends Matcher<t.TypeParameterDeclaration> {\n constructor(\n private readonly params?:\n | Matcher<Array<t.TypeParameter>>\n | Array<Matcher<t.TypeParameter>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeParameterDeclaration {\n if (\n !t.isNode(node) ||\n !t.isTypeParameterDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeParameterDeclaration(\n params?: Matcher<Array<t.TypeParameter>> | Array<Matcher<t.TypeParameter>>,\n): Matcher<t.TypeParameterDeclaration> {\n return new TypeParameterDeclarationMatcher(\n params,\n );\n}\nexport class TypeParameterInstantiationMatcher\n extends Matcher<t.TypeParameterInstantiation> {\n constructor(\n private readonly params?:\n | Matcher<Array<t.FlowType>>\n | Array<Matcher<t.FlowType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeParameterInstantiation {\n if (\n !t.isNode(node) ||\n !t.isTypeParameterInstantiation(node)\n ) {\n return false;\n }\n\n if (typeof this.params === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.params)) {\n if (\n !tupleOf<unknown>(...this.params).matchValue(node.params, [\n ...keys,\n \"params\",\n ])\n ) {\n return false;\n }\n } else if (!this.params.matchValue(node.params, [...keys, \"params\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeParameterInstantiation(\n params?: Matcher<Array<t.FlowType>> | Array<Matcher<t.FlowType>>,\n): Matcher<t.TypeParameterInstantiation> {\n return new TypeParameterInstantiationMatcher(\n params,\n );\n}\nexport class TypeofTypeAnnotationMatcher\n extends Matcher<t.TypeofTypeAnnotation> {\n constructor(\n private readonly argument?: Matcher<t.FlowType>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.TypeofTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isTypeofTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function typeofTypeAnnotation(\n argument?: Matcher<t.FlowType>,\n): Matcher<t.TypeofTypeAnnotation> {\n return new TypeofTypeAnnotationMatcher(\n argument,\n );\n}\nexport class UnaryExpressionMatcher extends Matcher<t.UnaryExpression> {\n constructor(\n private readonly operator?:\n | Matcher<\"void\" | \"throw\" | \"delete\" | \"!\" | \"+\" | \"-\" | \"~\" | \"typeof\">\n | string,\n private readonly argument?: Matcher<t.Expression>,\n private readonly prefix?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.UnaryExpression {\n if (\n !t.isNode(node) ||\n !t.isUnaryExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.operator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.operator === \"string\") {\n if (this.operator !== node.operator) {\n return false;\n }\n } else if (\n !this.operator.matchValue(node.operator, [...keys, \"operator\"])\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n if (typeof this.prefix === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.prefix === \"boolean\") {\n if (this.prefix !== node.prefix) {\n return false;\n }\n } else if (!this.prefix.matchValue(node.prefix, [...keys, \"prefix\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function unaryExpression(\n operator?:\n | Matcher<\"void\" | \"throw\" | \"delete\" | \"!\" | \"+\" | \"-\" | \"~\" | \"typeof\">\n | string,\n argument?: Matcher<t.Expression>,\n prefix?: Matcher<boolean> | boolean,\n): Matcher<t.UnaryExpression> {\n return new UnaryExpressionMatcher(\n operator,\n argument,\n prefix,\n );\n}\nexport class UnionTypeAnnotationMatcher extends Matcher<t.UnionTypeAnnotation> {\n constructor(\n private readonly types?:\n | Matcher<Array<t.FlowType>>\n | Array<Matcher<t.FlowType>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.UnionTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isUnionTypeAnnotation(node)\n ) {\n return false;\n }\n\n if (typeof this.types === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.types)) {\n if (\n !tupleOf<unknown>(...this.types).matchValue(node.types, [\n ...keys,\n \"types\",\n ])\n ) {\n return false;\n }\n } else if (!this.types.matchValue(node.types, [...keys, \"types\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function unionTypeAnnotation(\n types?: Matcher<Array<t.FlowType>> | Array<Matcher<t.FlowType>>,\n): Matcher<t.UnionTypeAnnotation> {\n return new UnionTypeAnnotationMatcher(\n types,\n );\n}\nexport class UpdateExpressionMatcher extends Matcher<t.UpdateExpression> {\n constructor(\n private readonly operator?: Matcher<\"++\" | \"--\"> | string,\n private readonly argument?: Matcher<t.Identifier | t.MemberExpression>,\n private readonly prefix?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.UpdateExpression {\n if (\n !t.isNode(node) ||\n !t.isUpdateExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.operator === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.operator === \"string\") {\n if (this.operator !== node.operator) {\n return false;\n }\n } else if (\n !this.operator.matchValue(node.operator, [...keys, \"operator\"])\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n if (typeof this.prefix === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.prefix === \"boolean\") {\n if (this.prefix !== node.prefix) {\n return false;\n }\n } else if (!this.prefix.matchValue(node.prefix, [...keys, \"prefix\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function updateExpression(\n operator?: Matcher<\"++\" | \"--\"> | string,\n argument?: Matcher<t.Identifier | t.MemberExpression>,\n prefix?: Matcher<boolean> | boolean,\n): Matcher<t.UpdateExpression> {\n return new UpdateExpressionMatcher(\n operator,\n argument,\n prefix,\n );\n}\nexport class V8IntrinsicIdentifierMatcher\n extends Matcher<t.V8IntrinsicIdentifier> {\n constructor(\n private readonly name?: Matcher<string> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.V8IntrinsicIdentifier {\n if (\n !t.isNode(node) ||\n !t.isV8IntrinsicIdentifier(node)\n ) {\n return false;\n }\n\n if (typeof this.name === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.name === \"string\") {\n if (this.name !== node.name) {\n return false;\n }\n } else if (!this.name.matchValue(node.name, [...keys, \"name\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function v8IntrinsicIdentifier(\n name?: Matcher<string> | string,\n): Matcher<t.V8IntrinsicIdentifier> {\n return new V8IntrinsicIdentifierMatcher(\n name,\n );\n}\nexport class VariableDeclarationMatcher extends Matcher<t.VariableDeclaration> {\n constructor(\n private readonly kind?:\n | Matcher<\"var\" | \"let\" | \"const\" | \"using\" | \"await using\">\n | string,\n private readonly declarations?:\n | Matcher<Array<t.VariableDeclarator>>\n | Array<Matcher<t.VariableDeclarator>>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.VariableDeclaration {\n if (\n !t.isNode(node) ||\n !t.isVariableDeclaration(node)\n ) {\n return false;\n }\n\n if (typeof this.kind === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.kind === \"string\") {\n if (this.kind !== node.kind) {\n return false;\n }\n } else if (!this.kind.matchValue(node.kind, [...keys, \"kind\"])) {\n return false;\n }\n\n if (typeof this.declarations === \"undefined\") {\n // undefined matcher means anything matches\n } else if (Array.isArray(this.declarations)) {\n if (\n !tupleOf<unknown>(...this.declarations).matchValue(node.declarations, [\n ...keys,\n \"declarations\",\n ])\n ) {\n return false;\n }\n } else if (\n !this.declarations.matchValue(node.declarations, [\n ...keys,\n \"declarations\",\n ])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function variableDeclaration(\n kind?: Matcher<\"var\" | \"let\" | \"const\" | \"using\" | \"await using\"> | string,\n declarations?:\n | Matcher<Array<t.VariableDeclarator>>\n | Array<Matcher<t.VariableDeclarator>>,\n): Matcher<t.VariableDeclaration> {\n return new VariableDeclarationMatcher(\n kind,\n declarations,\n );\n}\nexport class VariableDeclaratorMatcher extends Matcher<t.VariableDeclarator> {\n constructor(\n private readonly id?: Matcher<\n t.Identifier | t.ArrayPattern | t.ObjectPattern | t.VoidPattern\n >,\n private readonly init?: Matcher<t.Expression> | null,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.VariableDeclarator {\n if (\n !t.isNode(node) ||\n !t.isVariableDeclarator(node)\n ) {\n return false;\n }\n\n if (typeof this.id === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.id.matchValue(node.id, [...keys, \"id\"])) {\n return false;\n }\n\n if (typeof this.init === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.init === null) {\n // null matcher means we expect null value\n if (node.init !== null) {\n return false;\n }\n } else if (!this.init.matchValue(node.init, [...keys, \"init\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function variableDeclarator(\n id?: Matcher<t.Identifier | t.ArrayPattern | t.ObjectPattern | t.VoidPattern>,\n init?: Matcher<t.Expression> | null,\n): Matcher<t.VariableDeclarator> {\n return new VariableDeclaratorMatcher(\n id,\n init,\n );\n}\nexport class VarianceMatcher extends Matcher<t.Variance> {\n constructor(\n private readonly kind?: Matcher<\"minus\" | \"plus\"> | string,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.Variance {\n if (\n !t.isNode(node) ||\n !t.isVariance(node)\n ) {\n return false;\n }\n\n if (typeof this.kind === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.kind === \"string\") {\n if (this.kind !== node.kind) {\n return false;\n }\n } else if (!this.kind.matchValue(node.kind, [...keys, \"kind\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function variance(\n kind?: Matcher<\"minus\" | \"plus\"> | string,\n): Matcher<t.Variance> {\n return new VarianceMatcher(\n kind,\n );\n}\nexport class VoidPatternMatcher extends Matcher<t.VoidPattern> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.VoidPattern {\n if (\n !t.isNode(node) ||\n !t.isVoidPattern(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function voidPattern(): Matcher<t.VoidPattern> {\n return new VoidPatternMatcher();\n}\nexport class VoidTypeAnnotationMatcher extends Matcher<t.VoidTypeAnnotation> {\n constructor() {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.VoidTypeAnnotation {\n if (\n !t.isNode(node) ||\n !t.isVoidTypeAnnotation(node)\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function voidTypeAnnotation(): Matcher<t.VoidTypeAnnotation> {\n return new VoidTypeAnnotationMatcher();\n}\nexport class WhileStatementMatcher extends Matcher<t.WhileStatement> {\n constructor(\n private readonly test?: Matcher<t.Expression>,\n private readonly body?: Matcher<t.Statement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.WhileStatement {\n if (\n !t.isNode(node) ||\n !t.isWhileStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.test === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.test.matchValue(node.test, [...keys, \"test\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function whileStatement(\n test?: Matcher<t.Expression>,\n body?: Matcher<t.Statement>,\n): Matcher<t.WhileStatement> {\n return new WhileStatementMatcher(\n test,\n body,\n );\n}\nexport class WithStatementMatcher extends Matcher<t.WithStatement> {\n constructor(\n private readonly object?: Matcher<t.Expression>,\n private readonly body?: Matcher<t.Statement>,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.WithStatement {\n if (\n !t.isNode(node) ||\n !t.isWithStatement(node)\n ) {\n return false;\n }\n\n if (typeof this.object === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.object.matchValue(node.object, [...keys, \"object\"])) {\n return false;\n }\n\n if (typeof this.body === \"undefined\") {\n // undefined matcher means anything matches\n } else if (!this.body.matchValue(node.body, [...keys, \"body\"])) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function withStatement(\n object?: Matcher<t.Expression>,\n body?: Matcher<t.Statement>,\n): Matcher<t.WithStatement> {\n return new WithStatementMatcher(\n object,\n body,\n );\n}\nexport class YieldExpressionMatcher extends Matcher<t.YieldExpression> {\n constructor(\n private readonly argument?: Matcher<t.Expression> | null,\n private readonly delegate?: Matcher<boolean> | boolean,\n ) {\n super();\n }\n\n override matchValue(\n node: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): node is t.YieldExpression {\n if (\n !t.isNode(node) ||\n !t.isYieldExpression(node)\n ) {\n return false;\n }\n\n if (typeof this.argument === \"undefined\") {\n // undefined matcher means anything matches\n } else if (this.argument === null) {\n // null matcher means we expect null value\n if (node.argument !== null) {\n return false;\n }\n } else if (\n !this.argument.matchValue(node.argument, [...keys, \"argument\"])\n ) {\n return false;\n }\n\n if (typeof this.delegate === \"undefined\") {\n // undefined matcher means anything matches\n } else if (typeof this.delegate === \"boolean\") {\n if (this.delegate !== node.delegate) {\n return false;\n }\n } else if (\n !this.delegate.matchValue(node.delegate, [...keys, \"delegate\"])\n ) {\n return false;\n }\n\n return true;\n }\n}\n\nexport function yieldExpression(\n argument?: Matcher<t.Expression> | null,\n delegate?: Matcher<boolean> | boolean,\n): Matcher<t.YieldExpression> {\n return new YieldExpressionMatcher(\n argument,\n delegate,\n );\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport class OneOfMatcher<T> extends Matcher<[T]> {\n constructor(private readonly matcher: Matcher<T>) {\n super();\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is [T] {\n if (!Array.isArray(value)) {\n return false;\n }\n\n if (value.length !== 1) {\n return false;\n }\n\n return this.matcher.matchValue(value[0], [...keys, 0]);\n }\n}\n\nexport function oneOf<T>(matcher: Matcher<T>): Matcher<[T]> {\n return new OneOfMatcher(matcher);\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport class OrMatcher<T, A extends Array<Matcher<T> | T>> extends Matcher<T> {\n private readonly matchersOrValues: A;\n\n constructor(...matchersOrValues: A) {\n super();\n this.matchersOrValues = matchersOrValues;\n }\n\n override matchValue(\n value: unknown,\n keys: ReadonlyArray<PropertyKey>,\n ): value is T {\n for (const matcherOrValue of this.matchersOrValues) {\n if (matcherOrValue instanceof Matcher) {\n if (matcherOrValue.matchValue(value, keys)) {\n return true;\n }\n } else if (matcherOrValue === value) {\n return true;\n }\n }\n return false;\n }\n}\n\nexport function or(): Matcher<never>;\nexport function or<T>(first: Matcher<T> | T): Matcher<T>;\nexport function or<T, U>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n): Matcher<T | U>;\nexport function or<T, U, V>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n): Matcher<T | U | V>;\nexport function or<T, U, V, W>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n): Matcher<T | U | V | W>;\nexport function or<T, U, V, W, X>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n): Matcher<T | U | V | W | X>;\nexport function or<T, U, V, W, X, Y>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n): Matcher<T | U | V | W | X | Y>;\nexport function or<T, U, V, W, X, Y, Z>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n): Matcher<T | U | V | W | X | Y | Z>;\nexport function or<T, U, V, W, X, Y, Z, A>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n eighth: Matcher<A> | A,\n): Matcher<T | U | V | W | X | Y | Z | A>;\nexport function or<T, U, V, W, X, Y, Z, A, B>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n eighth: Matcher<A> | A,\n nineth: Matcher<B> | B,\n): Matcher<T | U | V | W | X | Y | Z | A | B>;\nexport function or<T, U, V, W, X, Y, Z, A, B, C>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n eighth: Matcher<A> | A,\n nineth: Matcher<B> | B,\n tenth: Matcher<C> | C,\n): Matcher<T | U | V | W | X | Y | Z | A | B | C>;\nexport function or<T, U, V, W, X, Y, Z, A, B, C, D>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n eighth: Matcher<A> | A,\n nineth: Matcher<B> | B,\n tenth: Matcher<C> | C,\n eleventh: Matcher<D> | D,\n): Matcher<T | U | V | W | X | Y | Z | A | B | C | D>;\nexport function or<T, U, V, W, X, Y, Z, A, B, C, D, E>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n eighth: Matcher<A> | A,\n nineth: Matcher<B> | B,\n tenth: Matcher<C> | C,\n eleventh: Matcher<D> | D,\n twelveth: Matcher<E> | E,\n): Matcher<T | U | V | W | X | Y | Z | A | B | C | D | E>;\nexport function or<T, U, V, W, X, Y, Z, A, B, C, D, E, F>(\n first: Matcher<T> | T,\n second: Matcher<U> | U,\n third: Matcher<V> | V,\n fourth: Matcher<W> | W,\n fifth: Matcher<X> | X,\n sixth: Matcher<Y> | Y,\n seventh: Matcher<Z> | Z,\n eighth: Matcher<A> | A,\n nineth: Matcher<B> | B,\n tenth: Matcher<C> | C,\n eleventh: Matcher<D> | D,\n twelveth: Matcher<E> | E,\n thirteenth: Matcher<F> | F,\n): Matcher<T | U | V | W | X | Y | Z | A | B | C | D | E | F>;\nexport function or<T, A extends Array<Matcher<T> | T>>(\n ...matchersOrValues: A\n): Matcher<T> {\n return new OrMatcher(...matchersOrValues);\n}\n", "import { Matcher } from \"./Matcher.ts\";\n\nexport type Predicate = (value: unknown) => boolean;\n\nexport class PredicateMatcher<T> extends Matcher<T> {\n constructor(private readonly predicate: Predicate) {\n super();\n }\n\n override matchValue(value: unknown): value is T {\n return this.predicate(value);\n }\n}\n\nexport function predicate<T>(predicate: Predicate): Matcher<T> {\n return new PredicateMatcher(predicate);\n}\n", "export { anyExpression } from \"./anyExpression.ts\";\nexport { anyList } from \"./anyList.ts\";\nexport { anyNode } from \"./anyNode.ts\";\nexport { anyNumber } from \"./anyNumber.ts\";\nexport { anyStatement } from \"./anyStatement.ts\";\nexport { anyString } from \"./anyString.ts\";\nexport { anything } from \"./anything.ts\";\nexport { arrayOf } from \"./arrayOf.ts\";\nexport { capture, type CaptureBase, CapturedMatcher } from \"./capture.ts\";\nexport { containerOf } from \"./containerOf.ts\";\nexport { fromCapture } from \"./fromCapture.ts\";\nexport { Function, function } from \"./function.ts\";\nexport * from \"./generated.ts\";\nexport { Matcher } from \"./Matcher.ts\";\nexport { oneOf } from \"./oneOf.ts\";\nexport { or } from \"./or.ts\";\nexport { predicate as matcher } from \"./predicate.ts\";\nexport * from \"./slice.ts\";\nexport { tupleOf } from \"./tupleOf.ts\";\n", "import type * as m from \"../matchers/mod.ts\";\n\n/**\n * This helper makes it easier to use a matcher together with captured values,\n * especially from TypeScript. Essentially, this helper \"unwraps\" the captured\n * values and passes them to the callback if the matcher matches the value. This\n * prevents users of capturing matchers from needing to check the current\n * captured value before using it.\n *\n * Here is an example codemod that turns e.g. `a + a` into `a * 2`. This\n * is not actually something you'd want to do as `+` is used on more than\n * just numbers, but it is suitable for purposes of illustration.\n *\n * @example\n *\n * import * as m from '@codemod/matchers';\n *\n * let id: m.CapturedMatcher<t.Identifier>;\n * const idPlusIdMatcher = m.binaryExpression(\n * '+',\n * (id = m.capture(m.identifier())),\n * m.fromCapture(id)\n * );\n *\n * export default function() {\n * return {\n * BinaryExpression(path: NodePath<t.BinaryExpression>): void {\n * m.match(idPlusIdMatcher, { id }, path.node, ({ id }) => {\n * path.replaceWith(t.binaryExpression('*', id, t.numericLiteral(2)));\n * });\n * }\n * };\n * }\n */\nexport function match<T, C extends m.CaptureBase>(\n matcher: m.Matcher<T>,\n captures: { [K in keyof C]: m.CapturedMatcher<C[K]> },\n value: T,\n callback: (captures: C) => void,\n): void {\n if (matcher.match(value)) {\n const capturedValues = {} as C;\n\n for (const key in captures) {\n if (Object.prototype.hasOwnProperty.call(captures, key)) {\n const capturedValue = captures[key as keyof C].current;\n if (capturedValue !== undefined) {\n capturedValues[key as keyof C] = capturedValue;\n }\n }\n }\n\n callback(capturedValues);\n }\n}\n", "import type { NodePath } from \"npm:@babel/traverse@^8.0.0-rc.5\";\nimport type * as t from \"npm:@babel/types@^8.0.0-rc.5\";\nimport type * as m from \"../matchers/mod.ts\";\n\nexport type CapturedNodePaths<C> = {\n [K in keyof C]: C[K] extends t.Node ? NodePath<C[K]> : C[K];\n};\nexport type CapturedMatchers<C> = { [K in keyof C]: m.CapturedMatcher<C[K]> };\n\n/**\n * This helper makes it easier to use a matcher that captures `NodePath` values.\n * Here is an example codemod that removes a redundant `-1` argument on `slice`\n * calls:\n *\n * @example\n *\n * import * as m from '@codemod/matchers';\n * import { PluginObj } from '@babel/core';\n *\n * const negativeOneArgument = m.capture(m.numericLiteral(-1));\n * const sliceCallMatcher = m.callExpression(\n * m.memberExpression(\n * m.anyExpression(),\n * m.identifier('slice'),\n * false\n * ),\n * [m.anything(), negativeOneArgument]\n * );\n *\n * export default function(): PluginObj {\n * return {\n * CallExpression(path: NodePath<t.CallExpression>): void {\n * m.matchPath(sliceCallMatcher, { negativeOneArgument }, path ({ negativeOneArgument }) => {\n * negativeOneArgument.remove();\n * });\n * }\n * };\n * }\n */\nexport function matchPath<Node extends t.Node, C extends m.CaptureBase>(\n matcher: m.Matcher<Node>,\n captures: CapturedMatchers<C>,\n value: NodePath<Node>,\n callback: (paths: CapturedNodePaths<C>) => void,\n): void;\nexport function matchPath<Node extends t.Node, C extends m.CaptureBase>(\n matcher: m.Matcher<Array<Node>>,\n captures: CapturedMatchers<C>,\n value: Array<NodePath<Node>>,\n callback: (paths: CapturedNodePaths<C>) => void,\n): void;\nexport function matchPath<Node extends t.Node, C extends m.CaptureBase>(\n matcher: m.Matcher<Node | Array<Node>>,\n captures: CapturedMatchers<C>,\n value: NodePath<Node> | Array<NodePath<Node>>,\n callback: (paths: CapturedNodePaths<C>) => void,\n): void {\n const toMatch = Array.isArray(value)\n ? value.map((element) => element.node)\n : value.node;\n if (matcher.match(toMatch)) {\n const capturedPaths = {} as CapturedNodePaths<C>;\n\n for (const key in captures) {\n if (Object.prototype.hasOwnProperty.call(captures, key)) {\n const { current, currentKeys } = captures[key as keyof C];\n if (current !== undefined && currentKeys !== undefined) {\n capturedPaths[key as keyof C] = extractCapturedPath(\n value,\n currentKeys,\n );\n }\n }\n }\n\n callback(capturedPaths);\n }\n}\n\nfunction extractCapturedPath<C extends m.CaptureBase>(\n value: NodePath<t.Node> | Array<NodePath<t.Node>>,\n keys: ReadonlyArray<PropertyKey>,\n): C[keyof C] extends t.Node ? NodePath<C[keyof C]> : C[keyof C] {\n let capturedPath: NodePath<t.Node> | Array<NodePath<t.Node>> = value;\n\n for (const [i, key] of keys.entries()) {\n if (typeof key === \"string\") {\n if (Array.isArray(capturedPath)) {\n throw new TypeError(\n `failed to get '${keys.join(\".\")}'; at '${\n keys\n .slice(0, i + 1)\n .join(\".\")\n }' expected a NodePath but got an array`,\n );\n }\n\n // @ts-expect-error: keys are runtime\n capturedPath = capturedPath.get(key);\n } else if (typeof key === \"number\") {\n if (!Array.isArray(capturedPath)) {\n throw new TypeError(\n `failed to get '${keys.join(\".\")}'; at '${\n keys\n .slice(0, i + 1)\n .join(\".\")\n }' expected an array but got a NodePath`,\n );\n }\n\n capturedPath = capturedPath[key];\n } else {\n throw new TypeError(\n `failed to get '${keys.join(\".\")}'; key '${\n String(\n key,\n )\n }' is neither a string nor a number, not ${typeof key}`,\n );\n }\n }\n\n if (!Array.isArray(capturedPath) && typeof capturedPath.node !== \"object\") {\n return capturedPath.node as C[keyof C] extends t.Node ? NodePath<C[keyof C]>\n : C[keyof C];\n } else {\n return capturedPath as C[keyof C] extends t.Node ? NodePath<C[keyof C]>\n : C[keyof C];\n }\n}\n", "export * from \"./lib/matchers/mod.ts\";\nexport { match } from \"./lib/utils/match.ts\";\nexport { matchPath } from \"./lib/utils/matchPath.ts\";\n", "import type { Binding, NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\n/**\n * Matches any literal except for template literals with expressions (that could have side effects)\n */\nexport const safeLiteral: m.Matcher<t.Literal> = m.matcher(\n (node) =>\n t.isNode(node) &&\n t.isLiteral(node) &&\n (!t.isTemplateLiteral(node) || node.expressions.length === 0),\n);\n\nexport function infiniteLoop(\n body?: m.Matcher<t.Statement>,\n): m.Matcher<t.ForStatement | t.WhileStatement> {\n return m.or(\n m.forStatement(undefined, null, undefined, body),\n m.forStatement(undefined, truthyMatcher, undefined, body),\n m.whileStatement(truthyMatcher, body),\n );\n}\n\nexport function constKey(\n name?: string | m.Matcher<string>,\n): m.Matcher<t.Identifier | t.StringLiteral> {\n return m.or(m.identifier(name), m.stringLiteral(name));\n}\n\nexport function constObjectProperty(\n value?: m.Matcher<t.Expression>,\n): m.Matcher<t.ObjectProperty> {\n return m.or(\n m.objectProperty(m.identifier(), value, false),\n m.objectProperty(m.or(m.stringLiteral(), m.numericLiteral()), value),\n );\n}\n\nexport function anonymousFunction(\n params?:\n | m.Matcher<(t.Identifier | t.RestElement | t.Pattern)[]>\n | (\n | m.Matcher<t.Identifier>\n | m.Matcher<t.Pattern>\n | m.Matcher<t.RestElement>\n )[],\n body?: m.Matcher<t.BlockStatement>,\n): m.Matcher<t.FunctionExpression | t.ArrowFunctionExpression> {\n return m.or(\n m.functionExpression(null, params, body, false),\n m.arrowFunctionExpression(params, body),\n );\n}\n\nexport function iife(\n params?:\n | m.Matcher<(t.Identifier | t.RestElement | t.Pattern)[]>\n | (\n | m.Matcher<t.Identifier>\n | m.Matcher<t.Pattern>\n | m.Matcher<t.RestElement>\n )[],\n body?: m.Matcher<t.BlockStatement>,\n): m.Matcher<t.CallExpression> {\n return m.callExpression(anonymousFunction(params, body));\n}\n\n/**\n * Matches either `object.property` and `object[\"property\"]`\n */\nexport function constMemberExpression(\n object: string | m.Matcher<t.Expression>,\n property?: string | m.Matcher<string>,\n): m.Matcher<t.MemberExpression> {\n if (typeof object === \"string\") object = m.identifier(object);\n return m.or(\n m.memberExpression(object, m.identifier(property), false),\n m.memberExpression(object, m.stringLiteral(property), true),\n );\n}\n\nexport const undefinedMatcher = m.or(\n m.identifier(\"undefined\"),\n m.unaryExpression(\"void\", m.numericLiteral(0)),\n);\n\nexport const trueMatcher = m.or(\n m.booleanLiteral(true),\n m.unaryExpression(\"!\", m.numericLiteral(0)),\n m.unaryExpression(\"!\", m.unaryExpression(\"!\", m.numericLiteral(1))),\n m.unaryExpression(\"!\", m.unaryExpression(\"!\", m.arrayExpression([]))),\n);\n\nexport const falseMatcher = m.or(\n m.booleanLiteral(false),\n m.unaryExpression(\"!\", m.arrayExpression([])),\n);\n\nexport const truthyMatcher = m.or(trueMatcher, m.arrayExpression([]));\n\n/**\n * Starting at the parent path of the current `NodePath` and going up the\n * tree, return the first `NodePath` that causes the provided `matcher`\n * to return true, or `null` if the `matcher` never returns true.\n */\nexport function findParent<T extends t.Node>(\n path: NodePath,\n matcher: m.Matcher<T>,\n): NodePath<T> | null {\n return path.findParent((path) => matcher.match(path.node)) as\n | NodePath<T>\n | null;\n}\n\n/**\n * Starting at current `NodePath` and going up the tree, return the first\n * `NodePath` that causes the provided `matcher` to return true,\n * or `null` if the `matcher` never returns true.\n */\nexport function findPath<T extends t.Node>(\n path: NodePath,\n matcher: m.Matcher<T>,\n): NodePath<T> | null {\n return path.find((path) => matcher.match(path.node)) as NodePath<T> | null;\n}\n\n/**\n * Function expression matcher that captures the parameters\n * and allows them to be referenced in the body.\n */\nexport function createFunctionMatcher(\n params: number,\n body: (\n ...captures: m.Matcher<t.Identifier>[]\n ) => m.Matcher<t.Statement[]> | m.Matcher<t.Statement>[],\n): m.Matcher<t.FunctionExpression> {\n const captures = Array.from(\n { length: params },\n () => m.capture(m.anyString()),\n );\n\n return m.functionExpression(\n undefined,\n captures.map(m.identifier),\n m.blockStatement(\n body(...captures.map((c) => m.identifier(m.fromCapture(c)))),\n ),\n );\n}\n\n/**\n * `function <id>(<params>) { <body> }` or `var <id> = function(<params>) { <body> }`\n */\nexport function varFunctionOrDeclaration(\n id?: m.Matcher<t.Identifier>,\n params?:\n | m.Matcher<Array<t.Identifier | t.Pattern | t.RestElement>>\n | Array<\n | m.Matcher<t.Identifier>\n | m.Matcher<t.Pattern>\n | m.Matcher<t.RestElement>\n >,\n body?: m.Matcher<t.BlockStatement>,\n generator?: m.Matcher<boolean> | boolean,\n async?: m.Matcher<boolean> | boolean,\n): m.Matcher<t.FunctionDeclaration | t.VariableDeclaration> {\n return m.or(\n m.functionDeclaration(id, params, body, generator, async),\n m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n id,\n m.functionExpression(null, params, body, generator, async),\n ),\n ]),\n );\n}\n\n/**\n * Returns true if every reference is a member expression whose value is read\n */\nexport function isReadonlyObject(\n binding: Binding,\n memberAccess: m.Matcher<t.MemberExpression>,\n): boolean {\n // Workaround because sometimes babel treats the VariableDeclarator/binding itself as a violation\n if (!binding.constant && binding.constantViolations[0] !== binding.path) {\n return false;\n }\n\n function isPatternAssignment(member: NodePath<t.Node>) {\n const { parentPath } = member;\n return (\n // [obj.property] = [1];\n parentPath?.isArrayPattern() ||\n // ({ property: obj.property } = {})\n // ({ ...obj.property } = {})\n (parentPath?.parentPath?.isObjectPattern() &&\n (parentPath.isObjectProperty({ value: member.node }) ||\n parentPath.isRestElement())) ||\n // ([obj.property = 1] = [])\n // ({ property: obj.property = 1 } = {})\n parentPath?.isAssignmentPattern({ left: member.node })\n );\n }\n\n return binding.referencePaths.every(\n (path) =>\n // obj.property\n memberAccess.match(path.parent) &&\n // obj.property = 1\n !path.parentPath?.parentPath?.isAssignmentExpression({\n left: path.parent,\n }) &&\n // obj.property++\n !path.parentPath?.parentPath?.isUpdateExpression({\n argument: path.parent,\n }) &&\n // delete obj.property\n !path.parentPath?.parentPath?.isUnaryExpression({\n argument: path.parent,\n operator: \"delete\",\n }) &&\n !isPatternAssignment(path.parentPath!),\n );\n}\n\n/**\n * Checks if the binding is a temporary variable that is only assigned\n * once and has limited references. Often created by transpilers.\n *\n * Example with 1 reference to `_tmp`:\n * ```js\n * var _tmp; x[_tmp = y] || (x[_tmp] = z);\n * ```\n */\nexport function isTemporaryVariable(\n binding: Binding | undefined,\n references: number,\n kind: \"var\" | \"param\" = \"var\",\n): binding is Binding {\n return (\n binding !== undefined &&\n binding.references === references &&\n binding.constantViolations.length === 1 &&\n (kind === \"var\"\n ? binding.path.isVariableDeclarator() && binding.path.node.init === null\n : binding.path.listKey === \"params\" && binding.path.isIdentifier())\n );\n}\n\nexport class AnySubListMatcher<T> extends m.Matcher<T[]> {\n constructor(private readonly matchers: m.Matcher<T>[]) {\n super();\n }\n\n override matchValue(\n array: unknown,\n keys: readonly PropertyKey[],\n ): array is T[] {\n if (!Array.isArray(array)) return false;\n if (this.matchers.length === 0 && array.length === 0) return true;\n\n let j = 0;\n for (let i = 0; i < array.length; i++) {\n const matches = this.matchers[j].matchValue(array[i], [...keys, i]);\n\n if (matches) {\n j++;\n\n if (j === this.matchers.length) {\n return true;\n }\n }\n }\n\n return false;\n }\n}\n\n/**\n * Greedy matches elements in the specified order, allowing for any number of elements in between\n */\nexport function anySubList<T>(\n ...elements: Array<m.Matcher<T>>\n): m.Matcher<Array<T>> {\n return new AnySubListMatcher(elements);\n}\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { constMemberExpression } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"default-parameters\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const defaultExpression = m.capture(m.anyExpression());\n const index = m.capture(m.numericLiteral());\n const varName = m.capture(m.identifier());\n const varId = m.capture(\n m.or(m.identifier(), m.arrayPattern(), m.objectPattern()),\n );\n\n // Example: arguments.length > 0 && arguments[0] !== undefined\n const argumentCheckAnd = m.logicalExpression(\n \"&&\",\n m.binaryExpression(\n \">\",\n constMemberExpression(\"arguments\", \"length\"),\n index,\n ),\n m.binaryExpression(\n \"!==\",\n m.memberExpression(\n m.identifier(\"arguments\"),\n m.fromCapture(index),\n true,\n ),\n m.identifier(\"undefined\"),\n ),\n );\n // Example: arguments.length > 0 && arguments[0] !== undefined\n const argumentCheckOr = m.logicalExpression(\n \"||\",\n m.binaryExpression(\n \"<=\",\n constMemberExpression(\"arguments\", \"length\"),\n index,\n ),\n m.binaryExpression(\n \"===\",\n m.memberExpression(\n m.identifier(\"arguments\"),\n m.fromCapture(index),\n true,\n ),\n m.identifier(\"undefined\"),\n ),\n );\n // Example: arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n const defaultParam = m.variableDeclaration(undefined, [\n m.variableDeclarator(\n varId,\n m.conditionalExpression(\n argumentCheckAnd,\n m.memberExpression(\n m.identifier(\"arguments\"),\n m.fromCapture(index),\n true,\n ),\n defaultExpression,\n ),\n ),\n ]);\n // Example: arguments.length > 0 && arguments[0] !== undefined && arguments[0];\n const defaultFalseParam = m.variableDeclaration(undefined, [\n m.variableDeclarator(\n varId,\n m.logicalExpression(\n \"&&\",\n argumentCheckAnd,\n m.memberExpression(\n m.identifier(\"arguments\"),\n m.fromCapture(index),\n true,\n ),\n ),\n ),\n ]);\n // Example: arguments.length <= 0 || arguments[0] === undefined || arguments[0]\n const defaultTrueParam = m.variableDeclaration(undefined, [\n m.variableDeclarator(\n varId,\n m.logicalExpression(\n \"||\",\n argumentCheckOr,\n m.memberExpression(\n m.identifier(\"arguments\"),\n m.fromCapture(index),\n true,\n ),\n ),\n ),\n ]);\n\n // Example: if (x === undefined) { x = 1; }\n const defaultParamLoose = m.ifStatement(\n m.binaryExpression(\"===\", varName, m.identifier(\"undefined\")),\n m.blockStatement([\n m.expressionStatement(\n m.assignmentExpression(\n \"=\",\n m.fromCapture(varName),\n defaultExpression,\n ),\n ),\n ]),\n );\n // Example: var y = arguments.length > 1 ? arguments[1] : undefined;\n const normalParam = m.variableDeclaration(undefined, [\n m.variableDeclarator(\n varId,\n m.conditionalExpression(\n m.binaryExpression(\n \">\",\n constMemberExpression(\"arguments\", \"length\"),\n index,\n ),\n m.memberExpression(\n m.identifier(\"arguments\"),\n m.fromCapture(index),\n true,\n ),\n m.identifier(\"undefined\"),\n ),\n ),\n ]);\n\n return {\n VariableDeclaration: {\n exit(path) {\n const fn = path.parentPath.parent;\n if (!t.isFunction(fn) || path.key !== 0) return;\n\n const newParam = defaultParam.match(path.node)\n ? t.assignmentPattern(varId.current!, defaultExpression.current!)\n : defaultFalseParam.match(path.node)\n ? t.assignmentPattern(varId.current!, t.booleanLiteral(false))\n : defaultTrueParam.match(path.node)\n ? t.assignmentPattern(varId.current!, t.booleanLiteral(true))\n : normalParam.match(path.node)\n ? varId.current!\n : null;\n if (!newParam) return;\n\n for (let i = fn.params.length; i < index.current!.value; i++) {\n fn.params[i] = t.identifier(path.scope.generateUid(\"param\"));\n }\n fn.params[index.current!.value] = newParam;\n path.remove();\n this.changes++;\n },\n },\n IfStatement: {\n exit(path) {\n const fn = path.parentPath.parent;\n if (!t.isFunction(fn) || path.key !== 0) return;\n if (!defaultParamLoose.match(path.node)) return;\n\n const binding = path.scope.getOwnBinding(varName.current!.name);\n if (!binding) return;\n const isFunctionParam = binding.path.listKey === \"params\" &&\n binding.path.parent === fn;\n if (!isFunctionParam) return;\n\n binding.path.replaceWith(\n t.assignmentPattern(varName.current!, defaultExpression.current!),\n );\n path.remove();\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { isTemporaryVariable } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"logical-assignments\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const operator = m.capture(m.or(\"||\" as const, \"&&\" as const));\n\n const left = m.capture(m.or(m.identifier(), m.memberExpression()));\n const right = m.capture(m.anyExpression());\n // Example: left || (left = right)\n const idMatcher = m.logicalExpression(\n operator,\n left,\n m.assignmentExpression(\"=\", m.fromCapture(left), right),\n );\n\n const object = m.capture(m.anyExpression());\n const property = m.capture(m.anyExpression());\n const tmpVar = m.capture(m.identifier());\n const member = m.capture(\n m.memberExpression(m.fromCapture(tmpVar), m.fromCapture(property)),\n );\n // Example: var _tmp; (_tmp = x.y()).property || (_tmp.property = right);\n const memberMatcher = m.logicalExpression(\n operator,\n m.memberExpression(m.assignmentExpression(\"=\", tmpVar, object), property),\n m.assignmentExpression(\"=\", member, right),\n );\n\n // Example: var _tmp; x[_tmp = y()] || (x[_tmp] = z);\n const computedMemberMatcher = m.logicalExpression(\n operator,\n m.memberExpression(\n object,\n m.assignmentExpression(\"=\", tmpVar, property),\n true,\n ),\n m.assignmentExpression(\n \"=\",\n m.memberExpression(m.fromCapture(object), m.fromCapture(tmpVar), true),\n right,\n ),\n );\n\n const tmpVar2 = m.capture(m.identifier());\n // Example: var _tmp, _tmp2; (_tmp = x)[_tmp2 = y] || (_tmp[_tmp2] = z);\n const multiComputedMemberMatcher = m.logicalExpression(\n operator,\n m.memberExpression(\n m.assignmentExpression(\"=\", tmpVar, object),\n m.assignmentExpression(\"=\", tmpVar2, property),\n true,\n ),\n m.assignmentExpression(\n \"=\",\n m.memberExpression(m.fromCapture(tmpVar), m.fromCapture(tmpVar2), true),\n right,\n ),\n );\n\n return {\n LogicalExpression: {\n exit(path) {\n if (idMatcher.match(path.node)) {\n path.replaceWith(\n t.assignmentExpression(\n `${operator.current!}=`,\n left.current!,\n right.current!,\n ),\n );\n this.changes++;\n } else if (memberMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n if (!isTemporaryVariable(binding, 1)) return;\n\n binding.path.remove();\n member.current!.object = object.current!;\n path.replaceWith(\n t.assignmentExpression(\n `${operator.current!}=`,\n member.current!,\n right.current!,\n ),\n );\n this.changes++;\n } else if (computedMemberMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n if (!isTemporaryVariable(binding, 1)) return;\n\n binding.path.remove();\n path.replaceWith(\n t.assignmentExpression(\n `${operator.current!}=`,\n t.memberExpression(object.current!, property.current!, true),\n right.current!,\n ),\n );\n this.changes++;\n } else if (multiComputedMemberMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n const binding2 = path.scope.getBinding(tmpVar2.current!.name);\n if (\n !isTemporaryVariable(binding, 1) ||\n !isTemporaryVariable(binding2, 1)\n ) {\n return;\n }\n\n binding.path.remove();\n binding2.path.remove();\n path.replaceWith(\n t.assignmentExpression(\n `${operator.current!}=`,\n t.memberExpression(object.current!, property.current!, true),\n right.current!,\n ),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { isTemporaryVariable } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"nullish-coalescing-assignment\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const tmpVar = m.capture(m.identifier());\n const leftId = m.capture(m.identifier());\n const property = m.capture(m.identifier());\n const right = m.capture(m.anyExpression());\n const computed = m.capture<boolean>(m.anything());\n // Example (Babel): var tmp; (tmp = left).b ?? (tmp.b = c);\n const memberMatcher = m.logicalExpression(\n \"??\",\n m.memberExpression(\n m.assignmentExpression(\"=\", tmpVar, leftId),\n property,\n computed,\n ),\n m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.fromCapture(tmpVar),\n m.fromCapture(property),\n computed,\n ),\n right,\n ),\n );\n\n // Example (Babel): left ?? (left = right);\n const left = m.capture(m.or(m.identifier(), m.memberExpression()));\n const simpleMatcher = m.logicalExpression(\n \"??\",\n left,\n m.assignmentExpression(\"=\", m.fromCapture(left), right),\n );\n\n return {\n LogicalExpression: {\n exit(path) {\n if (memberMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n if (!isTemporaryVariable(binding, 1)) return;\n\n binding.path.remove();\n path.replaceWith(\n t.assignmentExpression(\n \"??=\",\n t.memberExpression(\n leftId.current!,\n property.current!,\n computed.current,\n ),\n right.current!,\n ),\n );\n this.changes++;\n } else if (simpleMatcher.match(path.node)) {\n path.replaceWith(\n t.assignmentExpression(\"??=\", left.current!, right.current!),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { isTemporaryVariable } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"nullish-coalescing\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const tmpVar = m.capture(m.identifier());\n const left = m.capture(m.anyExpression());\n const right = m.capture(m.anyExpression());\n // Example (Babel): var _tmp; (_tmp = left) !== null && _tmp !== undefined ? _tmp : right;\n const idMatcher = m.conditionalExpression(\n m.logicalExpression(\n \"&&\",\n m.binaryExpression(\n \"!==\",\n m.assignmentExpression(\"=\", tmpVar, left),\n m.nullLiteral(),\n ),\n m.binaryExpression(\n \"!==\",\n m.fromCapture(tmpVar),\n m.identifier(\"undefined\"),\n ),\n ),\n m.fromCapture(tmpVar),\n right,\n );\n\n const idLooseMatcher = m.conditionalExpression(\n m.binaryExpression(\n \"!=\",\n m.assignmentExpression(\"=\", tmpVar, left),\n m.nullLiteral(),\n ),\n m.fromCapture(tmpVar),\n right,\n );\n\n // Example (SWC/esbuild): left != null ? left : (left = right);\n // Example (TS): left !== null && left !== undefined ? left : (left = right);\n const simpleIdMatcher = m.conditionalExpression(\n m.or(\n m.logicalExpression(\n \"&&\",\n m.binaryExpression(\"!==\", left, m.nullLiteral()),\n m.binaryExpression(\n \"!==\",\n m.fromCapture(left),\n m.identifier(\"undefined\"),\n ),\n ),\n m.binaryExpression(\"!=\", left, m.nullLiteral()),\n ),\n m.fromCapture(left),\n right,\n );\n\n const iifeMatcher = m.callExpression(\n m.arrowFunctionExpression(\n [m.fromCapture(tmpVar)],\n m.anyExpression(),\n false,\n ),\n [],\n );\n\n return {\n ConditionalExpression: {\n exit(path) {\n if (idMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n\n if (\n iifeMatcher.match(path.parentPath.parent) &&\n isTemporaryVariable(binding, 2, \"param\")\n ) {\n path.parentPath.parentPath!.replaceWith(\n t.logicalExpression(\"??\", left.current!, right.current!),\n );\n this.changes++;\n } else if (isTemporaryVariable(binding, 2, \"var\")) {\n binding.path.remove();\n path.replaceWith(\n t.logicalExpression(\"??\", left.current!, right.current!),\n );\n this.changes++;\n }\n } else if (idLooseMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n if (!isTemporaryVariable(binding, 1)) return;\n\n binding.path.remove();\n path.replaceWith(\n t.logicalExpression(\"??\", left.current!, right.current!),\n );\n this.changes++;\n } else if (simpleIdMatcher.match(path.node)) {\n path.replaceWith(\n t.logicalExpression(\"??\", left.current!, right.current!),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { isTemporaryVariable } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"optional-chaining\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const object = m.capture(m.anyExpression());\n const member = m.capture(m.memberExpression(m.fromCapture(object)));\n // Example (TS): object === null || object === undefined ? undefined : object.property;\n const simpleMatcher = m.conditionalExpression(\n m.logicalExpression(\n \"||\",\n m.binaryExpression(\"===\", object, m.nullLiteral()),\n m.binaryExpression(\n \"===\",\n m.fromCapture(object),\n m.identifier(\"undefined\"),\n ),\n ),\n m.identifier(\"undefined\"),\n member,\n );\n\n const tmpVar = m.capture(m.identifier());\n const tmpMember = m.capture(m.memberExpression(m.fromCapture(tmpVar)));\n // Example (Babel): var _tmp; (_tmp = object) === null || _tmp === undefined ? undefined : _tmp.property;\n const tmpMatcher = m.conditionalExpression(\n m.logicalExpression(\n \"||\",\n m.binaryExpression(\n \"===\",\n m.assignmentExpression(\"=\", tmpVar, object),\n m.nullLiteral(),\n ),\n m.binaryExpression(\n \"===\",\n m.fromCapture(tmpVar),\n m.identifier(\"undefined\"),\n ),\n ),\n m.identifier(\"undefined\"),\n tmpMember,\n );\n\n return {\n ConditionalExpression: {\n exit(path) {\n if (simpleMatcher.match(path.node)) {\n path.replaceWith(\n t.optionalMemberExpression(\n object.current!,\n member.current!.property as t.Expression,\n member.current!.computed,\n true,\n ),\n );\n this.changes++;\n } else if (tmpMatcher.match(path.node)) {\n const binding = path.scope.getBinding(tmpVar.current!.name);\n if (!isTemporaryVariable(binding, 2)) return;\n\n binding.path.remove();\n path.replaceWith(\n t.optionalMemberExpression(\n object.current!,\n tmpMember.current!.property as t.Expression,\n tmpMember.current!.computed,\n true,\n ),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { constMemberExpression } from \"../ast-utils/matcher.ts\";\n\n// https://github.com/babel/babel/pull/5791\n// https://github.com/babel/babel/blob/cce807f1eb638ee3030112dc190cbee032760888/packages/babel-plugin-transform-template-literals/src/index.ts\n\n// TODO: option ignoreToPrimitiveHint (uses `+` instead of concat)\n\nfunction escape(str: string) {\n return (\n str\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll(\"`\", \"\\\\`\")\n .replaceAll(\"$\", \"\\\\$\")\n .replaceAll(\"\\0\", \"\\\\0\")\n .replaceAll(\"\\b\", \"\\\\b\")\n .replaceAll(\"\\f\", \"\\\\f\")\n // .replaceAll('\\n', '\\\\n') // not escaped because multiline strings are preferred\n .replaceAll(\"\\r\", \"\\\\r\")\n .replaceAll(\"\\t\", \"\\\\t\")\n .replaceAll(\"\\v\", \"\\\\v\")\n );\n}\n\nfunction push(template: t.TemplateLiteral, value: t.Expression) {\n if (value.type === \"StringLiteral\") {\n const lastQuasi = template.quasis.at(-1)!;\n lastQuasi.value.raw += escape(value.value);\n } else if (value.type === \"TemplateLiteral\") {\n const lastQuasi = template.quasis.at(-1)!;\n const firstQuasi = value.quasis[0];\n lastQuasi.value.raw += firstQuasi.value.raw;\n template.expressions.push(...value.expressions);\n template.quasis.push(...value.quasis.slice(1));\n } else {\n template.expressions.push(value);\n template.quasis.push(t.templateElement({ raw: \"\" }));\n }\n}\n\nfunction unshift(template: t.TemplateLiteral, value: t.Expression) {\n if (value.type === \"StringLiteral\") {\n const firstQuasi = template.quasis[0];\n firstQuasi.value.raw = escape(value.value) + firstQuasi.value.raw;\n } else {\n template.expressions.unshift(value);\n template.quasis.unshift(t.templateElement({ raw: \"\" }));\n }\n}\n\nexport default {\n name: \"template-literals\",\n tags: [\"unsafe\"],\n visitor() {\n const string = m.capture(m.or(m.stringLiteral(), m.templateLiteral()));\n const concatMatcher = m.callExpression(\n constMemberExpression(string, \"concat\"),\n m.arrayOf(m.anyExpression()),\n );\n\n return {\n BinaryExpression: {\n exit(path) {\n if (path.node.operator !== \"+\") return;\n\n if (t.isTemplateLiteral(path.node.left)) {\n push(path.node.left, path.node.right);\n path.replaceWith(path.node.left);\n this.changes++;\n } else if (\n t.isTemplateLiteral(path.node.right) &&\n t.isExpression(path.node.left)\n ) {\n unshift(path.node.right, path.node.left);\n path.replaceWith(path.node.right);\n this.changes++;\n }\n },\n },\n CallExpression: {\n exit(path) {\n if (concatMatcher.match(path.node)) {\n const template = t.templateLiteral(\n [t.templateElement({ raw: \"\" })],\n [],\n );\n push(template, string.current!);\n\n for (const arg of path.node.arguments) {\n push(template, arg as t.Expression);\n }\n\n path.replaceWith(template);\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import { mergeTransforms } from \"../ast-utils/transform.ts\";\nimport defaultParameters from \"./default-parameters.ts\";\nimport logicalAssignments from \"./logical-assignments.ts\";\nimport nullishCoalescingAssignment from \"./nullish-coalescing-assignment.ts\";\nimport nullishCoalescing from \"./nullish-coalescing.ts\";\nimport optionalChaining from \"./optional-chaining.ts\";\nimport templateLiterals from \"./template-literals.ts\";\n\nexport default mergeTransforms({\n name: \"transpile\",\n tags: [\"safe\"],\n transforms: [\n defaultParameters,\n logicalAssignments,\n nullishCoalescingAssignment,\n nullishCoalescing,\n optionalChaining,\n templateLiterals,\n ],\n});\n", "export * from \"npm:@babel/template@^8.0.0-rc.5\";\nexport { default } from \"npm:@babel/template@^8.0.0-rc.5\";\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\nconst mod = m.capture(m.identifier());\nconst exp = m.capture(m.identifier());\nconst req = m.capture(m.identifier());\n\n/** Required hack for typings to work. */\nconst functionExpr = (args: Array<m.Matcher<t.Identifier>>) =>\n m.or(\n m.functionExpression(\n null,\n args,\n m.blockStatement(),\n false,\n false,\n ),\n m.arrowFunctionExpression(\n args,\n m.blockStatement(),\n false,\n ),\n );\n\n/** Match a webpack module chunk, optionally by ID. */\nfunction webpackChunk(id?: number) {\n return m.objectProperty(\n m.numericLiteral(id), // Module ID\n m.or( // Module body\n functionExpr([]),\n functionExpr([mod]),\n functionExpr([mod, exp]),\n functionExpr([mod, exp, req]),\n ),\n );\n}\n\n/** Match a rspack module chunk, optionally by ID. */\nfunction rspackChunk(id?: number) {\n return m.objectMethod(\n m.matcher((x) => x === \"method\"),\n m.numericLiteral(id),\n m.or(\n m.tupleOf(),\n m.tupleOf(mod),\n m.tupleOf(mod, exp),\n m.tupleOf(mod, exp, req),\n ),\n m.anything(),\n false,\n false,\n false,\n );\n}\n\n/** Match a module chunk, optionally by ID. */\nexport function chunk(id?: number) {\n return m.or(\n webpackChunk(id),\n rspackChunk(id),\n );\n}\n\n/** Match a list of module chunks. */\nexport const chunks = m.objectExpression(m.anyList(m.oneOrMore(chunk())));\n\n/** Match any module chunk. */\nexport default chunk();\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type { Transform } from \"../../webcrack/ast-utils/transform.ts\";\nimport tmpl from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport chunk from \"../../utils/matchers/chunk.ts\";\nimport { assert } from \"jsr:@std/assert@^1.0.19\";\n\nconst entry = m.capture(m.numericLiteral());\nconst requireEntry = m.callExpression(\n m.identifier(\"_require\"),\n [entry],\n);\nconst main = m.callExpression(\n m.memberExpression(\n m.or(\n requireEntry,\n m.identifier(),\n ),\n m.identifier(\"main\"),\n false,\n ),\n [m.booleanLiteral(true)],\n);\nconst inlinedMain = m.expressionStatement(m.callExpression(\n m.identifier(),\n [m.booleanLiteral(true)],\n));\nconst verifyClient = m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.identifier(\"exports\"),\n m.identifier(\"verifyClient\"),\n ),\n m.or(\n m.functionExpression(\n null,\n [m.identifier()],\n ),\n m.identifier(),\n ),\n);\nconst inlinedVerifyClient = m.callExpression(\n m.functionExpression(\n null,\n [m.identifier()],\n m.blockStatement(),\n false,\n false,\n ),\n [m.memberExpression(\n m.identifier(),\n m.identifier(\"clientVerification\"),\n false,\n )],\n);\nconst invalidClient = m.memberExpression(\n m.memberExpression(\n m.identifier(),\n m.identifier(\"EventName\"),\n ),\n m.identifier(\"LANGUAGE_SERVER_INVALID_CLIENT\"),\n);\nconst setNoDeprecation = m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.identifier(\"process\"),\n m.identifier(\"noDeprecation\"),\n false,\n ),\n m.booleanLiteral(true),\n));\nconst environChecks = m.arrayExpression([\n m.stringLiteral(\"ELECTRON_RUN_AS_NODE\"),\n m.stringLiteral(\"VSCODE_NLS_CONFIG\"),\n]);\nconst setStackTraceLimit = m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.identifier(\"Error\"),\n m.identifier(\"stackTraceLimit\"),\n false,\n ),\n m.numericLiteral(),\n));\n\n// TODO: remove telemetry\n// See `vendor.bundle.js` & npm.im/applicationinsights\n/** Remove unwanted features e.g. License check and Telemetry */\nexport default {\n name: \"anti-feature\",\n tags: [\"unsafe\"],\n visitor: () => ({\n CallExpression: {\n exit($) {\n if (inlinedVerifyClient.match($.node)) {\n $.remove();\n this.changes++;\n return;\n }\n\n if (!main.match($.node)) {\n return;\n }\n\n const $callee = $.get(\"callee\");\n if ($callee.isMemberExpression()) {\n const $main = $callee.get(\"object\");\n let $path: NodePath = $main;\n if ($main.isIdentifier()) {\n const $binding = $.scope.getBinding($main.node.name);\n if (!$binding) {\n return;\n }\n\n $path = $binding.path;\n }\n\n $path.traverse({\n CallExpression: {\n exit($call) {\n requireEntry.match($call.node);\n },\n },\n });\n }\n\n t.assertNumericLiteral(entry.current);\n\n const _target = $.findParent((p) => chunk.match(p.node));\n if (!_target) {\n throw new Error(\"Could not find module chunk\");\n }\n\n let $target: NodePath<t.Function>;\n\n if (_target.isObjectProperty()) {\n const $func = _target.get(\"value\");\n assert($func.isFunction());\n $target = $func;\n } else {\n const $func = _target;\n assert($func.isObjectMethod());\n $target = $func;\n }\n\n $target.get(\"body\").replaceWith(tmpl.statement.ast`{\n\t\t\t\t\trequire(${entry.current}).main(Boolean(process.env[\"VSCODE_NLS_CONFIG\"]));\n\t\t\t\t}`);\n\n $.stop();\n this.changes++;\n },\n },\n AssignmentExpression: {\n exit($) {\n if (!verifyClient.match($.node)) {\n return;\n }\n\n const $value = $.get(\"right\");\n let $function: NodePath<t.BlockStatement>;\n\n if ($value.isIdentifier()) {\n const $binding = $.scope.getBinding($value.node.name);\n if (!$binding) {\n return;\n }\n\n const $path = $binding.path;\n assert($path.isFunction());\n const $body = $path.get(\n \"body\",\n );\n assert($body.isBlockStatement());\n $function = $body;\n } else if ($value.isFunction()) {\n const $body = $value.get(\n \"body\",\n );\n assert($body.isBlockStatement());\n $function = $body;\n } else {\n return;\n }\n\n $function.replaceWith(tmpl.statement.ast`{\n\t\t\t\t\treturn;\n\t\t\t\t}`);\n\n this.changes++;\n },\n },\n MemberExpression: {\n exit($) {\n if (!invalidClient.match($.node)) {\n return;\n }\n\n const _target = $.findParent((p) => p.isIfStatement());\n if (!_target) {\n throw new Error(\"Could not find parent if\");\n }\n\n const $target = _target;\n assert($target.isIfStatement());\n\n $target.remove();\n this.changes++;\n },\n },\n ArrayExpression: {\n exit($) {\n if (!environChecks.match($.node)) {\n return;\n }\n\n const _chunk = $.findParent((p) => chunk.match(p.node));\n if (!_chunk) {\n throw new Error(\"verifyClient not in a valid chunk\");\n }\n\n let $target: NodePath<t.Function>;\n\n if (_chunk.isObjectProperty()) {\n const $func = _chunk.get(\"value\");\n assert($func.isFunction());\n $target = $func;\n } else {\n const $func = _chunk;\n assert($func.isObjectMethod());\n $target = $func;\n }\n\n const _body = $target.get(\"body\");\n assert(_body.isBlockStatement());\n\n const $body = _body.get(\"body\");\n const _invokeMain = $body.at(-1);\n if (_invokeMain === undefined || !inlinedMain.match(_invokeMain.node)) {\n return;\n }\n\n const _setNoDeprecation = $body.at(-4)!;\n const _check = $body.at(-3)!;\n const _setStackTraceLimit = $body.at(-2)!;\n\n if (\n !setNoDeprecation.match(_setNoDeprecation.node) ||\n !_check.isIfStatement() ||\n !setStackTraceLimit.match(_setStackTraceLimit.node)\n ) {\n // Theoretically the patch could success, but we want to be pedantic\n throw new Error(\"Unfamillar entrypoint chunk\");\n }\n\n _setNoDeprecation.remove();\n _check.remove();\n _setStackTraceLimit.remove();\n\n const $invokeMain = _invokeMain.get(\n \"expression\",\n );\n assert($invokeMain.isCallExpression());\n\n const $hasVSCodeExtension = $invokeMain.get(\"arguments.0\");\n $hasVSCodeExtension.replaceWith(\n tmpl.expression.ast`Boolean(process.env[\"VSCODE_NLS_CONFIG\"])`,\n );\n\n this.changes++;\n },\n },\n }),\n} satisfies Transform;\n", "import nodeCrypto from \"node:crypto\";\nimport { decodeHex, encodeHex } from \"jsr:@std/encoding@^1.0.10\";\n\n/* 🥺 don't sue me\n ⠁⠒⠲⠤⠤⠀⢀⣀⣀⡀⠀⠀⠀⠀pwease…⠀⠀⢀⡠⠔⠈\n ⠀⠀⠀⠀⠀⣀⣠⣤⢤⣉⣛⣿⣿⣿⣿⣾⣧⣻⣻⠛⣁⣀⣦⠥⣀⡀\n ⠀⢀⣤⢶⣫⣵⣾⣶⣾⣭⣿⣿⣿⣿⣿⣿⢿⣿⣵⣿⣿⣿⣿⣿⣷⣮⣷\n ⡴⢟⣵⣿⣿⣿⣿⣿⢿⣍⣘⢿⣿⣿⣿⢫⣕⢮⡿⣿⣿⣿⣿⣿⣿⣿⢿\n ⣏⠻⢿⣿⣿⣿⣿⢇⣿⣿⣿⡾⣿⣿⣿⢿⣿⢸⣿⣸⣿⢻⡉⡉⠓⠛⠉\n ⠙⠳⢮⣭⣿⠟⣿⢸⣿⣏⠿⣣⡿⠿⣿⣜⣋⣾⣿⢛⢿⡟⣵⠁\n ⠀⠀⠀⠸⣦⡟⣿⣳⣻⣿⣿⣿⣿⠿⣿⢿⣿⣿⣿⣷⣿⠷⡛\n ⠀⠀⠀⠀⠻⣧⣭⣿⠽⠛⠿⠿⢾⣾⣿⡟⠛⠛⠉⠚⠉⢩⠁\n ⠀⠀⠀⠀⠀⠀⠀⠸⣦⠀⡐⠀⠺⠿⠿⠃⢀⠂⠄⠀⠁⠓⡄\n ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⡆👉⠀⠀👈⣰⣽⠐⠚⠁⠀ */\n\nexport class CryptoHelper {\n static readonly #defaultSalt = \"SEE\\u0020\\u0020LICENSE.txt\";\n static readonly #defaultLic = [ // The \"etilqs\" trick\n \",oidutS lausiV tfosorciM htiw ylno erawtfos eht fo seipoc fo rebmun yna esu dna llatsni yam uoY\",\n \"stcudorp tfosorciM rosseccus dna ,revreS noitadnuoF maeT ,spOveD eruzA ,edoC oidutS lausiV ,caM rof oidutS lausiV\",\n \".snoitacilppa ruoy tset dna poleved ot )”secivreS dna stcudorP oidutS lausiV“ eht ,ylevitcelloc( secivres dna\",\n \".sthgir rehto lla sevreser tfosorciM .erawtfos eht esu ot sthgir emos uoy sevig ylno tnemeerga sihT .dlos ton ,desnecil si erawtfos ehT\",\n \":ton yam uoY\",\n \";syaw niatrec ni ti esu ot uoy wolla ylno taht erawtfos eht ni snoitatimil lacinhcet yna dnuora krow\",\n \",erawtfos eht rof edoc ecruos eht evired ot tpmetta esiwrehto ro ,erawtfos eht elbmessasid ro elipmoced ,reenigne esrever\",\n \";erawtfos eht ni dedulcni eb yam taht stnenopmoc ecruos nepo niatrec fo esu gninrevog smret gnisnecil ytrap driht yb deriuqer tnetxe eht ot dna tpecxe\",\n \";erawtfos eht ni sreilppus sti ro tfosorciM fo seciton yna yfidom ro ,kcolb ,eziminim ,evomer\",\n \"ro ;erawlam etagaporp ro etaerc ot ro wal eht tsniaga si taht yaw yna ni erawtfos eht esu\",\n \",)evoba smret eht ot tcejbus ,edoc elbatubirtsid yna rof tpecxe( erawtfos eht esael ro ,etubirtsid ,hsilbup ,erahs\",\n \".ytrap driht yna ot tnemeerga siht ro erawtfos eht refsnart ro ,esu ot srehto rof gnireffo enola-dnats a sa erawtfos eht edivorp\",\n ]\n .map((x) => [...x].toReversed().join(\"\"))\n .join(\" \");\n\n key: CryptoKey;\n iv: Uint8Array<ArrayBuffer>;\n\n constructor(key: CryptoKey, iv: Uint8Array<ArrayBuffer>) {\n this.key = key;\n this.iv = iv;\n }\n\n static async from(\n lic: string = CryptoHelper.#defaultLic,\n salt: string = CryptoHelper.#defaultSalt,\n ) {\n return new CryptoHelper(\n await crypto.subtle.importKey(\n \"raw\",\n new Uint8Array(nodeCrypto.scryptSync(lic, salt, 24)),\n \"AES-CBC\",\n false,\n [\"encrypt\", \"decrypt\"],\n ),\n new Uint8Array(new TextEncoder().encode(salt)),\n );\n }\n\n async decrypt(ct: string) {\n const pt = await crypto.subtle.decrypt(\n { name: \"AES-CBC\", iv: this.iv },\n this.key,\n decodeHex(ct),\n );\n return new TextDecoder().decode(pt);\n }\n\n async encrypt(pt: string) {\n const ct = await crypto.subtle.encrypt(\n { name: \"AES-CBC\", iv: this.iv },\n this.key,\n new TextEncoder().encode(pt),\n );\n return encodeHex(ct);\n }\n}\n", "import type {\n AsyncTransform,\n Transform,\n} from \"../../webcrack/ast-utils/transform.ts\";\nimport traverse, { type NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { CryptoHelper } from \"../../utils/crypto.ts\";\nimport { assert, assertExists, assertInstanceOf } from \"jsr:@std/assert@^1.0.19\";\n\n/** Find call to `scryptSync`. */\nconst scrypt = m.callExpression(\n m.memberExpression(\n m.identifier(),\n m.identifier(\"scryptSync\"),\n false,\n ),\n [\n // Password\n m.or(\n m.memberExpression(\n m.identifier(),\n m.identifier(\"licenseErrorText\"),\n false,\n ),\n m.identifier(),\n ),\n // Salt\n m.identifier(),\n m.numericLiteral(24),\n ],\n);\n\n/** Find `exports.licenseErrorText`. */\nconst licenseText = m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.identifier(),\n m.identifier(\"licenseErrorText\"),\n ),\n m.callExpression(\n m.memberExpression(\n m.arrayExpression(m.anyList(m.oneOrMore(m.stringLiteral()))),\n m.identifier(\"join\"),\n false,\n ),\n [m.stringLiteral(\" \")],\n ),\n);\n\n/** Find `crypto.createDecipheriv()`. */\nconst createDecipheriv = m.callExpression(\n m.memberExpression(m.identifier(), m.identifier(\"createDecipheriv\"), false),\n [m.stringLiteral(\"aes-192-cbc\"), m.identifier(), m.identifier()],\n);\n\n/** Find `.decrypt(\"<encoded string>\")`. */\nconst encryptedString = m.callExpression(\n m.or(\n m.memberExpression(\n m.identifier(),\n m.identifier(\"decrypt\"),\n false,\n ),\n m.identifier(\"__delance_decrypt\"),\n ),\n [m.stringLiteral()],\n);\n\nexport function createCryptoHelper(ast: t.Node): Promise<CryptoHelper> {\n let salt: string | undefined = undefined;\n let key: string | undefined = undefined;\n\n traverse(ast, {\n CallExpression: {\n exit($) {\n if (salt !== null || !scrypt.match($.node)) {\n return;\n }\n\n const $saltId = $.get(\"arguments.1\");\n assert($saltId.isIdentifier());\n\n const _saltDecl = $.scope.getBinding($saltId.node.name)?.path;\n if (!_saltDecl) {\n throw new Error(\"Could not find declaration\");\n }\n\n const $saltDecl = _saltDecl;\n assert($saltDecl.isVariableDeclarator());\n\n const $salt = $saltDecl.get(\"init\");\n if (!$salt.isStringLiteral()) {\n throw new Error(\"Salt not initialized\");\n }\n\n salt = $salt.node.value;\n\n if (key !== null) {\n return;\n }\n\n const $keyId = $.get(\"arguments.0\");\n if ($keyId.isIdentifier()) {\n const _keyDecl = $.scope.getBinding($keyId.node.name)?.path;\n if (!_keyDecl) {\n throw new Error(\"Could not find declaration\");\n }\n\n const $keyDecl = _keyDecl;\n assert($keyDecl.isVariableDeclarator());\n\n const $key = $keyDecl.get(\"init\");\n if ($key.isStringLiteral()) {\n key = $key.node.value;\n }\n }\n },\n },\n AssignmentExpression: {\n exit($) {\n if (key || !licenseText.match($.node)) {\n return;\n }\n\n const $strs = $.get(\"right.callee.object.elements\");\n assertInstanceOf($strs, Array);\n key = $strs.map(($_) => {\n assert($_.isStringLiteral());\n return $_.node.value;\n }).join(\" \");\n },\n },\n });\n\n return CryptoHelper.from(key, salt);\n}\n\nexport const collectDecryptCalls: Transform = {\n name: \"string-aes-collect\",\n tags: [\"safe\"],\n visitor() {\n return {\n CallExpression: {\n exit($) {\n if (createDecipheriv.match($.node)) {\n const _function = $.findParent((path) =>\n path.isFunctionDeclaration()\n );\n if (_function === null) {\n return;\n }\n\n const $function = _function;\n assert($function.isFunctionDeclaration());\n\n if ($function.node.params.length !== 1) {\n throw new Error(\"unexcepted location of createDecipheriv\");\n }\n\n const $id = $function.get(\"id\");\n assert($id.isIdentifier());\n\n $function.scope.rename($id.node.name, \"__delance_decrypt\");\n this.changes++;\n }\n },\n },\n };\n },\n};\n\nexport const decryptStrings: AsyncTransform<CryptoHelper> = {\n name: \"string-aes-decrypt\",\n tags: [\"safe\"],\n async run(ast, state, helper) {\n assertExists(helper);\n\n const calls: NodePath<t.CallExpression>[] = [];\n\n traverse(\n ast,\n {\n CallExpression: {\n exit($) {\n if (!encryptedString.match($.node)) {\n return;\n }\n\n const $string = $.get(\"arguments.0\");\n assert($string.isStringLiteral());\n\n calls.push($);\n },\n },\n },\n );\n\n for (const call of calls) {\n const $string = call.get(\"arguments.0\");\n assert($string.isStringLiteral());\n\n call.replaceWith(\n t.stringLiteral(await helper.decrypt($string.node.value)),\n );\n }\n state.changes += calls.length;\n },\n};\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport { applyTransform as webcrackApplyTransform } from \"../../webcrack/ast-utils/transform.ts\";\nimport transpile from \"../../webcrack/transpile/mod.ts\";\nimport { applyTransform, applyTransformAsync } from \"../../utils/ast.ts\";\nimport antifeature from \"./antifeature.ts\";\nimport {\n collectDecryptCalls,\n createCryptoHelper,\n decryptStrings,\n} from \"./stringaes.ts\";\n\n/**\n * Delance specific transforms.\n */\nexport default async function transform(ast: t.Node) {\n applyTransform(ast, collectDecryptCalls);\n await applyTransformAsync(ast, decryptStrings, await createCryptoHelper(ast));\n applyTransform(ast, antifeature);\n webcrackApplyTransform(ast, transpile);\n\n return ast;\n}\n", "import type { Transform } from \"../../webcrack/ast-utils/transform.ts\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\n\n/**\n * Simplify function calls between modules that discard reference bindings\n *\n * @example\n * `(0, someModule.someFunction)(args)` -> `someModule.someFunction(args)`\n *\n * @link <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_operator#discarding_reference_binding>\n * @link <https://github.com/pionxzh/wakaru/blob/main/packages/unminify/src/transformations/un-indirect-call.ts>\n */\nexport default {\n name: \"indirect-call\",\n tags: [\"unsafe\"],\n visitor: () => ({\n CallExpression: {\n exit($) {\n const { callee, arguments: _arguments } = $.node;\n if (!t.isSequenceExpression(callee)) {\n return;\n }\n\n const exprs = [...callee.expressions];\n const _function = exprs.pop();\n if (!t.isMemberExpression(_function)) {\n return;\n }\n\n // Ensure no side effects in the sequence\n if (exprs.every((expr) => t.isPureish(expr))) {\n $.replaceWith(t.callExpression(_function, _arguments));\n this.changes++;\n }\n },\n },\n }),\n} satisfies Transform;\n", "import tmpl from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\nexport const __createBinding = tmpl.expression.ast`\n(this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n\tif (k2 === undefined) k2 = k;\n\tvar desc = Object.getOwnPropertyDescriptor(m, k);\n\tif (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n\t\tdesc = { enumerable: true, get: function() { return m[k]; } };\n\t}\n\tObject.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n\tif (k2 === undefined) k2 = k;\n\to[k2] = m[k];\n}))\n`;\n\nconst obj = m.capture(m.identifier());\nconst mod = m.capture(m.identifier());\nconst k = m.capture(m.identifier());\nconst k2 = m.capture(m.identifier());\nconst desc = m.capture(m.identifier());\nconst descMiddle = m.capture(m.identifier());\n\nconst descObj = m.objectExpression([\n m.objectProperty(\n m.identifier(\"enumerable\"),\n m.booleanLiteral(true),\n ),\n m.objectProperty(\n m.identifier(\"get\"),\n m.functionExpression(\n null,\n [],\n m.blockStatement([\n m.returnStatement(m.memberExpression(\n m.fromCapture(mod),\n m.fromCapture(k),\n true,\n )),\n ]),\n ),\n ),\n]);\n\nconst cond = m.conditionalExpression(\n m.binaryExpression(\n \"in\",\n m.stringLiteral(\"get\"),\n m.fromCapture(desc),\n ),\n m.unaryExpression(\n \"!\",\n m.memberExpression(\n m.fromCapture(mod),\n m.identifier(\"__esModule\"),\n false,\n ),\n ),\n m.logicalExpression(\n \"||\",\n m.memberExpression(\n m.fromCapture(desc),\n m.identifier(\"writable\"),\n false,\n ),\n m.memberExpression(\n m.fromCapture(desc),\n m.identifier(\"configurable\"),\n false,\n ),\n ),\n);\n\n/**\n * Match `__createBinding`.\n * @example\n * ```javascript\n * var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n * \tif (k2 === undefined) k2 = k;\n * \tvar desc = Object.getOwnPropertyDescriptor(m, k);\n * \tif (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n * \t\tdesc = { enumerable: true, get: function() { return m[k]; } };\n * \t}\n * \tObject.defineProperty(o, k2, desc);\n * }) : (function(o, m, k, k2) {\n * \tif (k2 === undefined) k2 = k;\n * \to[k2] = m[k];\n * }));\n * ```\n * @example\n * ```javascript\n * var _v183 = this && this.__createBinding || (Object.create ? function (_a171, _a172, _a173, _a174) {\n * \tif (_a174 === undefined) {\n * \t\t_a174 = _a173;\n * \t}\n * \tObject.defineProperty(_a171, _a174, {\n * \t\tenumerable: true,\n * \t\tget: function () {\n * \t\t\treturn _a172[_a173];\n * \t\t}\n * \t});\n * } : function (_a175, _a176, _a177, _a178) {\n * \tif (_a178 === undefined) {\n * \t\t_a178 = _a177;\n * \t}\n * \t_a175[_a178] = _a176[_a177];\n * });\n * ```\n */\nexport default m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n m.identifier(),\n m.logicalExpression(\n \"||\",\n m.logicalExpression(\n \"&&\",\n m.thisExpression(),\n m.memberExpression(\n m.thisExpression(),\n m.identifier(\"__createBinding\"),\n ),\n ),\n m.conditionalExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"create\"),\n ),\n m.functionExpression(\n null,\n [obj, mod, k, k2],\n m.or(\n m.blockStatement([\n m.ifStatement(\n m.binaryExpression(\n \"===\",\n k2,\n m.identifier(\"undefined\"),\n ),\n m.containerOf(m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.fromCapture(k2),\n m.fromCapture(k),\n ))),\n null,\n ),\n m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n desc,\n m.callExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"getOwnPropertyDescriptor\"),\n false,\n ),\n [\n m.fromCapture(mod),\n m.fromCapture(k),\n ],\n ),\n ),\n ]),\n m.ifStatement(\n m.logicalExpression(\n \"||\",\n m.unaryExpression(\n \"!\",\n m.fromCapture(desc),\n true,\n ),\n m.or(\n cond,\n m.unaryExpression(\n \"!\",\n m.unaryExpression(\n \"!\",\n cond,\n true,\n ),\n true,\n ),\n ),\n ),\n m.or(\n m.blockStatement([\n m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.fromCapture(desc),\n descObj,\n )),\n ]),\n m.blockStatement([\n m.variableDeclaration(\"const\", [\n m.variableDeclarator(descMiddle, descObj),\n ]),\n m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.fromCapture(desc),\n m.fromCapture(descMiddle),\n )),\n ]),\n ),\n null,\n ),\n m.expressionStatement(m.callExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"defineProperty\"),\n false,\n ),\n [\n m.fromCapture(obj),\n m.fromCapture(k2),\n m.fromCapture(desc),\n ],\n )),\n ]),\n m.blockStatement([\n m.ifStatement(\n m.binaryExpression(\n \"===\",\n k2,\n m.identifier(\"undefined\"),\n ),\n m.containerOf(m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.fromCapture(k2),\n m.fromCapture(k),\n ))),\n null,\n ),\n m.expressionStatement(m.callExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"defineProperty\"),\n false,\n ),\n [\n m.fromCapture(obj),\n m.fromCapture(k2),\n descObj,\n ],\n )),\n ]),\n ),\n ),\n m.functionExpression(\n null,\n [obj, mod, k, k2],\n m.blockStatement([\n m.ifStatement(\n m.binaryExpression(\n \"===\",\n k2,\n m.identifier(\"undefined\"),\n ),\n m.containerOf(m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.fromCapture(k2),\n m.fromCapture(k),\n ))),\n null,\n ),\n m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.fromCapture(obj),\n m.fromCapture(k2),\n true,\n ),\n m.memberExpression(\n m.fromCapture(mod),\n m.fromCapture(k),\n true,\n ),\n )),\n ]),\n ),\n ),\n ),\n ),\n]);\n", "import tmpl from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\nexport const __exportStar = tmpl.expression.ast`\n(this && this.__exportStar) || function(m, exports) {\n\tfor (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n}\n`;\n\nconst mod = m.capture(m.identifier());\nconst exp = m.capture(m.identifier());\nconst p = m.capture(m.identifier());\n\n/**\n * Match `__exportStar`.\n * @example\n * ```javascript\n * var __exportStar = (this && this.__exportStar) || function(m, exports) {\n * \tfor (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n * };\n * ```\n */\nexport default m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n m.identifier(),\n m.logicalExpression(\n \"||\",\n m.logicalExpression(\n \"&&\",\n m.thisExpression(),\n m.memberExpression(\n m.thisExpression(),\n m.identifier(\"__exportStar\"),\n false,\n ),\n ),\n m.functionExpression(\n null,\n [mod, exp],\n m.blockStatement([\n m.forInStatement(\n m.variableDeclaration(\"var\", [\n m.variableDeclarator(p),\n ]),\n m.fromCapture(mod),\n m.containerOf(m.ifStatement(\n m.logicalExpression(\n \"&&\",\n m.binaryExpression(\n \"!==\",\n m.fromCapture(p),\n m.stringLiteral(\"default\"),\n ),\n m.unaryExpression(\n \"!\",\n m.callExpression(\n m.memberExpression(\n m.memberExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"prototype\"),\n false,\n ),\n m.identifier(\"hasOwnProperty\"),\n false,\n ),\n m.identifier(\"call\"),\n false,\n ),\n [\n m.fromCapture(exp),\n m.fromCapture(p),\n ],\n ),\n true,\n ),\n ),\n m.containerOf(m.expressionStatement(m.callExpression(\n m.identifier(),\n [\n m.fromCapture(exp),\n m.fromCapture(mod),\n m.fromCapture(p),\n ],\n ))),\n )),\n ),\n ]),\n ),\n ),\n ),\n]);\n", "import tmpl from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\nexport const __importDefault = tmpl.expression.ast`\n(this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n}\n`;\n\nconst mod = m.capture(m.identifier());\nconst isEsm = m.logicalExpression(\n \"&&\",\n m.fromCapture(mod),\n m.memberExpression(\n m.fromCapture(mod),\n m.identifier(\"__esModule\"),\n false,\n ),\n);\n\n/**\n * Match `__importDefault`.\n * @example\n * ```javascript\n * var __importDefault = (this && this.__importDefault) || function (mod) {\n * \treturn (mod && mod.__esModule) ? mod : { \"default\": mod };\n * };\n * ```\n * @example\n * ```javascript\n * var data_55311B = this && this.__importDefault || function (_a1) {\n * \tif (_a1 && _a1.__esModule) {\n * \t\treturn _a1;\n * \t} else {\n * \t\treturn {\n * \t\t\tdefault: _a1\n * \t\t};\n * \t}\n * };\n * ```\n */\nexport default m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n m.identifier(),\n m.logicalExpression(\n \"||\",\n m.logicalExpression(\n \"&&\",\n m.thisExpression(),\n m.memberExpression(\n m.thisExpression(),\n m.identifier(\"__importDefault\"),\n ),\n ),\n m.functionExpression(\n null,\n [mod],\n m.blockStatement([\n m.or(\n m.returnStatement(m.conditionalExpression(\n isEsm,\n m.fromCapture(mod),\n m.objectExpression([\n m.objectProperty(\n m.stringLiteral(\"default\"),\n m.fromCapture(mod),\n false,\n ),\n ]),\n )),\n m.ifStatement(\n isEsm,\n m.containerOf(m.returnStatement(m.fromCapture(mod))),\n m.containerOf(m.returnStatement(m.objectExpression([\n m.objectProperty(\n m.identifier(\"default\"),\n m.fromCapture(mod),\n false,\n ),\n ]))),\n ),\n ),\n ]),\n ),\n ),\n ),\n]);\n", "import tmpl from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\nexport const __importStar = tmpl.expression.ast`\n(this && this.__importStar) || function (mod) {\n\tif (mod && mod.__esModule) return mod;\n\tvar result = {};\n\tif (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n\t__setModuleDefault(result, mod);\n\treturn result;\n}\n`;\n\nconst mod = m.capture(m.identifier());\nconst k = m.capture(m.identifier());\nconst result = m.capture(m.identifier());\n\n/**\n * Match `__importStar`.\n * @example\n * ```javascript\n * var __importStar = (this && this.__importStar) || function (mod) {\n * \tif (mod && mod.__esModule) return mod;\n * \tvar result = {};\n * \tif (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n * \t__setModuleDefault(result, mod);\n * \treturn result;\n * };\n * ```\n */\nexport default m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n m.identifier(),\n m.logicalExpression(\n \"||\",\n m.logicalExpression(\n \"&&\",\n m.thisExpression(),\n m.memberExpression(\n m.thisExpression(),\n m.identifier(\"__importStar\"),\n false,\n ),\n ),\n m.functionExpression(\n null,\n [mod],\n m.or(m.blockStatement([\n m.ifStatement(\n m.logicalExpression(\n \"&&\",\n m.fromCapture(mod),\n m.memberExpression(\n m.fromCapture(mod),\n m.identifier(\"__esModule\"),\n ),\n ),\n m.containerOf(m.returnStatement(m.fromCapture(mod))),\n null,\n ),\n m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n result,\n m.objectExpression([]),\n ),\n ]),\n m.ifStatement(\n m.binaryExpression(\"!=\", m.fromCapture(mod), m.nullLiteral()),\n m.containerOf(m.forInStatement(\n m.variableDeclaration(\n \"var\",\n [\n m.variableDeclarator(\n k,\n null,\n ),\n ],\n ),\n m.fromCapture(mod),\n m.containerOf(m.ifStatement(\n m.logicalExpression(\n \"&&\",\n m.binaryExpression(\n \"!==\",\n m.fromCapture(k),\n m.stringLiteral(\"default\"),\n ),\n m.callExpression(\n m.memberExpression(\n m.memberExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"prototype\"),\n false,\n ),\n m.identifier(\"hasOwnProperty\"),\n false,\n ),\n m.identifier(\"call\"),\n false,\n ),\n [\n m.fromCapture(mod),\n m.fromCapture(k),\n ],\n ),\n ),\n m.containerOf(m.callExpression(\n m.identifier(),\n [\n m.fromCapture(result),\n m.fromCapture(mod),\n m.fromCapture(k),\n ],\n )),\n )),\n )),\n null,\n ),\n m.expressionStatement(m.callExpression(\n m.identifier(),\n [\n m.fromCapture(result),\n m.fromCapture(mod),\n ],\n )),\n m.returnStatement(m.fromCapture(result)),\n ])),\n ),\n ),\n ),\n]);\n", "import tmpl from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\n\nexport const __setModuleDefault = tmpl.expression.ast`\n(this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n\tObject.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n\to[\"default\"] = v;\n})\n`;\n\nconst leftParamObj = m.capture(m.identifier());\nconst leftParamVal = m.capture(m.identifier());\nconst leftObjIdentifier = m.capture(m.identifier());\nconst leftObj = m.objectExpression([\n m.objectProperty(\n m.identifier(\"enumerable\"),\n m.booleanLiteral(true),\n ),\n m.objectProperty(\n m.identifier(\"value\"),\n leftParamVal,\n ),\n]);\n\nconst rightParamObj = m.capture(m.identifier());\nconst rightParamVal = m.capture(m.identifier());\n\n/**\n * Match `__setModuleDefault`.\n * @example\n * ```javascript\n * var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n * \t// this inline ObjectExpression could be emitted as an isolated VariableDeclarator in the scope\n * \tObject.defineProperty(o, \"default\", { enumerable: true, value: v });\n * }) : function(o, v) {\n * \to[\"default\"] = v;\n * });\n * ```\n */\nexport default m.variableDeclaration(\"var\", [\n m.variableDeclarator(\n m.identifier(),\n m.logicalExpression(\n \"||\",\n m.logicalExpression(\n \"&&\",\n m.thisExpression(),\n m.memberExpression(\n m.thisExpression(),\n m.identifier(\"__setModuleDefault\"),\n ),\n ),\n m.conditionalExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"create\"),\n ),\n m.functionExpression(\n null,\n [\n leftParamObj,\n leftParamVal,\n ],\n m.or(\n m.blockStatement([\n m.variableDeclaration(\n \"const\",\n [m.variableDeclarator(\n leftObjIdentifier,\n leftObj,\n )],\n ),\n m.expressionStatement(m.callExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"defineProperty\"),\n ),\n [\n leftParamObj,\n m.stringLiteral(\"default\"),\n leftObjIdentifier,\n ],\n )),\n ]),\n m.blockStatement([\n m.expressionStatement(m.callExpression(\n m.memberExpression(\n m.identifier(\"Object\"),\n m.identifier(\"defineProperty\"),\n ),\n [\n leftParamObj,\n m.stringLiteral(\"default\"),\n leftObj,\n ],\n )),\n ]),\n ),\n false,\n false,\n ),\n m.functionExpression(\n null,\n [\n rightParamObj,\n rightParamVal,\n ],\n m.blockStatement([\n m.expressionStatement(m.assignmentExpression(\n \"=\",\n m.memberExpression(\n rightParamObj,\n m.identifier(\"default\"),\n ),\n rightParamVal,\n )),\n ]),\n ),\n ),\n ),\n ),\n]);\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type { Transform } from \"../../webcrack/ast-utils/transform.ts\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { chunks } from \"../../utils/matchers/chunk.ts\";\nimport createBinding, {\n __createBinding,\n} from \"../../utils/matchers/createBinding.ts\";\nimport exportStar, { __exportStar } from \"../../utils/matchers/exportStar.ts\";\nimport importDefault, {\n __importDefault,\n} from \"../../utils/matchers/importDefault.ts\";\nimport importStar, { __importStar } from \"../../utils/matchers/importStar.ts\";\nimport setModuleDefault, {\n __setModuleDefault,\n} from \"../../utils/matchers/setModuleDefault.ts\";\nimport { assert } from \"jsr:@std/assert@^1.0.19\";\n\nconst preExport = m.assignmentExpression(\n \"=\",\n m.memberExpression(\n m.identifier(\"exports\"),\n m.identifier(),\n false,\n ),\n m.identifier(\"undefined\"),\n);\n\nconst undefinedExpr = m.expressionStatement(m.identifier(\"undefined\"));\n\n/**\n * Rename webpack RequireJS shims and tsc esmodule helpers.\n * @link <https://www.typescriptlang.org/tsconfig#esModuleInterop>\n */\nexport default {\n name: \"module-helper\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n let level = 0;\n return {\n ObjectExpression: {\n enter($) {\n if (!chunks.match($.node)) {\n return;\n }\n\n level++;\n const unders = \"_\".repeat(level);\n\n const $chunks = $.get(\"properties\");\n\n for (const $chunk of $chunks) {\n let $function: NodePath<t.Function>;\n\n if ($chunk.isObjectProperty()) {\n const $func = $chunk.get(\"value\");\n assert($func.isFunction());\n $function = $func;\n } else {\n assert($chunk.isObjectMethod());\n $function = $chunk;\n }\n\n const $p = $function.get(\"params\");\n\n $p.forEach(($parameter, i) => {\n assert($parameter.isIdentifier());\n\n switch (i) {\n case 0: {\n $function.scope.rename(\n $parameter.node.name,\n `${unders}module`,\n );\n break;\n }\n\n case 1: {\n $function.scope.rename(\n $parameter.node.name,\n `${unders}exports`,\n );\n break;\n }\n\n case 2: {\n $function.scope.rename(\n $parameter.node.name,\n `${unders}require`,\n );\n break;\n }\n\n default: {\n throw new Error(\"Unexpected param\");\n }\n }\n });\n\n $function.traverse({\n // Find `esModuleInterop` helpers\n VariableDeclaration: {\n exit(p) {\n const $decl = p.get(\"declarations.0\");\n\n const $id = $decl.get(\"id\");\n if (!$id.isIdentifier()) {\n return;\n }\n\n /** @link <https://github.com/microsoft/TypeScript/tree/main/src/compiler/factory/emitHelpers.ts> */\n if (importStar.match(t.cloneNode(p.node))) {\n $id.scope.rename($id.node.name, \"__importStar\");\n $decl.get(\"init\").replaceWith(__importStar);\n } else if (setModuleDefault.match(t.cloneNode(p.node))) {\n $id.scope.rename($id.node.name, \"__setModuleDefault\");\n $decl.get(\"init\").replaceWith(__setModuleDefault);\n } else if (importDefault.match(t.cloneNode(p.node))) {\n $id.scope.rename($id.node.name, \"__importDefault\");\n $decl.get(\"init\").replaceWith(__importDefault);\n } else if (createBinding.match(t.cloneNode(p.node))) {\n $id.scope.rename($id.node.name, \"__createBinding\");\n $decl.get(\"init\").replaceWith(__createBinding);\n } else if (exportStar.match(t.cloneNode(p.node))) {\n $id.scope.rename($id.node.name, \"__exportStar\");\n $decl.get(\"init\").replaceWith(__exportStar);\n } else {\n return;\n }\n\n this.changes++;\n },\n },\n // Remove early export declarations\n AssignmentExpression: {\n exit(p) {\n // In some cases, `exports` is a getter/setter, so disable for now.\n if (true as boolean) return;\n\n if (!preExport.match(p.node)) {\n return;\n }\n\n // Why not `buildUndefinedNode`?\n // That method generates `void 0` instead of plain `undefined`,\n // which is not what we want.\n p.replaceWith(t.identifier(\"undefined\"));\n if (undefinedExpr.match(p.parent)) {\n p.parentPath.remove();\n this.changes++;\n }\n },\n },\n }, this);\n }\n },\n exit($) {\n if (chunks.match($.node)) {\n level--;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport { applyTransform } from \"../../utils/ast.ts\";\nimport indirectCall from \"./indirect-call.ts\";\nimport moduleHelper from \"./module-helper.ts\";\n\n/**\n * Restore minified webpack-style ESM helpers.\n */\nexport default function transform(ast: t.Node) {\n applyTransform(ast, moduleHelper);\n applyTransform(ast, indirectCall);\n\n return ast;\n}\n", "import * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\n// \"a\" + \"b\" -> \"ab\"\n// (a + \"b\") + \"c\" -> a + \"bc\"\n// left ^ ^ right (path)\nexport default {\n name: \"merge-strings\",\n tags: [\"safe\"],\n visitor() {\n const left = m.capture(m.stringLiteral());\n const right = m.capture(m.stringLiteral());\n\n const matcher = m.binaryExpression(\n \"+\",\n m.or(left, m.binaryExpression(\"+\", m.anything(), left)),\n right,\n );\n\n return {\n BinaryExpression: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n left.current!.value += right.current!.value;\n right.current!.value = \"\"; // Otherwise it concatenates multiple times for some reason\n path.replaceWith(path.node.left);\n path.skip();\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { callExpression } from \"jsr:@codemod/matchers@^2.0.2\";\nimport {\n constMemberExpression,\n findParent,\n iife,\n infiniteLoop,\n} from \"../ast-utils/matcher.ts\";\nimport type { StringArray } from \"./string-array.ts\";\n\nexport type ArrayRotator = NodePath<t.ExpressionStatement>;\n\n/**\n * Structure:\n * ```\n * iife (>= 2 parameters, called with 0 or 2 arguments)\n * 2 variable declarations (array and decoder)\n * endless loop:\n * try:\n * if/break/parseInt/array.push(array.shift())\n * catch:\n * array.push(array.shift())\n * ```\n */\nexport function findArrayRotator(\n stringArray: StringArray,\n): ArrayRotator | undefined {\n // e.g. 'array'\n const arrayIdentifier = m.capture(m.identifier());\n\n // e.g. array.push(array.shift())\n const pushShift = m.callExpression(\n constMemberExpression(arrayIdentifier, \"push\"),\n [\n m.callExpression(\n constMemberExpression(m.fromCapture(arrayIdentifier), \"shift\"),\n ),\n ],\n );\n\n const callMatcher = iife(\n m.anything(),\n m.blockStatement(\n m.anyList(\n m.zeroOrMore(),\n infiniteLoop(\n m.matcher((node) => {\n return (\n m\n .containerOf(callExpression(m.identifier(\"parseInt\")))\n .match(node) &&\n m\n .blockStatement([\n m.tryStatement(\n m.containerOf(pushShift),\n m.containerOf(pushShift),\n ),\n ])\n .match(node)\n );\n }),\n ),\n ),\n ),\n );\n\n const matcher = m.expressionStatement(\n m.or(callMatcher, m.unaryExpression(\"!\", callMatcher)),\n );\n\n for (const ref of stringArray.references) {\n const rotator = findParent(ref, matcher);\n if (rotator) {\n return rotator;\n }\n }\n}\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\n\nexport function getPropName(node: t.Node): string | undefined {\n if (t.isIdentifier(node)) {\n return node.name;\n }\n if (t.isStringLiteral(node)) {\n return node.value;\n }\n if (t.isNumericLiteral(node)) {\n return node.value.toString();\n }\n}\n", "import type { Binding, NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport traverse from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { getPropName } from \"./ast.ts\";\nimport { findParent, varFunctionOrDeclaration } from \"./matcher.ts\";\n\nfunction getNearestAssignment(\n assignments: t.AssignmentExpression[],\n location: number,\n) {\n return assignments.findLast((assignment) => assignment.start! < location);\n}\n\n/**\n * Replace all references of a variable with the initializer.\n * Example:\n * `const a = 1; console.log(a);` -> `console.log(1);`\n *\n * Example with `unsafeAssignments` being `true`:\n * `let a; a = 2; console.log(a);` -> `console.log(2);`\n *\n * @param unsafeAssignments Also inline assignments to the variable (not guaranteed to be the final value)\n */\nexport function inlineVariable(\n binding: Binding,\n value = m.anyExpression(),\n unsafeAssignments = false,\n) {\n const varDeclarator = binding.path.node;\n const varMatcher = m.variableDeclarator(\n m.identifier(binding.identifier.name),\n value,\n );\n const assignmentMatcher = m.assignmentExpression(\n \"=\",\n m.identifier(binding.identifier.name),\n value,\n );\n\n if (binding.constant && varMatcher.match(varDeclarator)) {\n binding.referencePaths.forEach((ref) => {\n ref.replaceWith(varDeclarator.init!);\n });\n binding.path.remove();\n } else if (unsafeAssignments && binding.constantViolations.length >= 1) {\n const assignments = binding.constantViolations\n .map((path) => path.node)\n .filter((node) => assignmentMatcher.match(node));\n if (!assignments.length) return;\n\n for (const ref of binding.referencePaths) {\n const assignment = getNearestAssignment(assignments, ref.node.start!);\n if (assignment) ref.replaceWith(assignment.right);\n }\n\n for (const path of binding.constantViolations) {\n if (path.parentPath?.isExpressionStatement()) {\n path.remove();\n } else if (path.isAssignmentExpression()) {\n path.replaceWith(path.node.right);\n }\n }\n\n binding.path.remove();\n }\n}\n\n/**\n * Make sure the array is immutable and references are valid before using!\n *\n * Example:\n * `const arr = [\"foo\", \"bar\"]; console.log(arr[0]);` -> `console.log(\"foo\");`\n */\nexport function inlineArrayElements(\n array: t.ArrayExpression,\n references: NodePath[],\n): void {\n for (const reference of references) {\n const memberPath = reference.parentPath! as NodePath<t.MemberExpression>;\n const property = memberPath.node.property as t.NumericLiteral;\n const index = property.value;\n const replacement = array.elements[index]!;\n memberPath.replaceWith(t.cloneNode(replacement));\n }\n}\n\nexport function inlineObjectProperties(\n binding: Binding,\n property = m.objectProperty(),\n): void {\n const varDeclarator = binding.path.node;\n const objectProperties = m.capture(m.arrayOf(property));\n const varMatcher = m.variableDeclarator(\n m.identifier(binding.identifier.name),\n m.objectExpression(objectProperties),\n );\n if (!varMatcher.match(varDeclarator)) return;\n\n const propertyMap = new Map(\n objectProperties.current!.map((p) => [getPropName(p.key), p.value]),\n );\n if (\n !binding.referencePaths.every((ref) => {\n const member = ref.parent as t.MemberExpression;\n const propName = getPropName(member.property)!;\n return propertyMap.has(propName);\n })\n ) {\n return;\n }\n\n binding.referencePaths.forEach((ref) => {\n const memberPath = ref.parentPath as NodePath<t.MemberExpression>;\n const propName = getPropName(memberPath.node.property)!;\n const value = propertyMap.get(propName)!;\n\n memberPath.replaceWith(value);\n });\n\n binding.path.remove();\n}\n\n/**\n * Inline function used in control flow flattening (that only returns an expression)\n * Example:\n * fn: `function (a, b) { return a(b) }`\n * caller: `fn(a, 1)`\n * ->\n * `a(1)`\n */\nexport function inlineFunctionCall(\n fn: t.FunctionExpression | t.FunctionDeclaration,\n caller: NodePath<t.CallExpression>,\n): void {\n if (t.isRestElement(fn.params[1])) {\n caller.replaceWith(\n t.callExpression(\n caller.node.arguments[0] as t.Identifier,\n caller.node.arguments.slice(1),\n ),\n );\n return;\n }\n\n const returnedValue = (fn.body.body[0] as t.ReturnStatement).argument!;\n const clone = t.cloneNode(returnedValue, true);\n\n // Inline all arguments\n traverse(clone, {\n Identifier(path) {\n const paramIndex = fn.params.findIndex(\n (p) => (p as t.Identifier).name === path.node.name,\n );\n if (paramIndex !== -1) {\n path.replaceWith(\n caller.node.arguments[paramIndex] ??\n t.unaryExpression(\"void\", t.numericLiteral(0)),\n );\n path.skip();\n }\n },\n noScope: true,\n });\n\n caller.replaceWith(clone);\n}\n\n/**\n * Example:\n * `function alias(a, b) { return decode(b - 938, a); } alias(1071, 1077);`\n * or\n * `var alias = function(a, b) { return decode(b - 938, a); }; alias(1071, 1077);`\n * ->\n * `decode(1077 - 938, 1071)`\n */\nexport function inlineFunctionAliases(binding: Binding): { changes: number } {\n const state = { changes: 0 };\n const refs = [...binding.referencePaths];\n\n // E.g. alias\n const fnName = m.capture(m.anyString());\n // E.g. decode(b - 938, a)\n const returnedCall = m.capture(\n m.callExpression(\n m.identifier(binding.identifier.name),\n m.anyList(m.slice({ min: 2 })),\n ),\n );\n const matcher = varFunctionOrDeclaration(\n m.identifier(fnName),\n m.anyList(m.slice({ min: 2, matcher: m.identifier() })),\n m.blockStatement([m.returnStatement(returnedCall)]),\n );\n\n for (const ref of refs) {\n const decl = findParent(ref, matcher);\n if (!decl) continue;\n\n const fnPath = decl.isFunctionDeclaration()\n ? decl\n : (decl.get(\"declarations.0.init\") as NodePath<t.FunctionExpression>);\n\n // Avoid false positives of functions that return a string\n // It's only a wrapper if the function's params are used in the decode call\n const paramUsedInDecodeCall = fnPath.node.params.some((param) => {\n const binding = fnPath.scope.getBinding((param as t.Identifier).name);\n return binding?.referencePaths.some((ref) =>\n ref.findParent((p) => p.node === returnedCall.current)\n );\n });\n if (!paramUsedInDecodeCall) continue;\n\n const fnBinding = fnPath.scope.parent!.getBinding(fnName.current!);\n if (!fnBinding) continue;\n // Check all further aliases (`function alias2(a, b) { return alias(a - 1, b + 3); }`)\n const fnRefs = fnBinding.referencePaths;\n refs.push(...fnRefs);\n\n // E.g. [alias(1071, 1077), alias(1, 2)]\n const callRefs = fnRefs\n .filter(\n (ref) =>\n t.isCallExpression(ref.parent) &&\n t.isIdentifier(ref.parent.callee, { name: fnName.current! }),\n )\n .map((ref) => ref.parentPath!) as NodePath<t.CallExpression>[];\n\n for (const callRef of callRefs) {\n inlineFunctionCall(fnPath.node, callRef);\n state.changes++;\n }\n\n decl.remove();\n state.changes++;\n }\n\n // Have to crawl again because renaming messed up the references\n binding.scope.crawl();\n return state;\n}\n\n/**\n * Recursively renames all references to the binding.\n * Make sure the binding name isn't shadowed anywhere!\n *\n * Example: `var alias = decoder; alias(1);` -> `decoder(1);`\n */\n\nexport function inlineVariableAliases(\n binding: Binding,\n targetName = binding.identifier.name,\n): { changes: number } {\n const state = { changes: 0 };\n const refs = [...binding.referencePaths];\n const varName = m.capture(m.anyString());\n const matcher = m.or(\n m.variableDeclarator(\n m.identifier(varName),\n m.identifier(binding.identifier.name),\n ),\n m.assignmentExpression(\n \"=\",\n m.identifier(varName),\n m.identifier(binding.identifier.name),\n ),\n );\n\n for (const ref of refs) {\n if (matcher.match(ref.parent)) {\n const varScope = ref.scope;\n const varBinding = varScope.getBinding(varName.current!);\n if (!varBinding) continue;\n // Avoid infinite loop from `alias = alias;` (caused by dead code injection?)\n if (ref.isIdentifier({ name: varBinding.identifier.name })) continue;\n\n // Check all further aliases (`var alias2 = alias;`)\n state.changes += inlineVariableAliases(varBinding, targetName).changes;\n\n if (ref.parentPath?.isAssignmentExpression()) {\n // Remove `var alias;` when the assignment happens separately\n varBinding.path.remove();\n\n if (t.isExpressionStatement(ref.parentPath.parent)) {\n // Remove `alias = decoder;`\n ref.parentPath.remove();\n } else {\n // Replace `(alias = decoder)(1);` with `decoder(1);`\n ref.parentPath.replaceWith(t.identifier(targetName));\n }\n } else if (ref.parentPath?.isVariableDeclarator()) {\n // Remove `alias = decoder;` of declarator\n ref.parentPath.remove();\n }\n state.changes++;\n } else {\n // Rename the reference\n ref.replaceWith(t.identifier(targetName));\n state.changes++;\n }\n }\n\n return state;\n}\n", "import type { Binding, NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { applyTransform, type Transform } from \"../ast-utils/transform.ts\";\nimport {\n constKey,\n constMemberExpression,\n createFunctionMatcher,\n findParent,\n isReadonlyObject,\n} from \"../ast-utils/matcher.ts\";\nimport { getPropName } from \"../ast-utils/ast.ts\";\nimport { inlineFunctionCall } from \"../ast-utils/inline.ts\";\nimport mergeStrings from \"../unminify/merge-strings.ts\";\n\n/**\n * Explanation: https://excalidraw.com/#json=0vehUdrfSS635CNPEQBXl,hDOd-UO9ETfSDWT9MxVX-A\n */\n\nexport default {\n name: \"control-flow-object\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const varId = m.capture(m.identifier());\n const propertyName = m.matcher<string>((name) =>\n typeof name === \"string\" && /^[a-z]{5}$/i.test(name)\n );\n const propertyKey = constKey(propertyName);\n const propertyValue = m.or(\n // E.g. \"6|0|4|3|1|5|2\"\n m.stringLiteral(),\n // E.g. function (a, b) { return a + b }\n createFunctionMatcher(2, (left, right) => [\n m.returnStatement(\n m.or(\n m.binaryExpression(undefined, left, right),\n m.logicalExpression(undefined, left, right),\n m.binaryExpression(undefined, right, left),\n m.logicalExpression(undefined, right, left),\n ),\n ),\n ]),\n // E.g. function (a, b, c) { return a(b, c) } with an arbitrary number of arguments\n m.matcher<t.FunctionExpression>((node) => {\n return (\n t.isNode(node) &&\n t.isFunctionExpression(node) &&\n createFunctionMatcher(node.params.length, (...params) => [\n m.returnStatement(m.callExpression(params[0], params.slice(1))),\n ]).match(node)\n );\n }),\n // E.g. function (a, ...b) { return a(...b) }\n (() => {\n const fnName = m.capture(m.identifier());\n const restName = m.capture(m.identifier());\n\n return m.functionExpression(\n undefined,\n [fnName, m.restElement(restName)],\n m.blockStatement([\n m.returnStatement(\n m.callExpression(m.fromCapture(fnName), [\n m.spreadElement(m.fromCapture(restName)),\n ]),\n ),\n ]),\n );\n })(),\n );\n // E.g. \"rLxJs\": \"6|0|4|3|1|5|2\"\n const objectProperties = m.capture(\n m.arrayOf(m.objectProperty(propertyKey, propertyValue)),\n );\n const aliasId = m.capture(m.identifier());\n const aliasVar = m.variableDeclaration(m.anything(), [\n m.variableDeclarator(aliasId, m.fromCapture(varId)),\n ]);\n // E.g. \"rLxJs\"\n const assignedKey = m.capture(propertyName);\n // E.g. \"6|0|4|3|1|5|2\"\n const assignedValue = m.capture(propertyValue);\n // E.g. obj.rLxJs = \"6|0|4|3|1|5|2\"\n const assignment = m.expressionStatement(\n m.assignmentExpression(\n \"=\",\n constMemberExpression(m.fromCapture(varId), assignedKey),\n assignedValue,\n ),\n );\n const looseAssignment = m.expressionStatement(\n m.assignmentExpression(\n \"=\",\n constMemberExpression(m.fromCapture(varId), assignedKey),\n ),\n );\n // E.g. obj.rLxJs\n const memberAccess = constMemberExpression(\n m.or(m.fromCapture(varId), m.fromCapture(aliasId)),\n propertyName,\n );\n const varMatcher = m.variableDeclarator(\n varId,\n m.objectExpression(objectProperties),\n );\n // Example: { YhxvC: \"default\" }.YhxvC\n const inlineMatcher = constMemberExpression(\n m.objectExpression(objectProperties),\n propertyName,\n );\n\n function isConstantBinding(binding: Binding) {\n // Workaround because sometimes babel treats the VariableDeclarator/binding itself as a violation\n return binding.constant || binding.constantViolations[0] === binding.path;\n }\n\n function transform(path: NodePath<t.VariableDeclarator>) {\n let changes = 0;\n if (varMatcher.match(path.node)) {\n // Verify all references to make sure they match how the obfuscator\n // would have generated the code (no reassignments, etc.)\n const binding = path.scope.getBinding(varId.current!.name);\n if (!binding) return changes;\n if (!isConstantBinding(binding)) return changes;\n if (!transformObjectKeys(binding)) return changes;\n if (!isReadonlyObject(binding, memberAccess)) return changes;\n\n const props = new Map(\n objectProperties.current!.map((p) => [\n getPropName(p.key),\n p.value as t.FunctionExpression | t.StringLiteral,\n ]),\n );\n if (!props.size) return changes;\n\n const oldRefs = [...binding.referencePaths];\n\n // Have to loop backwards because we might replace a node that\n // contains another reference to the binding (https://github.com/babel/babel/issues/12943)\n [...binding.referencePaths].reverse().forEach((ref) => {\n const memberPath = ref.parentPath as NodePath<t.MemberExpression>;\n const propName = getPropName(memberPath.node.property)!;\n const value = props.get(propName);\n if (!value) {\n ref.addComment(\"leading\", \"webcrack:control_flow_missing_prop\");\n return;\n }\n\n if (t.isStringLiteral(value)) {\n memberPath.replaceWith(value);\n } else {\n inlineFunctionCall(\n value,\n memberPath.parentPath as NodePath<t.CallExpression>,\n );\n }\n changes++;\n });\n\n oldRefs.forEach((ref) => {\n const varDeclarator = findParent(ref, m.variableDeclarator());\n if (varDeclarator) changes += transform(varDeclarator);\n });\n\n path.remove();\n changes++;\n }\n return changes;\n }\n\n /**\n * When the `Transform Object Keys` option is enabled, the obfuscator generates an empty\n * object, assigns the properties later and adds an alias variable to the object.\n * This function undoes that by converting the assignments to inline object properties.\n *\n * In some forked versions of the obfuscator, some properties may be in the object\n * and others are assigned later.\n */\n function transformObjectKeys(objBinding: Binding): boolean {\n const container = objBinding.path.parentPath!.container as t.Statement[];\n const startIndex = (objBinding.path.parentPath!.key as number) + 1;\n const properties: t.ObjectProperty[] = [];\n\n for (let i = startIndex; i < container.length; i++) {\n const statement = container[i];\n\n // Example: _0x29d709[\"kHAOU\"] = \"5|1|2\" + \"|4|3|\" + \"0|6\";\n // For performance reasons, only traverse if it is a potential match (value doesn't matter)\n if (looseAssignment.match(statement)) {\n applyTransform(statement, mergeStrings);\n }\n\n if (assignment.match(statement)) {\n properties.push(\n t.objectProperty(\n t.identifier(assignedKey.current!),\n assignedValue.current!,\n ),\n );\n } else {\n break;\n }\n }\n\n // If all properties are in the object then there typically won't be an alias variable\n const aliasAssignment = container[startIndex + properties.length];\n if (!aliasVar.match(aliasAssignment)) return true;\n\n // Avoid false positives\n if (objBinding.references !== properties.length + 1) return false;\n\n const aliasBinding = objBinding.scope.getBinding(aliasId.current!.name)!;\n if (!isReadonlyObject(aliasBinding, memberAccess)) return false;\n\n objectProperties.current!.push(...properties);\n container.splice(startIndex, properties.length);\n objBinding.referencePaths = aliasBinding.referencePaths;\n objBinding.references = aliasBinding.references;\n objBinding.identifier.name = aliasBinding.identifier.name;\n aliasBinding.path.remove();\n return true;\n }\n\n return {\n VariableDeclarator: {\n exit(path) {\n this.changes += transform(path);\n },\n },\n MemberExpression: {\n exit(path) {\n if (!inlineMatcher.match(path.node)) return;\n\n const propName = getPropName(path.node.property)!;\n const value = objectProperties.current!.find(\n (prop) => getPropName(prop.key) === propName,\n )?.value as t.FunctionExpression | t.StringLiteral | undefined;\n if (!value) return;\n\n if (t.isStringLiteral(value)) {\n path.replaceWith(value);\n } else if (path.parentPath.isCallExpression()) {\n inlineFunctionCall(value, path.parentPath);\n } else {\n path.replaceWith(value);\n }\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { constMemberExpression, infiniteLoop } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"control-flow-switch\",\n tags: [\"safe\"],\n visitor() {\n const sequenceName = m.capture(m.identifier());\n const sequenceString = m.capture(\n m.matcher<string>((s) =>\n typeof s === \"string\" && /^\\d+(\\|\\d+)*$/.test(s)\n ),\n );\n const iterator = m.capture(m.identifier());\n\n const cases = m.capture(\n m.arrayOf(\n m.switchCase(\n m.stringLiteral(\n m.matcher((s) => typeof s === \"string\" && /^\\d+$/.test(s)),\n ),\n ),\n ),\n );\n\n const matcher = m.blockStatement(\n m.anyList<t.Statement>(\n // E.g. const sequence = \"2|4|3|0|1\".split(\"|\")\n m.variableDeclaration(undefined, [\n m.variableDeclarator(\n sequenceName,\n m.callExpression(\n constMemberExpression(m.stringLiteral(sequenceString), \"split\"),\n [m.stringLiteral(\"|\")],\n ),\n ),\n ]),\n // E.g. let iterator = 0 or -0x1a70 + 0x93d + 0x275 * 0x7\n m.variableDeclaration(undefined, [m.variableDeclarator(iterator)]),\n infiniteLoop(\n m.blockStatement([\n m.switchStatement(\n // E.g. switch (sequence[iterator++]) {\n m.memberExpression(\n m.fromCapture(sequenceName),\n m.updateExpression(\"++\", m.fromCapture(iterator)),\n true,\n ),\n cases,\n ),\n m.breakStatement(),\n ]),\n ),\n m.zeroOrMore(),\n ),\n );\n\n return {\n BlockStatement: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n\n const caseStatements = new Map(\n cases.current!.map((c) => [\n (c.test as t.StringLiteral).value,\n t.isContinueStatement(c.consequent.at(-1))\n ? c.consequent.slice(0, -1)\n : c.consequent,\n ]),\n );\n\n const sequence = sequenceString.current!.split(\"|\");\n const newStatements = sequence.flatMap((s) => caseStatements.get(s)!);\n\n path.node.body.splice(0, 3, ...newStatements);\n this.changes += newStatements.length + 3;\n },\n },\n };\n },\n} satisfies Transform;\n", "import type { GeneratorOptions } from \"jsr:/@codemod/utils@^2.2.1/babel-generator\";\nimport babelGenerate from \"jsr:/@codemod/utils@^2.2.1/babel-generator\";\nimport type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\n\nconst defaultOptions: GeneratorOptions = { jsescOption: { minimal: true } };\n\nexport function generate(\n ast: t.Node,\n options: GeneratorOptions = defaultOptions,\n): string {\n return babelGenerate(ast, options).code;\n}\n\nexport function codePreview(node: t.Node): string {\n const code = generate(node, {\n minified: true,\n shouldPrintComment: () => false,\n ...defaultOptions,\n });\n if (code.length > 100) {\n return code.slice(0, 70) + \" … \" + code.slice(-30);\n }\n return code;\n}\n", "import type { Binding, NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport traverse from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { codePreview } from \"./generator.ts\";\n\nexport function renameFast(binding: Binding, newName: string): void {\n binding.referencePaths.forEach((ref) => {\n if (ref.isExportDefaultDeclaration()) return;\n if (!ref.isIdentifier() && !ref.isJSXIdentifier()) {\n throw new Error(\n `Unexpected reference (${ref.type}): ${codePreview(ref.node)}`,\n );\n }\n\n // To avoid conflicts with other bindings of the same name\n if (ref.scope.hasBinding(newName)) ref.scope.rename(newName);\n ref.node.name = newName;\n });\n\n // Also update assignments\n const patternMatcher = m.assignmentExpression(\n \"=\",\n m.or(m.arrayPattern(), m.objectPattern()),\n );\n binding.constantViolations.forEach((ref) => {\n // To avoid conflicts with other bindings of the same name\n if (ref.scope.hasBinding(newName)) ref.scope.rename(newName);\n\n if (ref.isAssignmentExpression() && t.isIdentifier(ref.node.left)) {\n ref.node.left.name = newName;\n } else if (ref.isUpdateExpression() && t.isIdentifier(ref.node.argument)) {\n ref.node.argument.name = newName;\n } else if (\n ref.isUnaryExpression({ operator: \"delete\" }) &&\n t.isIdentifier(ref.node.argument)\n ) {\n ref.node.argument.name = newName;\n } else if (ref.isVariableDeclarator() && t.isIdentifier(ref.node.id)) {\n ref.node.id.name = newName;\n } else if (ref.isVariableDeclarator() && t.isArrayPattern(ref.node.id)) {\n const ids = ref.getBindingIdentifiers();\n for (const id in ids) {\n if (id === binding.identifier.name) {\n ids[id].name = newName;\n }\n }\n } else if (ref.isFor() || patternMatcher.match(ref.node)) {\n traverse(ref.node, {\n Identifier(path) {\n if (path.scope !== ref.scope) return path.skip();\n if (path.node.name === binding.identifier.name) {\n path.node.name = newName;\n }\n },\n noScope: true,\n });\n } else if (ref.isFunctionDeclaration() && t.isIdentifier(ref.node.id)) {\n ref.node.id.name = newName;\n } else {\n throw new Error(\n `Unexpected constant violation (${ref.type}): ${codePreview(ref.node)}`,\n );\n }\n });\n\n binding.scope.removeOwnBinding(binding.identifier.name);\n binding.scope.bindings[newName] = binding;\n binding.identifier.name = newName;\n}\n\nexport function renameParameters(\n path: NodePath<t.Function>,\n newNames: string[],\n): void {\n const params = path.node.params as t.Identifier[];\n for (let i = 0; i < Math.min(params.length, newNames.length); i++) {\n const binding = path.scope.getBinding(params[i].name)!;\n renameFast(binding, newNames[i]);\n }\n}\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { renameFast } from \"../ast-utils/rename.ts\";\n\nexport default {\n name: \"dead-code\",\n tags: [\"unsafe\"],\n scope: true,\n visitor() {\n const stringComparison = m.binaryExpression(\n m.or(\"===\", \"==\", \"!==\", \"!=\"),\n m.stringLiteral(),\n m.stringLiteral(),\n );\n const testMatcher = m.or(\n stringComparison,\n m.unaryExpression(\"!\", stringComparison),\n );\n\n return {\n \"IfStatement|ConditionalExpression\": {\n exit(_path) {\n const path = _path as NodePath<\n t.IfStatement | t.ConditionalExpression\n >;\n\n if (!testMatcher.match(path.node.test)) return;\n\n if (path.get(\"test\").evaluateTruthy()) {\n replace(path, path.get(\"consequent\"));\n } else if (path.node.alternate) {\n replace(path, path.get(\"alternate\") as NodePath);\n } else {\n path.remove();\n }\n\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n\nfunction replace(path: NodePath<t.Conditional>, replacement: NodePath) {\n if (t.isBlockStatement(replacement.node)) {\n // If statements can contain variables that shadow variables in the parent scope.\n // Since the block scope is merged with the parent scope, we need to rename those\n // variables to avoid duplicate declarations.\n const childBindings = replacement.scope.bindings;\n for (const name in childBindings) {\n const binding = childBindings[name];\n if (path.scope.hasOwnBinding(name)) {\n renameFast(binding, path.scope.generateUid(name));\n }\n binding.scope = path.scope;\n path.scope.bindings[binding.identifier.name] = binding;\n }\n path.replaceWithMultiple(replacement.node.body);\n } else {\n path.replaceWith(replacement);\n }\n}\n", "import { expression } from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport {\n anySubList,\n findParent,\n varFunctionOrDeclaration,\n} from \"../ast-utils/matcher.ts\";\nimport { inlineVariable } from \"../ast-utils/inline.ts\";\nimport { renameFast } from \"../ast-utils/rename.ts\";\nimport type { StringArray } from \"./string-array.ts\";\n\n/**\n * A function that is called with >= 1 numeric/string arguments\n * and returns a string from the string array. It may also decode\n * the string with Base64 or RC4.\n */\nexport class Decoder {\n originalName: string;\n name: string;\n path: NodePath<t.FunctionDeclaration | t.VariableDeclaration>;\n\n constructor(\n originalName: string,\n name: string,\n path: NodePath<t.FunctionDeclaration | t.VariableDeclaration>,\n ) {\n this.originalName = originalName;\n this.name = name;\n this.path = path;\n }\n\n collectCalls(): NodePath<t.CallExpression>[] {\n const calls: NodePath<t.CallExpression>[] = [];\n\n const literalArgument: m.Matcher<t.Expression> = m.or(\n m.binaryExpression(\n m.anything(),\n m.matcher((node) => literalArgument.match(node)),\n m.matcher((node) => literalArgument.match(node)),\n ),\n m.unaryExpression(\n \"-\",\n m.matcher((node) => literalArgument.match(node)),\n ),\n m.numericLiteral(),\n m.stringLiteral(),\n );\n\n const literalCall = m.callExpression(\n m.identifier(this.name),\n m.arrayOf(literalArgument),\n );\n const expressionCall = m.callExpression(\n m.identifier(this.name),\n m.arrayOf(m.anyExpression()),\n );\n\n const conditional = m.capture(m.conditionalExpression());\n const conditionalCall = m.callExpression(m.identifier(this.name), [\n conditional,\n ]);\n\n const buildExtractedConditional =\n expression`TEST ? CALLEE(CONSEQUENT) : CALLEE(ALTERNATE)`;\n\n const binding = this.path.scope.getBinding(this.name)!;\n for (const ref of binding.referencePaths) {\n if (conditionalCall.match(ref.parent)) {\n // decode(test ? 1 : 2) -> test ? decode(1) : decode(2)\n const [replacement] = ref.parentPath!.replaceWith(\n buildExtractedConditional({\n TEST: conditional.current!.test,\n CALLEE: ref.parent.callee,\n CONSEQUENT: conditional.current!.consequent,\n ALTERNATE: conditional.current!.alternate,\n }),\n );\n // some of the scope information is somehow lost after replacing\n replacement.scope.crawl();\n } else if (literalCall.match(ref.parent)) {\n calls.push(ref.parentPath as NodePath<t.CallExpression>);\n } else if (expressionCall.match(ref.parent)) {\n // var n = 1; decode(n); -> decode(1);\n ref.parentPath!.traverse({\n ReferencedIdentifier(path) {\n const varBinding = path.scope.getBinding(path.node.name)!;\n if (!varBinding) return;\n inlineVariable(varBinding, literalArgument, true);\n },\n });\n if (literalCall.match(ref.parent)) {\n calls.push(ref.parentPath as NodePath<t.CallExpression>);\n }\n } else if (ref.parentPath?.isExpressionStatement()) {\n // `decode;` may appear on it's own in some forked obfuscators\n ref.parentPath.remove();\n }\n }\n\n return calls;\n }\n}\n\nexport function findDecoders(stringArray: StringArray): Decoder[] {\n const decoders: Decoder[] = [];\n\n const functionName = m.capture(m.anyString());\n const arrayIdentifier = m.capture(m.identifier());\n const matcher = varFunctionOrDeclaration(\n m.identifier(functionName),\n m.anything(),\n m.blockStatement(\n anySubList(\n // var array = getStringArray();\n m.variableDeclaration(undefined, [\n m.variableDeclarator(\n arrayIdentifier,\n m.callExpression(m.identifier(stringArray.name)),\n ),\n ]),\n // var h = array[e]; return h;\n // or return array[e -= 254];\n m.containerOf(\n m.memberExpression(m.fromCapture(arrayIdentifier), undefined, true),\n ),\n ),\n ),\n );\n\n for (const ref of stringArray.references) {\n const decoderFn = findParent(ref, matcher);\n\n if (decoderFn) {\n const oldName = functionName.current!;\n const newName = `__DECODE_${decoders.length}__`;\n const binding = decoderFn.scope.getBinding(oldName)!;\n renameFast(binding, newName);\n decoders.push(new Decoder(oldName, newName, decoderFn));\n }\n }\n\n return decoders;\n}\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport type { AsyncTransform } from \"../ast-utils/transform.ts\";\nimport type { VMDecoder } from \"./vm.ts\";\n\n/**\n * Replaces calls to decoder functions with the decoded string.\n * E.g. `m(199)` -> `'log'`\n */\nexport default {\n name: \"inline-decoded-strings\",\n tags: [\"unsafe\"],\n scope: true,\n async run(_ast, state, options) {\n if (!options) return;\n\n const calls = options.vm.decoders.flatMap((decoder) =>\n decoder.collectCalls()\n );\n if (calls.length === 0) return;\n\n const decodedValues = await options.vm.decode(calls);\n\n for (let i = 0; i < calls.length; i++) {\n const call = calls[i];\n const value = decodedValues[i];\n\n call.replaceWith(t.valueToNode(value));\n if (typeof value !== \"string\") {\n call.addComment(\"leading\", \"webcrack:decode_error\");\n }\n }\n\n state.changes += calls.length;\n },\n} satisfies AsyncTransform<{ vm: VMDecoder }>;\n", "import type { Transform } from \"../ast-utils/transform.ts\";\nimport {\n inlineFunctionAliases,\n inlineVariableAliases,\n} from \"../ast-utils/inline.ts\";\nimport type { Decoder } from \"./decoder.ts\";\n\n/**\n * Replaces all references to `var alias = decode;` with `decode`\n */\nexport default {\n name: \"inline-decoder-wrappers\",\n tags: [\"unsafe\"],\n scope: true,\n run(_ast, state, decoder) {\n if (!decoder) return;\n const decoderBinding = decoder.path.parentPath.scope.getBinding(\n decoder.name,\n );\n if (decoderBinding) {\n state.changes += inlineVariableAliases(decoderBinding).changes;\n state.changes += inlineFunctionAliases(decoderBinding).changes; // FIXME: may be var = function(){}\n }\n },\n} satisfies Transform<Decoder>;\n", "import * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport {\n constKey,\n constMemberExpression,\n isReadonlyObject,\n} from \"../ast-utils/matcher.ts\";\nimport { getPropName } from \"../ast-utils/ast.ts\";\nimport { inlineObjectProperties } from \"../ast-utils/inline.ts\";\n\n// TODO: move do decoder.ts collectCalls to avoid traversing the whole AST\n\n/**\n * Inline objects that only have string or numeric literal properties.\n * Used by the \"String Array Calls Transform\" option for moving the\n * decode call arguments into an object.\n * Example:\n * ```js\n * const obj = {\n * c: 0x2f2,\n * d: '0x396',\n * };\n * console.log(decode(obj.c, obj.d));\n * ```\n * ->\n * ```js\n * console.log(decode(0x2f2, '0x396'));\n * ```\n */\nexport default {\n name: \"inline-object-props\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const varId = m.capture(m.identifier());\n const propertyName = m.capture(\n m.matcher<string>((name) =>\n typeof name === \"string\" && /^[\\w]+$/i.test(name)\n ),\n );\n const propertyKey = constKey(propertyName);\n // E.g. \"_0x51b74a\": 0x80\n const objectProperties = m.capture(\n m.arrayOf(\n m.objectProperty(\n propertyKey,\n m.or(m.stringLiteral(), m.numericLiteral()),\n ),\n ),\n );\n // E.g. obj._0x51b74a\n const memberAccess = constMemberExpression(\n m.fromCapture(varId),\n propertyName,\n );\n const varMatcher = m.variableDeclarator(\n varId,\n m.objectExpression(objectProperties),\n );\n // E.g. { e: 0x80 }.e\n const literalMemberAccess = constMemberExpression(\n m.objectExpression(objectProperties),\n propertyName,\n );\n\n return {\n MemberExpression(path) {\n if (!literalMemberAccess.match(path.node)) return;\n const property = objectProperties.current!.find(\n (p) => getPropName(p.key) === propertyName.current,\n );\n if (!property) return;\n path.replaceWith(property.value);\n this.changes++;\n },\n VariableDeclarator(path) {\n if (!varMatcher.match(path.node)) return;\n if (objectProperties.current!.length === 0) return;\n\n const binding = path.scope.getBinding(varId.current!.name);\n if (!binding || !isReadonlyObject(binding, memberAccess)) return;\n\n inlineObjectProperties(\n binding,\n m.objectProperty(\n propertyKey,\n m.or(m.stringLiteral(), m.numericLiteral()),\n ),\n );\n this.changes++;\n },\n };\n },\n} satisfies Transform;\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport traverse from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport { inlineArrayElements } from \"../ast-utils/inline.ts\";\nimport {\n isReadonlyObject,\n undefinedMatcher,\n varFunctionOrDeclaration,\n} from \"../ast-utils/matcher.ts\";\nimport { renameFast } from \"../ast-utils/rename.ts\";\n\nexport interface StringArray {\n path: NodePath<t.FunctionDeclaration | t.VariableDeclaration>;\n references: NodePath[];\n name: string;\n originalName: string;\n length: number;\n}\n\nexport function findStringArray(ast: t.Node): StringArray | undefined {\n let result: StringArray | undefined;\n const functionName = m.capture(m.anyString());\n const arrayIdentifier = m.capture(m.identifier());\n const arrayExpression = m.capture(\n m.arrayExpression(m.arrayOf(m.or(m.stringLiteral(), undefinedMatcher))),\n );\n // getStringArray = function () { return array; };\n const functionAssignment = m.assignmentExpression(\n \"=\",\n m.identifier(m.fromCapture(functionName)),\n m.functionExpression(\n undefined,\n [],\n m.blockStatement([m.returnStatement(m.fromCapture(arrayIdentifier))]),\n ),\n );\n const variableDeclaration = m.variableDeclaration(undefined, [\n m.variableDeclarator(arrayIdentifier, arrayExpression),\n ]);\n // `function getStringArray() { ... }` or `var getStringArray = function() { ... }`\n const matcher = varFunctionOrDeclaration(\n m.identifier(functionName),\n [],\n m.or(\n // var array = [\"hello\", \"world\"];\n // return (getStringArray = function () { return array; })();\n m.blockStatement([\n variableDeclaration,\n m.returnStatement(m.callExpression(functionAssignment)),\n ]),\n // var array = [\"hello\", \"world\"];\n // getStringArray = function () { return array; });\n // return getStringArray();\n m.blockStatement([\n variableDeclaration,\n m.expressionStatement(functionAssignment),\n m.returnStatement(m.callExpression(m.identifier(functionName))),\n ]),\n ),\n );\n\n function onFunctionFound(\n path: NodePath<t.FunctionDeclaration | t.VariableDeclaration>,\n ) {\n const length = arrayExpression.current!.elements.length;\n const name = functionName.current!;\n const binding = path.scope.getBinding(name)!;\n renameFast(binding, \"__STRING_ARRAY__\");\n\n result = {\n path,\n references: binding.referencePaths,\n originalName: name,\n name: \"__STRING_ARRAY__\",\n length,\n };\n path.stop();\n }\n\n traverse(ast, {\n // Wrapped string array from later javascript-obfuscator versions\n FunctionDeclaration(path) {\n if (matcher.match(path.node)) {\n onFunctionFound(path);\n }\n },\n VariableDeclaration(path) {\n if (matcher.match(path.node)) {\n onFunctionFound(path);\n return;\n }\n\n if (variableDeclaration.match(path.node)) {\n // Simple string array inlining (only `array[0]`, `array[1]` etc references, no rotating/decoding).\n // May be used by older or different obfuscators\n const length = arrayExpression.current!.elements.length;\n const binding = path.scope.getBinding(arrayIdentifier.current!.name)!;\n const memberAccess = m.memberExpression(\n m.fromCapture(arrayIdentifier),\n m.numericLiteral(\n m.matcher((value) => typeof value === \"number\" && value < length),\n ),\n );\n if (!binding.referenced || !isReadonlyObject(binding, memberAccess)) {\n return;\n }\n\n inlineArrayElements(arrayExpression.current!, binding.referencePaths);\n path.remove();\n }\n },\n });\n\n return result;\n}\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type { CallExpression } from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport { createDebug } from \"npm:obug@^2.1.2\";\nimport { generate } from \"../ast-utils/generator.ts\";\nimport type { ArrayRotator } from \"./array-rotator.ts\";\nimport type { Decoder } from \"./decoder.ts\";\nimport type { StringArray } from \"./string-array.ts\";\n\nexport type Sandbox = (code: string) => Promise<unknown>;\n\nexport class VMDecoder {\n decoders: Decoder[];\n private setupCode: string;\n private sandbox: Sandbox;\n\n constructor(\n sandbox: Sandbox,\n stringArray: StringArray,\n decoders: Decoder[],\n rotator?: ArrayRotator,\n ) {\n this.sandbox = sandbox;\n this.decoders = decoders;\n\n // Generate as compact to bypass the self defense\n // (which tests someFunction.toString against a regex)\n const generateOptions = {\n compact: true,\n shouldPrintComment: () => false,\n };\n const stringArrayCode = generate(stringArray.path.node, generateOptions);\n const decoderCode = decoders\n .map((decoder) => generate(decoder.path.node, generateOptions))\n .join(\";\\n\");\n const rotatorCode = rotator ? generate(rotator.node, generateOptions) : \"\";\n\n this.setupCode = [stringArrayCode, decoderCode, rotatorCode].join(\";\\n\");\n }\n\n async decode(calls: NodePath<CallExpression>[]): Promise<unknown[]> {\n const code = `(() => {\n ${this.setupCode}\n return [${calls.join(\",\")}]\n })()`;\n\n try {\n const result = await this.sandbox(code);\n return result as unknown[];\n } catch (error) {\n createDebug(\"webcrack:deobfuscate\")(\"vm code:\", code);\n if (\n error instanceof Error &&\n (error.message.includes(\"undefined symbol\") ||\n error.message.includes(\"Segmentation fault\"))\n ) {\n throw new Error(\n \"isolated-vm version mismatch. Check https://webcrack.netlify.app/docs/guide/common-errors.html#isolated-vm\",\n { cause: error },\n );\n }\n throw error;\n }\n }\n}\n", "import { createDebug } from \"npm:obug@^2.1.2\";\nimport {\n applyTransform,\n applyTransformAsync,\n applyTransforms,\n type AsyncTransform,\n} from \"../ast-utils/transform.ts\";\nimport mergeStrings from \"../unminify/merge-strings.ts\";\nimport { findArrayRotator } from \"./array-rotator.ts\";\nimport controlFlowObject from \"./control-flow-object.ts\";\nimport controlFlowSwitch from \"./control-flow-switch.ts\";\nimport deadCode from \"./dead-code.ts\";\nimport { findDecoders } from \"./decoder.ts\";\nimport inlineDecodedStrings from \"./inline-decoded-strings.ts\";\nimport inlineDecoderWrappers from \"./inline-decoder-wrappers.ts\";\nimport inlineObjectProps from \"./inline-object-props.ts\";\nimport { findStringArray } from \"./string-array.ts\";\nimport { type Sandbox, VMDecoder } from \"./vm.ts\";\n\n// https://astexplorer.net/#/gist/b1018df4a8daebfcb1daf9d61fe17557/4ff9ad0e9c40b9616956f17f59a2d9888cd62a4f\n\nexport default {\n name: \"deobfuscate\",\n tags: [\"unsafe\"],\n scope: true,\n async run(ast, state, sandbox) {\n if (!sandbox) return;\n\n const logger = createDebug(\"webcrack:deobfuscate\");\n const stringArray = findStringArray(ast);\n logger(\n stringArray\n ? `String Array: ${stringArray.originalName}, length ${stringArray.length}`\n : \"String Array: no\",\n );\n if (!stringArray) return;\n\n const rotator = findArrayRotator(stringArray);\n logger(`String Array Rotate: ${rotator ? \"yes\" : \"no\"}`);\n\n const decoders = findDecoders(stringArray);\n logger(\n `String Array Decoders: ${\n decoders\n .map((d) => d.originalName)\n .join(\", \")\n }`,\n );\n\n state.changes += applyTransform(ast, inlineObjectProps).changes;\n\n for (const decoder of decoders) {\n state.changes += applyTransform(\n ast,\n inlineDecoderWrappers,\n decoder,\n ).changes;\n }\n\n const vm = new VMDecoder(sandbox, stringArray, decoders, rotator);\n state.changes += (\n await applyTransformAsync(ast, inlineDecodedStrings, { vm })\n ).changes;\n\n if (decoders.length > 0) {\n stringArray.path.remove();\n rotator?.remove();\n decoders.forEach((decoder) => decoder.path.remove());\n state.changes += 2 + decoders.length;\n }\n\n state.changes += applyTransforms(\n ast,\n [mergeStrings, deadCode, controlFlowObject, controlFlowSwitch],\n { noScope: true },\n ).changes;\n },\n} satisfies AsyncTransform<Sandbox>;\n", "import type { Binding, NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport {\n constObjectProperty,\n findParent,\n safeLiteral,\n} from \"../ast-utils/matcher.ts\";\n\n/**\n * Merges object assignments into the object expression.\n * Example:\n * ```js\n * const obj = {};\n * obj.foo = 'bar';\n * ```\n * ->\n * ```js\n * const obj = { foo: 'bar' };\n * ```\n */\nexport default {\n name: \"merge-object-assignments\",\n tags: [\"safe\"],\n scope: true,\n visitor: () => {\n const id = m.capture(m.identifier());\n const object = m.capture(m.objectExpression([]));\n // Example: const obj = {};\n const varMatcher = m.variableDeclaration(undefined, [\n m.variableDeclarator(id, object),\n ]);\n const key = m.capture(m.anyExpression());\n const computed = m.capture<boolean>(m.anything());\n const value = m.capture(m.anyExpression());\n // Example: obj.foo = 'bar';\n const assignmentMatcher = m.expressionStatement(\n m.assignmentExpression(\n \"=\",\n m.memberExpression(m.fromCapture(id), key, computed),\n value,\n ),\n );\n\n return {\n Program(path) {\n // No idea why this is needed, crashes otherwise.\n path.scope.crawl();\n },\n VariableDeclaration: {\n exit(path) {\n if (!path.inList || !varMatcher.match(path.node)) return;\n\n const binding = path.scope.getBinding(id.current!.name)!;\n const container = path.container as t.Statement[];\n const siblingIndex = (path.key as number) + 1;\n\n while (siblingIndex < container.length) {\n const sibling = path.getSibling(siblingIndex);\n if (\n !assignmentMatcher.match(sibling.node) ||\n hasCircularReference(value.current!, binding)\n ) {\n return;\n }\n\n // { [1]: value, \"foo bar\": value } can be simplified to { 1: value, \"foo bar\": value }\n const isComputed = computed.current! &&\n key.current!.type !== \"NumericLiteral\" &&\n key.current!.type !== \"StringLiteral\";\n\n // Example: const obj = { x: 1 }; obj.foo = 'bar'; -> const obj = { x: 1, foo: 'bar' };\n object.current!.properties.push(\n t.objectProperty(key.current!, value.current!, isComputed),\n );\n\n sibling.remove();\n binding.dereference();\n binding.referencePaths.shift();\n\n // Example: const obj = { foo: 'bar' }; return obj; -> return { foo: 'bar' };\n if (\n binding.references === 1 &&\n inlineableObject.match(object.current) &&\n !isRepeatedCallReference(binding, binding.referencePaths[0])\n ) {\n binding.referencePaths[0].replaceWith(object.current);\n path.remove();\n this.changes++;\n }\n }\n },\n },\n };\n },\n} satisfies Transform;\n\n/**\n * Used to avoid \"Cannot access 'obj' before initialization\" errors.\n */\nfunction hasCircularReference(node: t.Node, binding: Binding) {\n return (\n // obj.foo = obj;\n binding.referencePaths.some((path) => path.find((p) => p.node === node)) ||\n // obj.foo = fn(); where fn could reference the binding or not, for simplicity we assume it does.\n m.containerOf(m.callExpression()).match(node)\n );\n}\n\nconst repeatedCallMatcher = m.or(\n m.forStatement(),\n m.forOfStatement(),\n m.forInStatement(),\n m.whileStatement(),\n m.doWhileStatement(),\n m.function(),\n m.objectMethod(),\n m.classBody(),\n);\n\n/**\n * Returns true when the reference can be evaluated multiple times.\n * In that case, the object should not be inlined to avoid creating multiple instances.\n * Structure: Block{ binding, Repeatable{reference} }\n */\nfunction isRepeatedCallReference(binding: Binding, reference: NodePath) {\n const block = binding.scope.getBlockParent().path;\n const repeatable = findParent(reference, repeatedCallMatcher);\n return repeatable?.isDescendant(block);\n}\n\n/**\n * Only literals, arrays and objects are allowed because variable values\n * might be different in the place the object will be inlined.\n */\nconst inlineableObject: m.Matcher<t.Expression> = m.matcher((node) =>\n m\n .or(\n safeLiteral,\n m.arrayExpression(m.arrayOf(inlineableObject)),\n m.objectExpression(m.arrayOf(constObjectProperty(inlineableObject))),\n )\n .match(node)\n);\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport {\n constMemberExpression,\n falseMatcher,\n findParent,\n iife,\n trueMatcher,\n} from \"../ast-utils/matcher.ts\";\n\n// SingleCallController: https://github.com/javascript-obfuscator/javascript-obfuscator/blob/d7f73935557b2cd15a2f7cd0b01017d9cddbd015/src/custom-code-helpers/common/templates/SingleCallControllerTemplate.ts\n\n// Works for\n// self defending: https://github.com/javascript-obfuscator/javascript-obfuscator/blob/d7f73935557b2cd15a2f7cd0b01017d9cddbd015/src/custom-code-helpers/self-defending/templates/SelfDefendingTemplate.ts\n// domain lock: https://github.com/javascript-obfuscator/javascript-obfuscator/blob/d7f73935557b2cd15a2f7cd0b01017d9cddbd015/src/custom-code-helpers/domain-lock/templates/DomainLockTemplate.ts\n// console output: https://github.com/javascript-obfuscator/javascript-obfuscator/blob/d7f73935557b2cd15a2f7cd0b01017d9cddbd015/src/custom-code-helpers/console-output/templates/ConsoleOutputDisableTemplate.ts\n// debug protection function call: https://github.com/javascript-obfuscator/javascript-obfuscator/blob/d7f73935557b2cd15a2f7cd0b01017d9cddbd015/src/custom-code-helpers/debug-protection/templates/debug-protection-function-call/DebugProtectionFunctionCallTemplate.ts\n\nexport default {\n name: \"self-defending\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const callController = m.capture(m.anyString());\n const firstCall = m.capture(m.identifier());\n const rfn = m.capture(m.identifier());\n const context = m.capture(m.identifier());\n const res = m.capture(m.identifier());\n const fn = m.capture(m.identifier());\n\n // const callControllerFunctionName = (function() { ... })();\n const matcher = m.variableDeclarator(\n m.identifier(callController),\n iife(\n [],\n m.blockStatement([\n // let firstCall = true;\n m.variableDeclaration(undefined, [\n m.variableDeclarator(firstCall, trueMatcher),\n ]),\n // return function (context, fn) {\n m.returnStatement(\n m.functionExpression(\n null,\n [context, fn],\n m.blockStatement([\n m.variableDeclaration(undefined, [\n // const rfn = firstCall ? function() {\n m.variableDeclarator(\n rfn,\n m.conditionalExpression(\n m.fromCapture(firstCall),\n m.functionExpression(\n null,\n [],\n m.blockStatement([\n // if (fn) {\n m.ifStatement(\n m.fromCapture(fn),\n m.blockStatement([\n // const res = fn.apply(context, arguments);\n m.variableDeclaration(undefined, [\n m.variableDeclarator(\n res,\n m.callExpression(\n constMemberExpression(\n m.fromCapture(fn),\n \"apply\",\n ),\n [\n m.fromCapture(context),\n m.identifier(\"arguments\"),\n ],\n ),\n ),\n ]),\n // fn = null;\n m.expressionStatement(\n m.assignmentExpression(\n \"=\",\n m.fromCapture(fn),\n m.nullLiteral(),\n ),\n ),\n // return res;\n m.returnStatement(m.fromCapture(res)),\n ]),\n ),\n ]),\n ),\n // : function() {}\n m.functionExpression(null, [], m.blockStatement([])),\n ),\n ),\n ]),\n // firstCall = false;\n m.expressionStatement(\n m.assignmentExpression(\n \"=\",\n m.fromCapture(firstCall),\n falseMatcher,\n ),\n ),\n // return rfn;\n m.returnStatement(m.fromCapture(rfn)),\n ]),\n ),\n ),\n ]),\n ),\n );\n\n const emptyIife = iife([], m.blockStatement([]));\n\n return {\n VariableDeclarator(path) {\n if (!matcher.match(path.node)) return;\n const binding = path.scope.getBinding(callController.current!);\n if (!binding) return;\n // const callControllerFunctionName = (function() { ... })();\n // ^ path/binding\n\n binding.referencePaths\n .filter((ref) => ref.parent.type === \"CallExpression\")\n .forEach((ref) => {\n if (ref.parentPath?.parent.type === \"CallExpression\") {\n // callControllerFunctionName(this, function () { ... })();\n // ^ ref\n ref.parentPath.parentPath?.remove();\n } else {\n // const selfDefendingFunctionName = callControllerFunctionName(this, function () {\n // selfDefendingFunctionName(); ^ ref\n removeSelfDefendingRefs(ref as NodePath<t.Identifier>);\n }\n\n // leftover (function () {})() from debug protection function call\n findParent(ref, emptyIife)?.remove();\n\n this.changes++;\n });\n\n path.remove();\n this.changes++;\n },\n };\n },\n} satisfies Transform;\n\nfunction removeSelfDefendingRefs(path: NodePath<t.Identifier>) {\n const varName = m.capture(m.anyString());\n const varMatcher = m.variableDeclarator(\n m.identifier(varName),\n m.callExpression(m.identifier(path.node.name)),\n );\n const callMatcher = m.expressionStatement(\n m.callExpression(m.identifier(m.fromCapture(varName)), []),\n );\n const varDecl = findParent(path, varMatcher);\n\n if (varDecl) {\n const binding = varDecl.scope.getBinding(varName.current!);\n\n binding?.referencePaths.forEach((ref) => {\n if (callMatcher.match(ref.parentPath?.parent)) {\n ref.parentPath?.parentPath?.remove();\n }\n });\n varDecl.remove();\n }\n}\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"block-statements\",\n tags: [\"safe\"],\n visitor: () => ({\n IfStatement: {\n exit(path) {\n if (\n !t.isBlockStatement(path.node.consequent) &&\n !t.isEmptyStatement(path.node.consequent)\n ) {\n path.node.consequent = t.blockStatement([path.node.consequent]);\n\n this.changes++;\n }\n if (path.node.alternate && !t.isBlockStatement(path.node.alternate)) {\n path.node.alternate = t.blockStatement([path.node.alternate]);\n this.changes++;\n }\n },\n },\n Loop: {\n exit(path) {\n if (\n !t.isBlockStatement(path.node.body) &&\n !t.isEmptyStatement(path.node.body)\n ) {\n path.node.body = t.blockStatement([path.node.body]);\n\n this.changes++;\n }\n },\n },\n ArrowFunctionExpression: {\n exit(path) {\n if (t.isSequenceExpression(path.node.body)) {\n path.node.body = t.blockStatement([\n t.returnStatement(path.node.body),\n ]);\n\n this.changes++;\n }\n },\n },\n }),\n} satisfies Transform;\n", "export * from \"npm:@babel/helper-validator-identifier@^8.0.0-rc.5\";\n", "import { isIdentifierName } from \"jsr:/@codemod/utils@^2.2.1/babel-helper-validator-identifier\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"computed-properties\",\n tags: [\"safe\"],\n visitor() {\n const stringMatcher = m.capture(\n m.stringLiteral(\n m.matcher((value) =>\n typeof value === \"string\" && isIdentifierName(value)\n ),\n ),\n );\n const propertyMatcher = m.or(\n m.memberExpression(m.anything(), stringMatcher, true),\n m.optionalMemberExpression(m.anything(), stringMatcher, true),\n );\n const keyMatcher = m.or(\n m.objectProperty(stringMatcher),\n m.classProperty(stringMatcher),\n m.objectMethod(undefined, stringMatcher),\n m.classMethod(undefined, stringMatcher),\n );\n\n return {\n \"MemberExpression|OptionalMemberExpression\": {\n exit(path) {\n if (!propertyMatcher.match(path.node)) return;\n path.node.computed = false;\n path.node.property = t.identifier(stringMatcher.current!.value);\n this.changes++;\n },\n },\n \"ObjectProperty|ClassProperty|ObjectMethod|ClassMethod\": {\n exit(path) {\n if (!keyMatcher.match(path.node)) return;\n if (\n (path.type === \"ClassMethod\" &&\n stringMatcher.current!.value === \"constructor\") ||\n (path.type === \"ObjectProperty\" &&\n stringMatcher.current!.value === \"__proto__\")\n ) {\n return;\n }\n\n path.node.computed = false;\n path.node.key = t.identifier(stringMatcher.current!.value);\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"for-to-while\",\n tags: [\"safe\"],\n visitor() {\n return {\n ForStatement: {\n exit(path) {\n const { test, body, init, update } = path.node;\n if (init || update) return;\n path.replaceWith(\n t.whileStatement(test ?? t.booleanLiteral(true), body),\n );\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"infinity\",\n tags: [\"safe\"],\n scope: true,\n visitor: () => {\n const infinityMatcher = m.binaryExpression(\n \"/\",\n m.numericLiteral(1),\n m.numericLiteral(0),\n );\n const negativeInfinityMatcher = m.binaryExpression(\n \"/\",\n m.unaryExpression(\"-\", m.numericLiteral(1)),\n m.numericLiteral(0),\n );\n\n return {\n BinaryExpression: {\n exit(path) {\n if (path.scope.hasBinding(\"Infinity\", { noGlobals: true })) return;\n\n if (infinityMatcher.match(path.node)) {\n path.replaceWith(t.identifier(\"Infinity\"));\n this.changes++;\n } else if (negativeInfinityMatcher.match(path.node)) {\n path.replaceWith(t.unaryExpression(\"-\", t.identifier(\"Infinity\")));\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\n// >, >=, <, <= are not invertible because NaN <= 0 is false and NaN > 0 is false\n// https://tc39.es/ecma262/multipage/abstract-operations.html#sec-islessthan\n\nconst INVERTED_BINARY_OPERATORS = {\n \"==\": \"!=\",\n \"===\": \"!==\",\n \"!=\": \"==\",\n \"!==\": \"===\",\n} as const;\n\nconst INVERTED_LOGICAL_OPERATORS = {\n \"||\": \"&&\",\n \"&&\": \"||\",\n} as const;\n\nexport default {\n name: \"invert-boolean-logic\",\n tags: [\"safe\"],\n visitor: () => {\n const logicalExpression = m.logicalExpression(\n m.or(\"&&\", \"||\"),\n );\n const logicalMatcher = m.unaryExpression(\"!\", logicalExpression);\n\n const binaryExpression = m.capture(\n m.binaryExpression(m.or(\"!=\", \"!==\", \"==\", \"===\")),\n );\n const binaryMatcher = m.unaryExpression(\"!\", binaryExpression);\n\n return {\n UnaryExpression: {\n exit(path) {\n const { argument } = path.node;\n\n if (binaryMatcher.match(path.node)) {\n binaryExpression.current!.operator = INVERTED_BINARY_OPERATORS[\n binaryExpression.current!\n .operator as keyof typeof INVERTED_BINARY_OPERATORS\n ];\n\n path.replaceWith(binaryExpression.current!);\n this.changes++;\n } else if (logicalMatcher.match(path.node)) {\n let current = argument;\n while (logicalExpression.match(current)) {\n current.operator = INVERTED_LOGICAL_OPERATORS[\n current.operator as keyof typeof INVERTED_LOGICAL_OPERATORS\n ];\n\n current.right = t.unaryExpression(\"!\", current.right);\n if (!logicalExpression.match(current.left)) {\n current.left = t.unaryExpression(\"!\", current.left);\n }\n current = current.left;\n }\n\n path.replaceWith(argument);\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import { parseExpression } from \"jsr:@codemod/parser@^2.1.0\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { constMemberExpression } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"json-parse\",\n tags: [\"safe\"],\n scope: true,\n visitor: () => {\n const string = m.capture(m.anyString());\n const matcher = m.callExpression(constMemberExpression(\"JSON\", \"parse\"), [\n m.stringLiteral(string),\n ]);\n\n return {\n CallExpression: {\n exit(path) {\n if (\n matcher.match(path.node) &&\n !path.scope.hasBinding(\"JSON\", { noGlobals: true })\n ) {\n try {\n JSON.parse(string.current!);\n const parsed = parseExpression(string.current!);\n path.replaceWith(parsed);\n this.changes++;\n } catch {\n // ignore\n }\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import { statement } from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"logical-to-if\",\n tags: [\"safe\"],\n visitor: () => {\n const buildIf = statement`if (TEST) { BODY; }`;\n const buildIfNot = statement`if (!TEST) { BODY; }`;\n\n return {\n ExpressionStatement: {\n exit(path) {\n const expression = path.node.expression as t.LogicalExpression;\n if (!t.isLogicalExpression(expression)) return;\n if (expression.operator === \"&&\") {\n path.replaceWith(\n buildIf({\n TEST: expression.left,\n BODY: expression.right,\n }),\n );\n this.changes++;\n } else if (expression.operator === \"||\") {\n path.replaceWith(\n buildIfNot({\n TEST: expression.left,\n BODY: expression.right,\n }),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"merge-else-if\",\n tags: [\"safe\"],\n visitor() {\n const nestedIf = m.capture(m.ifStatement());\n const matcher = m.ifStatement(\n m.anything(),\n m.anything(),\n m.blockStatement([nestedIf]),\n );\n\n return {\n IfStatement: {\n exit(path) {\n if (matcher.match(path.node)) {\n path.node.alternate = nestedIf.current;\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"number-expressions\",\n tags: [\"safe\"],\n visitor: () => ({\n \"BinaryExpression|UnaryExpression\": {\n exit(path) {\n if (!matcher.match(path.node)) return;\n const evaluated = path.evaluate();\n if (\n t.isBinaryExpression(path.node, { operator: \"/\" }) &&\n !Number.isInteger(evaluated.value)\n ) {\n return;\n }\n path.replaceWith(t.valueToNode(evaluated.value));\n path.skip();\n this.changes++;\n },\n },\n }),\n} satisfies Transform;\n\nconst matcher = m.or(\n m.unaryExpression(\"-\", m.or(m.stringLiteral(), m.numericLiteral())),\n m.binaryExpression(\n m.or(\"+\", \"-\", \"/\", \"%\", \"*\", \"**\", \"&\", \"|\", \">>\", \">>>\", \"<<\", \"^\"),\n m.or(\n m.stringLiteral(),\n m.numericLiteral(),\n m.unaryExpression(\"-\", m.numericLiteral()),\n ),\n m.or(\n m.stringLiteral(),\n m.numericLiteral(),\n m.unaryExpression(\"-\", m.numericLiteral()),\n ),\n ),\n);\n", "import type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"raw-literals\",\n tags: [\"safe\"],\n visitor: () => ({\n StringLiteral(path) {\n if (path.node.extra) {\n path.node.extra = undefined;\n this.changes++;\n }\n },\n NumericLiteral(path) {\n if (path.node.extra) {\n path.node.extra = undefined;\n this.changes++;\n }\n },\n }),\n} satisfies Transform;\n", "import type { NodePath } from \"jsr:/@codemod/utils@^2.2.1/babel-traverse\";\nimport * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { constMemberExpression } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"remove-double-not\",\n tags: [\"safe\"],\n visitor() {\n const expression = m.capture(m.anyExpression());\n const doubleNot = m.unaryExpression(\n \"!\",\n m.unaryExpression(\"!\", expression),\n );\n const tripleNot = m.unaryExpression(\"!\", doubleNot);\n const arrayCall = m.callExpression(\n constMemberExpression(\n m.arrayExpression(),\n m.or(\n \"filter\",\n \"find\",\n \"findLast\",\n \"findIndex\",\n \"findLastIndex\",\n \"some\",\n \"every\",\n ),\n ),\n [m.arrowFunctionExpression(m.anything(), doubleNot)],\n );\n\n return {\n Conditional: {\n exit(path) {\n if (doubleNot.match(path.node.test)) {\n path.get(\"test\").replaceWith(expression.current!);\n this.changes++;\n }\n },\n },\n UnaryExpression: {\n exit(path) {\n if (tripleNot.match(path.node)) {\n path.replaceWith(t.unaryExpression(\"!\", expression.current!));\n this.changes++;\n }\n },\n },\n CallExpression: {\n exit(path) {\n if (arrayCall.match(path.node)) {\n (path.get(\"arguments.0.body\") as NodePath).replaceWith(\n expression.current!,\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\nimport { safeLiteral } from \"../ast-utils/matcher.ts\";\n\nexport default {\n name: \"sequence\",\n tags: [\"safe\"],\n visitor() {\n // To retain the evaluation order of `<anything> = (x(), y());`, only identifiers and member expressions are allowed.\n // `obj.foo.bar = (x(), y());` would trigger the getter for `obj.foo` before `x()` is evaluated.\n const assignmentVariable = m.or(\n m.identifier(),\n m.memberExpression(m.identifier(), m.or(m.identifier(), safeLiteral)),\n );\n const assignedSequence = m.capture(m.sequenceExpression());\n const assignmentMatcher = m.assignmentExpression(\n // \"||=\", \"&&=\", and \"??=\" have short-circuiting behavior\n m.or(\n \"=\",\n \"+=\",\n \"-=\",\n \"*=\",\n \"/=\",\n \"%=\",\n \"**=\",\n \"<<=\",\n \">>=\",\n \">>>=\",\n \"|=\",\n \"^=\",\n \"&=\",\n ),\n assignmentVariable,\n assignedSequence,\n );\n\n return {\n Block(path) {\n // PERF: Fast path (reached ~70% of the time):\n // expand ExpressionStatement(Sequence) and ReturnStatement(Sequence)\n // into multiple statements by allocating new array once instead of\n // splicing for each match.\n const startIndex = path.node.body.findIndex(\n (stmt) =>\n (t.isExpressionStatement(stmt) &&\n t.isSequenceExpression(stmt.expression)) ||\n (t.isReturnStatement(stmt) &&\n t.isSequenceExpression(stmt.argument)),\n );\n if (startIndex === -1) return;\n\n const newBody: t.Statement[] = path.node.body.slice(0, startIndex);\n for (let i = startIndex; i < path.node.body.length; i++) {\n const stmt = path.node.body[i];\n if (\n t.isExpressionStatement(stmt) &&\n t.isSequenceExpression(stmt.expression)\n ) {\n stmt.expression.expressions.forEach((expr) => {\n newBody.push(t.expressionStatement(expr));\n });\n } else if (\n t.isReturnStatement(stmt) &&\n t.isSequenceExpression(stmt.argument)\n ) {\n for (let i = 0; i < stmt.argument.expressions.length - 1; i++) {\n newBody.push(t.expressionStatement(stmt.argument.expressions[i]));\n }\n stmt.argument = stmt.argument.expressions.at(-1);\n newBody.push(stmt);\n } else {\n newBody.push(stmt);\n }\n }\n this.changes += newBody.length - path.node.body.length;\n path.node.body = newBody;\n },\n AssignmentExpression: {\n exit(path) {\n if (!assignmentMatcher.match(path.node)) return;\n\n const { expressions } = assignedSequence.current!;\n path.node.right = expressions.pop()!;\n const newNodes = path.parentPath.isExpressionStatement()\n ? expressions.map(t.expressionStatement)\n : expressions;\n path.insertBefore(newNodes);\n this.changes++;\n },\n },\n ExpressionStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.expression)) return;\n\n const statements = path.node.expression.expressions.map(\n t.expressionStatement,\n );\n path.replaceWithMultiple(statements);\n this.changes++;\n },\n },\n ReturnStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.argument)) return;\n\n const { expressions } = path.node.argument;\n path.node.argument = expressions.pop();\n const statements = expressions.map(t.expressionStatement);\n path.insertBefore(statements);\n this.changes++;\n },\n },\n IfStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.test)) return;\n\n const { expressions } = path.node.test;\n path.node.test = expressions.pop()!;\n const statements = expressions.map(t.expressionStatement);\n path.insertBefore(statements);\n this.changes++;\n },\n },\n SwitchStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.discriminant)) return;\n\n const { expressions } = path.node.discriminant;\n path.node.discriminant = expressions.pop()!;\n const statements = expressions.map(t.expressionStatement);\n path.insertBefore(statements);\n this.changes++;\n },\n },\n ThrowStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.argument)) return;\n\n const { expressions } = path.node.argument;\n path.node.argument = expressions.pop()!;\n const statements = expressions.map(t.expressionStatement);\n path.insertBefore(statements);\n this.changes++;\n },\n },\n ForInStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.right)) return;\n\n const { expressions } = path.node.right;\n path.node.right = expressions.pop()!;\n const statements = expressions.map(t.expressionStatement);\n path.insertBefore(statements);\n this.changes++;\n },\n },\n ForOfStatement: {\n exit(path) {\n if (!t.isSequenceExpression(path.node.right)) return;\n\n const { expressions } = path.node.right;\n path.node.right = expressions.pop()!;\n const statements = expressions.map(t.expressionStatement);\n path.insertBefore(statements);\n this.changes++;\n },\n },\n ForStatement: {\n exit(path) {\n if (t.isSequenceExpression(path.node.init)) {\n const statements = path.node.init.expressions.map(\n t.expressionStatement,\n );\n path.node.init = null;\n path.insertBefore(statements);\n this.changes++;\n }\n if (\n t.isSequenceExpression(path.node.update) &&\n path.node.body.type === \"EmptyStatement\"\n ) {\n const { expressions } = path.node.update;\n path.node.update = expressions.pop()!;\n const statements = expressions.map(t.expressionStatement);\n path.node.body = t.blockStatement(statements);\n this.changes++;\n }\n },\n },\n VariableDeclaration: {\n exit(path) {\n const sequence = m.capture(m.sequenceExpression());\n const matcher = m.variableDeclaration(undefined, [\n m.variableDeclarator(undefined, sequence),\n ]);\n if (!matcher.match(path.node)) return;\n\n const { expressions } = sequence.current!;\n path.node.declarations[0].init = expressions.pop();\n const statements = expressions.map(t.expressionStatement);\n path.getStatementParent()?.insertBefore(statements);\n this.changes++;\n },\n },\n SequenceExpression: {\n exit(path) {\n const { expressions } = path.node;\n if (expressions.every((node) => safeLiteral.match(node))) {\n path.replaceWith(expressions.at(-1)!);\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nconst matcher = m.forStatement(\n m.variableDeclaration(\"var\", m.arrayOf(m.variableDeclarator(m.identifier()))),\n);\n\n// This contains some overlapping logic with the \"split-variable-declarations\" transform\n// but is done separately because it also works with a single variable and we want to avoid\n// accessing scope in the prepare stage for performance reasons.\nexport default {\n name: \"split-for-loop-vars\",\n tags: [\"safe\"],\n scope: true,\n visitor: () => ({\n ForStatement: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n const { init, test, update } = path.node;\n const { declarations } = init as t.VariableDeclaration;\n\n for (let i = 0; i < declarations.length; i++) {\n const declarator = declarations[i];\n const binding = path.scope.getBinding(\n (declarator.id as t.Identifier).name,\n );\n if (!binding) break;\n\n const isUsedInTestOrUpdate =\n binding.constantViolations.some((reference) =>\n reference.find((p) => p.node === test || p.node === update)\n ) ||\n binding.referencePaths.some((reference) =>\n reference.find((p) => p.node === test || p.node === update)\n );\n if (isUsedInTestOrUpdate) break;\n\n const [replacement] = path.insertBefore(\n t.variableDeclaration(\"var\", [declarator]),\n );\n binding.path = replacement.get(\"declarations.0\");\n declarations.shift();\n i--;\n this.changes++;\n }\n\n if (declarations.length === 0) path.get(\"init\").remove();\n },\n },\n }),\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nfunction isMultiDeclaration(\n stmt: t.Node | null | undefined,\n): stmt is t.VariableDeclaration {\n return t.isVariableDeclaration(stmt) && stmt.declarations.length > 1;\n}\n\nfunction isMultiExport(\n stmt: t.Node | null | undefined,\n): stmt is t.ExportNamedDeclaration {\n return (\n t.isExportNamedDeclaration(stmt) && isMultiDeclaration(stmt.declaration)\n );\n}\n\nfunction isMultiDeclarationFor(\n stmt: t.Node | null | undefined,\n): stmt is t.ForStatement {\n return (\n t.isForStatement(stmt) &&\n !stmt.test &&\n !stmt.update &&\n isMultiDeclaration(stmt.init) &&\n stmt.init.kind === \"var\"\n );\n}\n\nexport default {\n name: \"split-variable-declarations\",\n tags: [\"safe\"],\n visitor: () => ({\n Block(path) {\n // PERF: Fast path (reached ~99% of the time)\n // expand into multiple variable declarations by allocating new array\n // once instead of splicing for each match.\n const startIndex = path.node.body.findIndex(\n (stmt) =>\n isMultiDeclaration(stmt) ||\n isMultiDeclarationFor(stmt) ||\n isMultiExport(stmt),\n );\n if (startIndex === -1) return;\n\n const newBody: t.Statement[] = path.node.body.slice(0, startIndex);\n\n for (let i = startIndex; i < path.node.body.length; i++) {\n const stmt = path.node.body[i];\n if (isMultiDeclaration(stmt)) {\n stmt.declarations.forEach((decl) => {\n newBody.push(t.variableDeclaration(stmt.kind, [decl]));\n });\n } else if (isMultiDeclarationFor(stmt)) {\n const declaration = stmt.init as t.VariableDeclaration;\n declaration.declarations.forEach((decl) => {\n newBody.push(t.variableDeclaration(\"var\", [decl]));\n });\n stmt.init = null;\n newBody.push(stmt);\n } else if (isMultiExport(stmt)) {\n const declaration = stmt.declaration as t.VariableDeclaration;\n declaration.declarations.forEach((decl) => {\n newBody.push(\n t.exportNamedDeclaration(\n t.variableDeclaration(declaration.kind, [decl]),\n ),\n );\n });\n } else {\n newBody.push(stmt);\n }\n }\n\n this.changes += newBody.length - path.node.body.length;\n path.node.body = newBody;\n },\n VariableDeclaration: {\n exit(path) {\n if (path.node.declarations.length > 1) {\n // E.g. for (var i = 0, j = 1;;)\n if (path.key === \"init\" && path.parentPath.isForStatement()) {\n if (\n !path.parentPath.node.test &&\n !path.parentPath.node.update &&\n path.node.kind === \"var\"\n ) {\n path.parentPath.insertBefore(\n path.node.declarations.map((declaration) =>\n t.variableDeclaration(path.node.kind, [declaration])\n ),\n );\n path.remove();\n this.changes++;\n }\n } else {\n if (path.parentPath.isExportNamedDeclaration()) {\n path.parentPath.replaceWithMultiple(\n path.node.declarations.map((declaration) =>\n t.exportNamedDeclaration(\n t.variableDeclaration(path.node.kind, [declaration]),\n )\n ),\n );\n } else {\n path.replaceWithMultiple(\n path.node.declarations.map((declaration) =>\n t.variableDeclaration(path.node.kind, [declaration])\n ),\n );\n }\n this.changes++;\n }\n }\n },\n },\n }),\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"string-literal-in-template-literal\",\n tags: [\"safe\"],\n visitor: () => ({\n TemplateLiteral(path) {\n // inline string literals in template literals\n // e.g. `Hello ${'World'}!` -> `Hello World!`\n for (let i = 0; i < path.node.expressions.length; i++) {\n const expr = path.node.expressions[i];\n if (t.isStringLiteral(expr)) {\n path.node.expressions.splice(i, 1);\n const main = path.node.quasis[i];\n main.value.raw += expr.value;\n\n const next = path.node.quasis[i + 1];\n if (next) {\n main.value.raw += next.value.raw;\n path.node.quasis.splice(i + 1, 1);\n }\n\n this.changes++;\n i--;\n }\n }\n },\n }),\n} satisfies Transform;\n", "import { statement } from \"jsr:/@codemod/utils@^2.2.1/babel-template\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"ternary-to-if\",\n tags: [\"safe\"],\n visitor() {\n const test = m.capture(m.anyExpression());\n const consequent = m.capture(m.anyExpression());\n const alternate = m.capture(m.anyExpression());\n const conditional = m.conditionalExpression(test, consequent, alternate);\n\n const buildIf = statement`if (TEST) { CONSEQUENT; } else { ALTERNATE; }`;\n const buildIfReturn =\n statement`if (TEST) { return CONSEQUENT; } else { return ALTERNATE; }`;\n\n return {\n ExpressionStatement: {\n exit(path) {\n if (conditional.match(path.node.expression)) {\n path.replaceWith(\n buildIf({\n TEST: test.current,\n CONSEQUENT: consequent.current,\n ALTERNATE: alternate.current,\n }),\n );\n this.changes++;\n }\n },\n },\n ReturnStatement: {\n exit(path) {\n if (conditional.match(path.node.argument)) {\n path.replaceWith(\n buildIfReturn({\n TEST: test.current,\n CONSEQUENT: consequent.current,\n ALTERNATE: alternate.current,\n }),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"truncate-number-literal\",\n tags: [\"safe\"],\n visitor: () => {\n const binaryOperators: m.Matcher<\"|\" | \"&\" | \"^\" | \"<<\" | \">>\" | \">>>\"> = m\n .or(\"|\", \"&\", \"^\", \"<<\", \">>\", \">>>\");\n const literal = m.capture(m.numericLiteral());\n const matcher = m.or(\n m.binaryExpression(binaryOperators, literal, m.anything()),\n m.binaryExpression(binaryOperators, m.anything(), literal),\n );\n\n return {\n BinaryExpression: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n\n const value = literal.current!.value;\n\n const isShifter = literal.current! === path.node.right &&\n (path.node.operator === \"<<\" || path.node.operator === \">>\");\n const truncation = isShifter ? 31 : 0xffffffff;\n const truncated = value & truncation;\n\n if (truncated === value) return;\n\n literal.current!.value = truncated;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nconst OPERATOR_MAP = {\n \">\": \"===\",\n \"<\": \"!==\",\n} as const;\n\nexport default {\n name: \"typeof-undefined\",\n tags: [\"safe\"],\n visitor() {\n const operator = m.capture(m.or(\">\" as const, \"<\" as const));\n const argument = m.capture(m.anyExpression());\n const matcher = m.binaryExpression(\n operator,\n m.unaryExpression(\"typeof\", argument),\n m.stringLiteral(\"u\"),\n );\n return {\n BinaryExpression: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n path.replaceWith(\n t.binaryExpression(\n OPERATOR_MAP[operator.current!],\n t.unaryExpression(\"typeof\", argument.current!),\n t.stringLiteral(\"undefined\"),\n ),\n );\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"unary-expressions\",\n tags: [\"safe\"],\n visitor() {\n const argument = m.capture(m.anyExpression());\n const matcher = m.expressionStatement(\n m.unaryExpression(m.or(\"void\", \"!\", \"typeof\"), argument),\n );\n const returnVoid = m.returnStatement(m.unaryExpression(\"void\", argument));\n return {\n ExpressionStatement: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n path.replaceWith(argument.current!);\n this.changes++;\n },\n },\n ReturnStatement: {\n exit(path) {\n if (!returnVoid.match(path.node)) return;\n path.replaceWith(argument.current!);\n path.insertAfter(t.returnStatement());\n this.changes++;\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"unminify-booleans\",\n tags: [\"safe\"],\n visitor: () => ({\n UnaryExpression(path) {\n if (trueMatcher.match(path.node)) {\n path.replaceWith(t.booleanLiteral(true));\n this.changes++;\n } else if (falseMatcher.match(path.node)) {\n path.replaceWith(t.booleanLiteral(false));\n this.changes++;\n }\n },\n }),\n} satisfies Transform;\n\nconst trueMatcher = m.or(\n m.unaryExpression(\"!\", m.numericLiteral(0)),\n m.unaryExpression(\"!\", m.unaryExpression(\"!\", m.numericLiteral(1))),\n m.unaryExpression(\"!\", m.unaryExpression(\"!\", m.arrayExpression([]))),\n);\n\nconst falseMatcher = m.or(\n m.unaryExpression(\"!\", m.numericLiteral(1)),\n m.unaryExpression(\"!\", m.arrayExpression([])),\n);\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nexport default {\n name: \"void-to-undefined\",\n tags: [\"safe\"],\n scope: true,\n visitor: () => {\n const matcher = m.unaryExpression(\"void\", m.numericLiteral(0));\n return {\n UnaryExpression: {\n exit(path) {\n if (\n matcher.match(path.node) &&\n !path.scope.hasBinding(\"undefined\", { noGlobals: true })\n ) {\n path.replaceWith(t.identifier(\"undefined\"));\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\n// https://eslint.org/docs/latest/rules/yoda and https://babeljs.io/docs/en/babel-plugin-minify-flip-comparisons\n\nconst FLIPPED_OPERATORS = {\n \"==\": \"==\",\n \"===\": \"===\",\n \"!=\": \"!=\",\n \"!==\": \"!==\",\n \">\": \"<\",\n \"<\": \">\",\n \">=\": \"<=\",\n \"<=\": \">=\",\n \"*\": \"*\",\n \"^\": \"^\",\n \"&\": \"&\",\n \"|\": \"|\",\n} as const;\n\nexport default {\n name: \"yoda\",\n tags: [\"safe\"],\n visitor: () => {\n const pureValue = m.or(\n m.stringLiteral(),\n m.numericLiteral(),\n m.unaryExpression(\n \"-\",\n m.or(m.numericLiteral(), m.identifier(\"Infinity\")),\n ),\n m.booleanLiteral(),\n m.nullLiteral(),\n m.identifier(\"undefined\"),\n m.identifier(\"NaN\"),\n m.identifier(\"Infinity\"),\n );\n const matcher = m.binaryExpression(\n m.or(\n \"==\",\n \"===\",\n \"!=\",\n \"!==\",\n \"<\",\n \">\",\n \"<=\",\n \">=\",\n \"*\",\n \"^\",\n \"&\",\n \"|\",\n ),\n pureValue,\n m.matcher((node) => !pureValue.match(node)),\n );\n\n return {\n BinaryExpression: {\n exit(path) {\n if (matcher.match(path.node)) {\n path.replaceWith(\n t.binaryExpression(\n FLIPPED_OPERATORS[\n path.node.operator as keyof typeof FLIPPED_OPERATORS\n ],\n path.node.right,\n path.node.left as t.Expression,\n ),\n );\n this.changes++;\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import { mergeTransforms } from \"../ast-utils/transform.ts\";\nimport blockStatements from \"./block-statements.ts\";\nimport computedProperties from \"./computed-properties.ts\";\nimport forToWhile from \"./for-to-while.ts\";\nimport infinity from \"./infinity.ts\";\nimport invertBooleanLogic from \"./invert-boolean-logic.ts\";\nimport jsonParse from \"./json-parse.ts\";\nimport logicalToIf from \"./logical-to-if.ts\";\nimport mergeElseIf from \"./merge-else-if.ts\";\nimport mergeStrings from \"./merge-strings.ts\";\nimport numberExpressions from \"./number-expressions.ts\";\nimport rawLiterals from \"./raw-literals.ts\";\nimport removeDoubleNot from \"./remove-double-not.ts\";\nimport sequence from \"./sequence.ts\";\nimport splitForLoopVars from \"./split-for-loop-vars.ts\";\nimport splitVariableDeclarations from \"./split-variable-declarations.ts\";\nimport stringLiteralInTemplate from \"./string-literal-in-template.ts\";\nimport ternaryToIf from \"./ternary-to-if.ts\";\nimport truncateNumberLiteral from \"./truncate-number-literal.ts\";\nimport typeofUndefined from \"./typeof-undefined.ts\";\nimport unaryExpressions from \"./unary-expressions.ts\";\nimport unminifyBooleans from \"./unminify-booleans.ts\";\nimport voidToUndefined from \"./void-to-undefined.ts\";\nimport yoda from \"./yoda.ts\";\n\nexport default mergeTransforms({\n name: \"unminify\",\n tags: [\"safe\"],\n transforms: [\n blockStatements,\n computedProperties,\n forToWhile,\n infinity,\n invertBooleanLogic,\n jsonParse,\n logicalToIf,\n mergeElseIf,\n mergeStrings,\n numberExpressions,\n rawLiterals,\n removeDoubleNot,\n sequence,\n splitForLoopVars,\n splitVariableDeclarations,\n stringLiteralInTemplate,\n ternaryToIf,\n truncateNumberLiteral,\n typeofUndefined,\n unaryExpressions,\n unminifyBooleans,\n voidToUndefined,\n yoda,\n ],\n});\n", "import * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport * as m from \"jsr:@codemod/matchers@^2.0.2\";\nimport type { Transform } from \"../ast-utils/transform.ts\";\n\nconst FUNCTIONS = {\n atob,\n unescape,\n decodeURI,\n decodeURIComponent,\n} as const;\n\nexport default {\n name: \"evaluate-globals\",\n tags: [\"safe\"],\n scope: true,\n visitor() {\n const name: m.CapturedMatcher<keyof typeof FUNCTIONS> = m.capture(\n m.or(\"atob\", \"unescape\", \"decodeURI\", \"decodeURIComponent\"),\n );\n const arg = m.capture(m.anyString());\n const matcher = m.callExpression(m.identifier(name), [\n m.stringLiteral(arg),\n ]);\n\n return {\n CallExpression: {\n exit(path) {\n if (!matcher.match(path.node)) return;\n if (path.scope.hasBinding(name.current!, { noGlobals: true })) return;\n\n try {\n // Causes a \"TypeError: Illegal invocation\" without the globalThis receiver\n const value = FUNCTIONS[name.current!].call(\n globalThis,\n arg.current!,\n );\n path.replaceWith(t.stringLiteral(value));\n this.changes++;\n } catch {\n // ignore\n }\n },\n },\n };\n },\n} satisfies Transform;\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport { getQuickJS, shouldInterruptAfterDeadline } from \"npm:quickjs-emscripten@^0.32.0\";\nimport {\n applyTransform,\n applyTransformAsync,\n applyTransforms,\n} from \"../webcrack/ast-utils/transform.ts\";\nimport deobfuscate from \"../webcrack/deobfuscate/mod.ts\";\nimport mergeObjectAssignments from \"../webcrack/deobfuscate/merge-object-assignments.ts\";\nimport selfDefending from \"../webcrack/deobfuscate/self-defending.ts\";\nimport unminify from \"../webcrack/unminify/mod.ts\";\nimport blockStatements from \"../webcrack/unminify/block-statements.ts\";\nimport sequence from \"../webcrack/unminify/sequence.ts\";\nimport splitVariableDeclarations from \"../webcrack/unminify/split-variable-declarations.ts\";\nimport transpile from \"../webcrack/transpile/mod.ts\";\nimport evaluateGlobals from \"../webcrack/deobfuscate/evaluate-globals.ts\";\n\n/**\n * Run webcrack passes.\n */\nexport default async function transform(ast: t.Node) {\n applyTransforms(\n ast,\n [blockStatements, sequence, splitVariableDeclarations],\n {\n name: \"prepare\",\n },\n );\n\n await applyTransformAsync(\n ast,\n deobfuscate,\n async (code: string) =>\n (await getQuickJS()).evalCode(code, {\n shouldInterrupt: shouldInterruptAfterDeadline(Date.now() + 2000),\n memoryLimitBytes: 4 * 1024 * 1024,\n }),\n );\n\n applyTransforms(ast, [transpile, unminify]);\n applyTransform(ast, selfDefending);\n applyTransforms(ast, [mergeObjectAssignments, evaluateGlobals]);\n\n return ast;\n}\n", "import type * as t from \"jsr:/@codemod/utils@^2.2.1/babel-types\";\nimport delance from \"./delance/mod.ts\";\nimport esmodule from \"./esmodule/mod.ts\";\nimport webcrack from \"./webcrack.ts\";\n\nexport default async function transform(ast: t.Node): Promise<t.Node> {\n await webcrack(ast);\n esmodule(ast);\n await delance(ast);\n return ast;\n}\n", "import { generate, parse } from \"./utils/ast.ts\";\nimport transform from \"./transform/mod.ts\";\n\nexport default async function (code: string): Promise<string> {\n return generate(await transform(parse(code)));\n}\n\nexport { transform };\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/** Options for {@linkcode delay}. */\nexport interface DelayOptions {\n /** Signal used to abort the delay. */\n signal?: AbortSignal;\n /** Indicates whether the process should continue to run as long as the timer exists.\n *\n * @default {true}\n */\n persistent?: boolean;\n}\n\n// Make type available in browser environments; we catch the `ReferenceError` below\ndeclare const Deno: { unrefTimer(id: number): void };\n\n/**\n * Resolve a {@linkcode Promise} after a given amount of milliseconds.\n *\n * If the optional signal is aborted before the delay duration, the returned\n * promise rejects with the signal's reason. If no reason is provided to\n * `abort()`, the browser's default `DOMException` with name `\"AbortError\"` is used.\n *\n * @param ms Duration in milliseconds for how long the delay should last.\n * @param options Additional options.\n *\n * @example Basic usage\n * ```ts no-assert\n * import { delay } from \"@std/async/delay\";\n *\n * // ...\n * const delayedPromise = delay(100);\n * const result = await delayedPromise;\n * // ...\n * ```\n *\n * @example Disable persistence\n *\n * Setting `persistent` to `false` will allow the process to continue to run as\n * long as the timer exists.\n *\n * ```ts no-assert ignore\n * import { delay } from \"@std/async/delay\";\n *\n * // ...\n * await delay(100, { persistent: false });\n * // ...\n * ```\n */\nexport function delay(ms: number, options: DelayOptions = {}): Promise<void> {\n const { signal, persistent = true } = options;\n if (signal?.aborted) return Promise.reject(signal.reason);\n return new Promise((resolve, reject) => {\n const abort = () => {\n clearTimeout(+i);\n reject(signal?.reason);\n };\n const done = () => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n };\n const i = setArbitraryLengthTimeout(done, ms);\n signal?.addEventListener(\"abort\", abort, { once: true });\n if (persistent === false) {\n try {\n Deno.unrefTimer(+i);\n } catch (error) {\n if (!(error instanceof ReferenceError)) {\n clearTimeout(+i);\n throw error;\n }\n // deno-lint-ignore no-console\n console.error(\"`persistent` option is only available in Deno\");\n }\n }\n });\n}\n\nconst I32_MAX = 2 ** 31 - 1;\n\nfunction setArbitraryLengthTimeout(\n callback: () => void,\n delay: number,\n): { valueOf(): number } {\n // ensure non-negative integer (but > I32_MAX is OK, even if Infinity)\n delay = Math.trunc(Math.max(delay, 0) || 0);\n\n if (delay <= I32_MAX) {\n const id = Number(setTimeout(callback, delay));\n return { valueOf: () => id };\n }\n\n const start = Date.now();\n let timeoutId: number;\n\n const queueTimeout = () => {\n const currentDelay = delay - (Date.now() - start);\n timeoutId = currentDelay > I32_MAX\n ? Number(setTimeout(queueTimeout, I32_MAX))\n : Number(setTimeout(callback, currentDelay));\n };\n\n queueTimeout();\n\n return { valueOf: () => timeoutId };\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\ninterface TaggedYieldedValue<T> {\n iterator: AsyncIterator<T>;\n value: T;\n}\n\n/**\n * Multiplexes multiple async iterators into a single stream. It currently\n * makes an assumption that the final result (the value returned and not\n * yielded from the iterator) does not matter; if there is any result, it is\n * discarded.\n *\n * @example Usage\n * ```ts\n * import { MuxAsyncIterator } from \"@std/async/mux-async-iterator\";\n * import { assertEquals } from \"@std/assert\";\n *\n * async function* gen123(): AsyncIterableIterator<number> {\n * yield 1;\n * yield 2;\n * yield 3;\n * }\n *\n * async function* gen456(): AsyncIterableIterator<number> {\n * yield 4;\n * yield 5;\n * yield 6;\n * }\n *\n * const mux = new MuxAsyncIterator<number>();\n * mux.add(gen123());\n * mux.add(gen456());\n *\n * const result = await Array.fromAsync(mux);\n *\n * assertEquals(result, [1, 4, 2, 5, 3, 6]);\n * ```\n *\n * @typeParam T The type of the provided async iterables and generated async iterable.\n */\nexport class MuxAsyncIterator<T> implements AsyncIterable<T> {\n #iteratorCount = 0;\n #yields: Array<TaggedYieldedValue<T>> = [];\n // deno-lint-ignore no-explicit-any\n #throws: any[] = [];\n #signal = Promise.withResolvers<void>();\n\n /**\n * Add an async iterable to the stream.\n *\n * @param iterable The async iterable to add.\n *\n * @example Usage\n * ```ts\n * import { MuxAsyncIterator } from \"@std/async/mux-async-iterator\";\n * import { assertEquals } from \"@std/assert\";\n *\n * async function* gen123(): AsyncIterableIterator<number> {\n * yield 1;\n * yield 2;\n * yield 3;\n * }\n *\n * const mux = new MuxAsyncIterator<number>();\n * mux.add(gen123());\n *\n * const result = await Array.fromAsync(mux.iterate());\n *\n * assertEquals(result, [1, 2, 3]);\n * ```\n */\n add(iterable: AsyncIterable<T>) {\n ++this.#iteratorCount;\n this.#callIteratorNext(iterable[Symbol.asyncIterator]());\n }\n\n async #callIteratorNext(\n iterator: AsyncIterator<T>,\n ) {\n try {\n const { value, done } = await iterator.next();\n if (done) {\n --this.#iteratorCount;\n } else {\n this.#yields.push({ iterator, value });\n }\n } catch (e) {\n this.#throws.push(e);\n }\n this.#signal.resolve();\n }\n\n /**\n * Returns an async iterator of the stream.\n * @returns the async iterator for all the added async iterables.\n *\n * @example Usage\n * ```ts\n * import { MuxAsyncIterator } from \"@std/async/mux-async-iterator\";\n * import { assertEquals } from \"@std/assert\";\n *\n * async function* gen123(): AsyncIterableIterator<number> {\n * yield 1;\n * yield 2;\n * yield 3;\n * }\n *\n * const mux = new MuxAsyncIterator<number>();\n * mux.add(gen123());\n *\n * const result = await Array.fromAsync(mux.iterate());\n *\n * assertEquals(result, [1, 2, 3]);\n * ```\n */\n async *iterate(): AsyncIterableIterator<T> {\n while (this.#iteratorCount > 0) {\n // Sleep until any of the wrapped iterators yields.\n await this.#signal.promise;\n\n // Note that while we're looping over `yields`, new items may be added.\n for (const { iterator, value } of this.#yields) {\n yield value;\n this.#callIteratorNext(iterator);\n }\n\n if (this.#throws.length) {\n for (const e of this.#throws) {\n throw e;\n }\n }\n // Clear the `yields` list and reset the `signal` promise.\n this.#yields.length = 0;\n this.#signal = Promise.withResolvers<void>();\n }\n }\n\n /**\n * Implements an async iterator for the stream.\n * @returns the async iterator for all the added async iterables.\n *\n * @example Usage\n * ```ts\n * import { MuxAsyncIterator } from \"@std/async/mux-async-iterator\";\n * import { assertEquals } from \"@std/assert\";\n *\n * async function* gen123(): AsyncIterableIterator<number> {\n * yield 1;\n * yield 2;\n * yield 3;\n * }\n *\n * const mux = new MuxAsyncIterator<number>();\n * mux.add(gen123());\n *\n * const result = await Array.fromAsync(mux);\n *\n * assertEquals(result, [1, 2, 3]);\n * ```\n */\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return this.iterate();\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\n/** Error message emitted from the thrown error while mapping. */\nconst ERROR_WHILE_MAPPING_MESSAGE =\n \"Cannot complete the mapping as an error was thrown from an item\";\n\n/**\n * pooledMap transforms values from an (async) iterable into another async\n * iterable. The transforms are done concurrently, with a max concurrency\n * defined by the poolLimit.\n *\n * If an error is thrown from `iterableFn`, no new transformations will begin.\n * All currently executing transformations are allowed to finish and still\n * yielded on success. After that, the rejections among them are gathered and\n * thrown by the iterator in an `AggregateError`.\n *\n * @example Usage\n * ```ts\n * import { pooledMap } from \"@std/async/pool\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const results = pooledMap(\n * 2,\n * [1, 2, 3],\n * (i) => new Promise((r) => setTimeout(() => r(i), 1000)),\n * );\n *\n * assertEquals(await Array.fromAsync(results), [1, 2, 3]);\n * ```\n *\n * @typeParam T the input type.\n * @typeParam R the output type.\n * @param poolLimit The maximum count of items being processed concurrently.\n * Must be a positive integer.\n * @param array The input array for mapping.\n * @param iteratorFn The function to call for every item of the array.\n * @returns The async iterator with the transformed values.\n * @throws {RangeError} If `poolLimit` is not a positive integer.\n */\nexport function pooledMap<T, R>(\n poolLimit: number,\n array: Iterable<T> | AsyncIterable<T>,\n iteratorFn: (data: T) => Promise<R>,\n): AsyncIterableIterator<R> {\n if (!Number.isInteger(poolLimit) || poolLimit < 1) {\n throw new RangeError(\"'poolLimit' must be a positive integer\");\n }\n\n const res = new TransformStream<Promise<R>, R>({\n async transform(\n p: Promise<R>,\n controller: TransformStreamDefaultController<R>,\n ) {\n try {\n const s = await p;\n controller.enqueue(s);\n } catch (e) {\n if (\n e instanceof AggregateError &&\n e.message === ERROR_WHILE_MAPPING_MESSAGE\n ) {\n controller.error(e as unknown);\n }\n }\n },\n });\n // Start processing items from the iterator\n (async () => {\n const writer = res.writable.getWriter();\n const executing: Array<Promise<unknown>> = [];\n try {\n for await (const item of array) {\n const p = Promise.resolve().then(() => iteratorFn(item));\n // Only write on success. If we `writer.write()` a rejected promise,\n // that will end the iteration. We don't want that yet. Instead let it\n // fail the race, taking us to the catch block where all currently\n // executing jobs are allowed to finish and all rejections among them\n // can be reported together.\n writer.write(p);\n const e: Promise<unknown> = p.then(() =>\n executing.splice(executing.indexOf(e), 1)\n );\n executing.push(e);\n if (executing.length >= poolLimit) {\n await Promise.race(executing);\n }\n }\n // Wait until all ongoing events have processed, then close the writer.\n await Promise.all(executing);\n writer.close();\n } catch {\n const errors = [];\n for (const result of await Promise.allSettled(executing)) {\n if (result.status === \"rejected\") {\n errors.push(result.reason);\n }\n }\n writer.write(Promise.reject(\n new AggregateError(errors, ERROR_WHILE_MAPPING_MESSAGE),\n )).catch(() => {});\n }\n })();\n // Feature test until browser coverage is adequate\n return Symbol.asyncIterator in res.readable &&\n typeof res.readable[Symbol.asyncIterator] === \"function\"\n ? (res.readable[Symbol.asyncIterator] as () => AsyncIterableIterator<R>)()\n : (async function* () {\n const reader = res.readable.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield value;\n }\n reader.releaseLock();\n })();\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nexport function exponentialBackoffWithJitter(\n cap: number,\n base: number,\n attempt: number,\n multiplier: number,\n jitter: number,\n) {\n const exp = Math.min(cap, base * multiplier ** attempt);\n return (1 - jitter * Math.random()) * exp;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\nimport { delay } from \"./delay.ts\";\nimport { exponentialBackoffWithJitter } from \"./_util.ts\";\n\n/**\n * Error thrown in {@linkcode retry} once the maximum number of failed attempts\n * has been reached.\n *\n * @example Usage\n * ```ts no-assert ignore\n * import { RetryError } from \"@std/async/retry\";\n *\n * throw new RetryError({ foo: \"bar\" }, 3);\n * ```\n */\nexport class RetryError extends Error {\n /**\n * Constructs a new {@linkcode RetryError} instance.\n *\n * @param cause the cause for this error.\n * @param attempts the number of retry attempts made.\n */\n constructor(cause: unknown, attempts: number) {\n super(`Retrying exceeded the maxAttempts (${attempts}).`);\n this.name = \"RetryError\";\n this.cause = cause;\n }\n}\n\n/** Options for {@linkcode retry}. */\nexport interface RetryOptions {\n /**\n * How much to backoff after each retry.\n *\n * @default {2}\n */\n multiplier?: number;\n /**\n * The maximum milliseconds between attempts.\n *\n * @default {60000}\n */\n maxTimeout?: number;\n /**\n * The maximum amount of attempts until failure.\n *\n * @default {5}\n */\n maxAttempts?: number;\n /**\n * The initial and minimum amount of milliseconds between attempts.\n *\n * @default {1000}\n */\n minTimeout?: number;\n /**\n * Amount of jitter to introduce to the time between attempts. This is `1`\n * for full jitter by default.\n *\n * @default {1}\n */\n jitter?: number;\n /**\n * Callback to determine if an error or other thrown value is retriable.\n *\n * @default {() => true}\n *\n * @param err The thrown error or other value.\n * @returns `true` if the error is retriable, `false` otherwise.\n */\n isRetriable?: (err: unknown) => boolean;\n /**\n * An AbortSignal to cancel the retry operation.\n *\n * If the signal is aborted, the retry will stop and reject with the signal's\n * reason. The signal is checked before each attempt and during the delay\n * between attempts.\n *\n * @default {undefined}\n */\n signal?: AbortSignal;\n}\n\n/**\n * Calls the given (possibly asynchronous) function up to `maxAttempts` times.\n * Retries as long as the given function throws. If the attempts are exhausted,\n * throws a {@linkcode RetryError} with `cause` set to the inner exception.\n *\n * The backoff is calculated by multiplying `minTimeout` with `multiplier` to the power of the current attempt counter (starting at 0 up to `maxAttempts - 1`). It is capped at `maxTimeout` however.\n * How long the actual delay is, depends on `jitter`.\n *\n * When `jitter` is the default value of `1`, waits between two attempts for a\n * randomized amount between 0 and the backoff time. With the default options\n * the maximal delay will be `15s = 1s + 2s + 4s + 8s`. If all five attempts\n * are exhausted the mean delay will be `9.5s = ½(4s + 15s)`.\n *\n * When `jitter` is `0`, waits the full backoff time.\n *\n * @example Example configuration 1\n * ```ts no-assert\n * import { retry } from \"@std/async/retry\";\n * const req = async () => {\n * // some function that throws sometimes\n * };\n *\n * // Below resolves to the first non-error result of `req`\n * const retryPromise = await retry(req, {\n * multiplier: 2,\n * maxTimeout: 60000,\n * maxAttempts: 5,\n * minTimeout: 100,\n * jitter: 1,\n * });\n * ```\n *\n * @example Example configuration 2\n * ```ts no-assert\n * import { retry } from \"@std/async/retry\";\n * const req = async () => {\n * // some function that throws sometimes\n * };\n *\n * // Make sure we wait at least 1 minute, but at most 2 minutes\n * const retryPromise = await retry(req, {\n * multiplier: 2.34,\n * maxTimeout: 80000,\n * maxAttempts: 7,\n * minTimeout: 1000,\n * jitter: 0.5,\n * });\n * ```\n *\n * @example Only retry on specific error types\n * ```ts no-assert\n * import { retry } from \"@std/async/retry\";\n *\n * class HttpError extends Error {\n * status: number;\n * constructor(status: number) {\n * super(`HTTP ${status}`);\n * this.status = status;\n * }\n * }\n *\n * const req = async () => {\n * // some function that throws HttpError\n * };\n *\n * // Only retry on 429 (rate limit) or 5xx (server) errors\n * const retryPromise = await retry(req, {\n * isRetriable: (err) =>\n * err instanceof HttpError && (err.status === 429 || err.status >= 500),\n * });\n * ```\n *\n * @typeParam T The return type of the function to retry and returned promise.\n * @param fn The function to retry.\n * @param options Additional options.\n * @returns The promise that resolves with the value returned by the function to retry.\n * @throws {RetryError} If the function fails after `maxAttempts` attempts.\n * @throws If the `signal` is aborted, throws the signal's reason.\n * @throws If `isRetriable` returns `false` for an error, throws that error immediately.\n */\nexport async function retry<T>(\n fn: (() => Promise<T>) | (() => T),\n options?: RetryOptions,\n): Promise<T> {\n const {\n multiplier = 2,\n maxTimeout = 60000,\n maxAttempts = 5,\n minTimeout = 1000,\n jitter = 1,\n isRetriable = () => true,\n signal,\n } = options ?? {};\n\n if (!Number.isInteger(maxAttempts) || maxAttempts < 1) {\n throw new RangeError(\n `Cannot retry as 'maxAttempts' must be a positive integer: current value is ${maxAttempts}`,\n );\n }\n if (!Number.isFinite(multiplier) || multiplier < 1) {\n throw new RangeError(\n `Cannot retry as 'multiplier' must be a finite number >= 1: current value is ${multiplier}`,\n );\n }\n if (Number.isNaN(maxTimeout) || maxTimeout <= 0) {\n throw new RangeError(\n `Cannot retry as 'maxTimeout' must be a positive number: current value is ${maxTimeout}`,\n );\n }\n if (Number.isNaN(minTimeout) || minTimeout < 0) {\n throw new RangeError(\n `Cannot retry as 'minTimeout' must be >= 0: current value is ${minTimeout}`,\n );\n }\n if (minTimeout > maxTimeout) {\n throw new RangeError(\n `Cannot retry as 'minTimeout' must be <= 'maxTimeout': current values 'minTimeout=${minTimeout}', 'maxTimeout=${maxTimeout}'`,\n );\n }\n if (Number.isNaN(jitter) || jitter < 0 || jitter > 1) {\n throw new RangeError(\n `Cannot retry as 'jitter' must be between 0 and 1: current value is ${jitter}`,\n );\n }\n\n let attempt = 0;\n while (true) {\n signal?.throwIfAborted();\n\n try {\n return await fn();\n } catch (error) {\n if (!isRetriable(error)) {\n throw error;\n }\n\n if (attempt + 1 >= maxAttempts) {\n throw new RetryError(error, maxAttempts);\n }\n\n const timeout = exponentialBackoffWithJitter(\n maxTimeout,\n minTimeout,\n attempt,\n multiplier,\n jitter,\n );\n await delay(timeout, signal ? { signal } : undefined);\n }\n attempt++;\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nexport function checkWindows(): boolean {\n // deno-lint-ignore no-explicit-any\n const global = globalThis as any;\n\n // Check Node/Bun/Deno via `process.platform`, then the Deno global, then the browser\n const platform = global.process?.platform;\n if (typeof platform === \"string\") return platform.startsWith(\"win\");\n const os = global.Deno?.build?.os;\n if (typeof os === \"string\") return os === \"windows\";\n return global.navigator?.platform?.startsWith(\"Win\") ?? false;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { checkWindows } from \"./_os.ts\";\n\n/** Whether the current platform is Windows */\nexport const isWindows: boolean = checkWindows();\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// Copyright the Browserify authors. MIT License.\n\nexport function assertPath(path?: string) {\n if (typeof path !== \"string\") {\n throw new TypeError(\n `Path must be a string, received \"${JSON.stringify(path)}\"`,\n );\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nexport function assertArg(url: URL | string) {\n url = url instanceof URL ? url : new URL(url);\n if (url.protocol !== \"file:\") {\n throw new TypeError(\n `URL must be a file URL: received \"${url.protocol}\"`,\n );\n }\n return url;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertArg } from \"../_common/from_file_url.ts\";\n\n/**\n * Converts a file URL to a path string.\n *\n * @example Usage\n * ```ts\n * import { fromFileUrl } from \"@std/path/posix/from-file-url\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(fromFileUrl(new URL(\"file:///home/foo\")), \"/home/foo\");\n * ```\n *\n * @param url The file URL to convert.\n * @returns The path string.\n */\nexport function fromFileUrl(url: URL | string): string {\n url = assertArg(url);\n return decodeURIComponent(\n url.pathname.replace(/%(?![0-9A-Fa-f]{2})/g, \"%25\"),\n );\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// Copyright the Browserify authors. MIT License.\n// Ported from https://github.com/browserify/path-browserify/\n// This module is browser compatible.\n\nexport function stripTrailingSeparators(\n segment: string,\n isSep: (char: number) => boolean,\n): string {\n if (segment.length <= 1) {\n return segment;\n }\n\n let end = segment.length;\n\n for (let i = segment.length - 1; i > 0; i--) {\n if (isSep(segment.charCodeAt(i))) {\n end = i;\n } else {\n break;\n }\n }\n\n return segment.slice(0, end);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// Copyright the Browserify authors. MIT License.\n// Ported from https://github.com/browserify/path-browserify/\n// This module is browser compatible.\n\nimport { CHAR_FORWARD_SLASH } from \"../_common/constants.ts\";\n\nexport function isPosixPathSeparator(code: number): boolean {\n return code === CHAR_FORWARD_SLASH;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// Copyright the Browserify authors. MIT License.\n// Ported from https://github.com/browserify/path-browserify/\n// This module is browser compatible.\n\nimport {\n CHAR_BACKWARD_SLASH,\n CHAR_FORWARD_SLASH,\n CHAR_LOWERCASE_A,\n CHAR_LOWERCASE_Z,\n CHAR_UPPERCASE_A,\n CHAR_UPPERCASE_Z,\n} from \"../_common/constants.ts\";\n\nexport function isPosixPathSeparator(code: number): boolean {\n return code === CHAR_FORWARD_SLASH;\n}\n\nexport function isPathSeparator(code: number): boolean {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n}\n\nexport function isWindowsDeviceRoot(code: number): boolean {\n return (\n (code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z) ||\n (code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z)\n );\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertArg } from \"../_common/from_file_url.ts\";\n\n/**\n * Converts a file URL to a path string.\n *\n * @example Usage\n * ```ts\n * import { fromFileUrl } from \"@std/path/windows/from-file-url\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(fromFileUrl(\"file:///home/foo\"), \"\\\\home\\\\foo\");\n * assertEquals(fromFileUrl(\"file:///C:/Users/foo\"), \"C:\\\\Users\\\\foo\");\n * assertEquals(fromFileUrl(\"file://localhost/home/foo\"), \"\\\\home\\\\foo\");\n * ```\n *\n * @param url The file URL to convert.\n * @returns The path string.\n */\nexport function fromFileUrl(url: URL | string): string {\n url = assertArg(url);\n let path = decodeURIComponent(\n url.pathname.replace(/\\//g, \"\\\\\").replace(/%(?![0-9A-Fa-f]{2})/g, \"%25\"),\n ).replace(/^\\\\*([A-Za-z]:)(\\\\|$)/, \"$1\\\\\");\n if (url.hostname !== \"\") {\n // Note: The `URL` implementation guarantees that the drive letter and\n // hostname are mutually exclusive. Otherwise it would not have been valid\n // to append the hostname and path like this.\n path = `\\\\\\\\${url.hostname}${path}`;\n }\n return path;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertPath } from \"./assert_path.ts\";\n\nexport function assertArg(path: string) {\n assertPath(path);\n if (path.length === 0) return \".\";\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertArg } from \"../_common/dirname.ts\";\nimport { stripTrailingSeparators } from \"../_common/strip_trailing_separators.ts\";\nimport { isPosixPathSeparator } from \"./_util.ts\";\nimport { fromFileUrl } from \"./from_file_url.ts\";\n\n/**\n * Return the directory path of a `path`.\n *\n * @example Usage\n * ```ts\n * import { dirname } from \"@std/path/posix/dirname\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(dirname(\"/home/user/Documents/\"), \"/home/user\");\n * assertEquals(dirname(\"/home/user/Documents/image.png\"), \"/home/user/Documents\");\n * assertEquals(dirname(\"https://deno.land/std/path/mod.ts\"), \"https://deno.land/std/path\");\n * assertEquals(dirname(new URL(\"file:///home/user/Documents/image.png\")), \"/home/user/Documents\");\n * ```\n *\n * @example Working with URLs\n *\n * Only `URL` instances with the `file:` protocol are accepted. To process a\n * non-`file:` URL, pass it as a string or pass its `pathname` property.\n *\n * ```ts\n * import { dirname } from \"@std/path/posix/dirname\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(dirname(\"https://deno.land/std/path/mod.ts\"), \"https://deno.land/std/path\");\n * assertEquals(dirname(\"https://deno.land/std/path/mod.ts?a=b\"), \"https://deno.land/std/path\");\n * assertEquals(dirname(\"https://deno.land/std/path/mod.ts#header\"), \"https://deno.land/std/path\");\n * assertEquals(dirname(new URL(\"https://deno.land/std/path/mod.ts\").pathname), \"/std/path\");\n * ```\n *\n * @param path The path to get the directory from.\n * @returns The directory path.\n * @throws {TypeError} If `path` is a `URL` instance whose protocol is not `file:`.\n */\nexport function dirname(path: string | URL): string {\n if (path instanceof URL) {\n path = fromFileUrl(path);\n }\n assertArg(path);\n\n let end = -1;\n let matchedNonSeparator = false;\n\n for (let i = path.length - 1; i >= 1; --i) {\n if (isPosixPathSeparator(path.charCodeAt(i))) {\n if (matchedNonSeparator) {\n end = i;\n break;\n }\n } else {\n matchedNonSeparator = true;\n }\n }\n\n // No matches. Fallback based on provided path:\n //\n // - leading slashes paths\n // \"/foo\" => \"/\"\n // \"///foo\" => \"/\"\n // - no slash path\n // \"foo\" => \".\"\n if (end === -1) {\n return isPosixPathSeparator(path.charCodeAt(0)) ? \"/\" : \".\";\n }\n\n return stripTrailingSeparators(\n path.slice(0, end),\n isPosixPathSeparator,\n );\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertArg } from \"../_common/dirname.ts\";\nimport { CHAR_COLON } from \"../_common/constants.ts\";\nimport { stripTrailingSeparators } from \"../_common/strip_trailing_separators.ts\";\nimport {\n isPathSeparator,\n isPosixPathSeparator,\n isWindowsDeviceRoot,\n} from \"./_util.ts\";\nimport { fromFileUrl } from \"./from_file_url.ts\";\n\n/**\n * Return the directory path of a `path`.\n *\n * @example Usage\n * ```ts\n * import { dirname } from \"@std/path/windows/dirname\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(dirname(\"C:\\\\foo\\\\bar\\\\baz.ext\"), \"C:\\\\foo\\\\bar\");\n * assertEquals(dirname(new URL(\"file:///C:/foo/bar/baz.ext\")), \"C:\\\\foo\\\\bar\");\n * ```\n *\n * @param path The path to get the directory from.\n * @returns The directory path.\n * @throws {TypeError} If `path` is a `URL` instance whose protocol is not `file:`.\n */\nexport function dirname(path: string | URL): string {\n if (path instanceof URL) {\n path = fromFileUrl(path);\n }\n assertArg(path);\n\n const len = path.length;\n let rootEnd = -1;\n let end = -1;\n let matchedSlash = true;\n let offset = 0;\n const code = path.charCodeAt(0);\n\n // Try to match a root\n if (len > 1) {\n if (isPathSeparator(code)) {\n // Possible UNC root\n\n rootEnd = offset = 1;\n\n if (isPathSeparator(path.charCodeAt(1))) {\n // Matched double path separator at beginning\n let j = 2;\n let last = j;\n // Match 1 or more non-path separators\n for (; j < len; ++j) {\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more path separators\n for (; j < len; ++j) {\n if (!isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n for (; j < len; ++j) {\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j === len) {\n // We matched a UNC root only\n return path;\n }\n if (j !== last) {\n // We matched a UNC root with leftovers\n\n // Offset by 1 to include the separator after the UNC root to\n // treat it as a \"normal root\" on top of a (UNC) root\n rootEnd = offset = j + 1;\n }\n }\n }\n }\n } else if (isWindowsDeviceRoot(code)) {\n // Possible device root\n\n if (path.charCodeAt(1) === CHAR_COLON) {\n rootEnd = offset = 2;\n if (len > 2) {\n if (isPathSeparator(path.charCodeAt(2))) rootEnd = offset = 3;\n }\n }\n }\n } else if (isPathSeparator(code)) {\n // `path` contains just a path separator, exit early to avoid\n // unnecessary work\n return path;\n }\n\n for (let i = len - 1; i >= offset; --i) {\n if (isPathSeparator(path.charCodeAt(i))) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) {\n if (rootEnd === -1) return \".\";\n else end = rootEnd;\n }\n return stripTrailingSeparators(path.slice(0, end), isPosixPathSeparator);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { isWindows } from \"jsr:@std/internal@^1.0.14/os\";\nimport { dirname as posixDirname } from \"./posix/dirname.ts\";\nimport { dirname as windowsDirname } from \"./windows/dirname.ts\";\n\n/**\n * Return the directory path of a path.\n *\n * @example Usage\n * ```ts\n * import { dirname } from \"@std/path/dirname\";\n * import { assertEquals } from \"@std/assert\";\n *\n * if (Deno.build.os === \"windows\") {\n * assertEquals(dirname(\"C:\\\\home\\\\user\\\\Documents\\\\image.png\"), \"C:\\\\home\\\\user\\\\Documents\");\n * assertEquals(dirname(new URL(\"file:///C:/home/user/Documents/image.png\")), \"C:\\\\home\\\\user\\\\Documents\");\n * } else {\n * assertEquals(dirname(\"/home/user/Documents/image.png\"), \"/home/user/Documents\");\n * assertEquals(dirname(new URL(\"file:///home/user/Documents/image.png\")), \"/home/user/Documents\");\n * }\n * ```\n *\n * @param path Path to extract the directory from. When passed as a `URL`\n * instance, its protocol must be `file:`. For other protocols, pass the URL\n * as a string or pass its `pathname` property.\n * @returns The directory path.\n * @throws {TypeError} If `path` is a `URL` instance whose protocol is not `file:`.\n */\nexport function dirname(path: string | URL): string {\n return isWindows ? windowsDirname(path) : posixDirname(path);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertPath } from \"./assert_path.ts\";\n\nexport function assertArg(path: string) {\n assertPath(path);\n if (path.length === 0) return \".\";\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// Copyright the Browserify authors. MIT License.\n// Ported from https://github.com/browserify/path-browserify/\n// This module is browser compatible.\n\nimport { CHAR_DOT, CHAR_FORWARD_SLASH } from \"./constants.ts\";\n\n// Resolves . and .. elements in a path with directory names\nexport function normalizeString(\n path: string,\n allowAboveRoot: boolean,\n separator: string,\n isPathSeparator: (code: number) => boolean,\n): string {\n let res = \"\";\n let lastSegmentLength = 0;\n let lastSlash = -1;\n let dots = 0;\n let code: number | undefined;\n for (let i = 0; i <= path.length; ++i) {\n if (i < path.length) code = path.charCodeAt(i);\n else if (isPathSeparator(code!)) break;\n else code = CHAR_FORWARD_SLASH;\n\n if (isPathSeparator(code!)) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n } else if (lastSlash !== i - 1 && dots === 2) {\n if (\n res.length < 2 ||\n lastSegmentLength !== 2 ||\n res.charCodeAt(res.length - 1) !== CHAR_DOT ||\n res.charCodeAt(res.length - 2) !== CHAR_DOT\n ) {\n if (res.length > 2) {\n const lastSlashIndex = res.lastIndexOf(separator);\n if (lastSlashIndex === -1) {\n res = \"\";\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf(separator);\n }\n lastSlash = i;\n dots = 0;\n continue;\n } else if (res.length === 2 || res.length === 1) {\n res = \"\";\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0) res += `${separator}..`;\n else res = \"..\";\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0) res += separator + path.slice(lastSlash + 1, i);\n else res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === CHAR_DOT && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertArg } from \"../_common/normalize.ts\";\nimport { normalizeString } from \"../_common/normalize_string.ts\";\nimport { isPosixPathSeparator } from \"./_util.ts\";\nimport { fromFileUrl } from \"./from_file_url.ts\";\n\n/**\n * Normalize the `path`, resolving `'..'` and `'.'` segments.\n * Note that resolving these segments does not necessarily mean that all will be eliminated.\n * A `'..'` at the top-level will be preserved, and an empty path is canonically `'.'`.\n *\n * @example Usage\n * ```ts\n * import { normalize } from \"@std/path/posix/normalize\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(normalize(\"/foo/bar//baz/asdf/quux/..\"), \"/foo/bar/baz/asdf\");\n * assertEquals(normalize(new URL(\"file:///foo/bar//baz/asdf/quux/..\")), \"/foo/bar/baz/asdf/\");\n * ```\n *\n * @example Working with URLs\n *\n * Note: This function will remove the double slashes from a URL's scheme.\n * Hence, do not pass a full URL to this function. Instead, pass the pathname of\n * the URL.\n *\n * ```ts\n * import { normalize } from \"@std/path/posix/normalize\";\n * import { assertEquals } from \"@std/assert\";\n *\n * const url = new URL(\"https://deno.land\");\n * url.pathname = normalize(\"//std//assert//.//mod.ts\");\n * assertEquals(url.href, \"https://deno.land/std/assert/mod.ts\");\n *\n * url.pathname = normalize(\"std/assert/../async/retry.ts\");\n * assertEquals(url.href, \"https://deno.land/std/async/retry.ts\");\n * ```\n *\n * @param path The path to normalize.\n * @returns The normalized path.\n */\nexport function normalize(path: string | URL): string {\n if (path instanceof URL) {\n path = fromFileUrl(path);\n }\n assertArg(path);\n\n const isAbsolute = isPosixPathSeparator(path.charCodeAt(0));\n const trailingSeparator = isPosixPathSeparator(\n path.charCodeAt(path.length - 1),\n );\n\n // Normalize the path\n path = normalizeString(path, !isAbsolute, \"/\", isPosixPathSeparator);\n\n if (path.length === 0 && !isAbsolute) path = \".\";\n if (path.length > 0 && trailingSeparator) path += \"/\";\n\n if (isAbsolute) return `/${path}`;\n return path;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { assertArg } from \"../_common/normalize.ts\";\nimport { CHAR_COLON } from \"../_common/constants.ts\";\nimport { normalizeString } from \"../_common/normalize_string.ts\";\nimport { isPathSeparator, isWindowsDeviceRoot } from \"./_util.ts\";\nimport { fromFileUrl } from \"./from_file_url.ts\";\n\n/**\n * Normalize the `path`, resolving `'..'` and `'.'` segments.\n * Note that resolving these segments does not necessarily mean that all will be eliminated.\n * A `'..'` at the top-level will be preserved, and an empty path is canonically `'.'`.\n *\n * @example Usage\n * ```ts\n * import { normalize } from \"@std/path/windows/normalize\";\n * import { assertEquals } from \"@std/assert\";\n *\n * assertEquals(normalize(\"C:\\\\foo\\\\..\\\\bar\"), \"C:\\\\bar\");\n * assertEquals(normalize(new URL(\"file:///C:/foo/../bar\")), \"C:\\\\bar\");\n * ```\n *\n * @param path The path to normalize\n * @returns The normalized path\n */\nexport function normalize(path: string | URL): string {\n if (path instanceof URL) {\n path = fromFileUrl(path);\n }\n assertArg(path);\n\n const len = path.length;\n let rootEnd = 0;\n let device: string | undefined;\n let isAbsolute = false;\n const code = path.charCodeAt(0);\n\n // Try to match a root\n if (len > 1) {\n if (isPathSeparator(code)) {\n // Possible UNC root\n\n // If we started with a separator, we know we at least have an absolute\n // path of some kind (UNC or otherwise)\n isAbsolute = true;\n\n if (isPathSeparator(path.charCodeAt(1))) {\n // Matched double path separator at beginning\n let j = 2;\n let last = j;\n // Match 1 or more non-path separators\n for (; j < len; ++j) {\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n const firstPart = path.slice(last, j);\n // Matched!\n last = j;\n // Match 1 or more path separators\n for (; j < len; ++j) {\n if (!isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n for (; j < len; ++j) {\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j === len) {\n // We matched a UNC root only\n // Return the normalized version of the UNC root since there\n // is nothing left to process\n\n return `\\\\\\\\${firstPart}\\\\${path.slice(last)}\\\\`;\n } else if (j !== last) {\n // We matched a UNC root with leftovers\n\n device = `\\\\\\\\${firstPart}\\\\${path.slice(last, j)}`;\n rootEnd = j;\n }\n }\n }\n } else {\n rootEnd = 1;\n }\n } else if (isWindowsDeviceRoot(code)) {\n // Possible device root\n\n if (path.charCodeAt(1) === CHAR_COLON) {\n device = path.slice(0, 2);\n rootEnd = 2;\n if (len > 2) {\n if (isPathSeparator(path.charCodeAt(2))) {\n // Treat separator following drive name as an absolute path\n // indicator\n isAbsolute = true;\n rootEnd = 3;\n }\n }\n }\n }\n } else if (isPathSeparator(code)) {\n // `path` contains just a path separator, exit early to avoid unnecessary\n // work\n return \"\\\\\";\n }\n\n let tail: string;\n if (rootEnd < len) {\n tail = normalizeString(\n path.slice(rootEnd),\n !isAbsolute,\n \"\\\\\",\n isPathSeparator,\n );\n } else {\n tail = \"\";\n }\n if (tail.length === 0 && !isAbsolute) tail = \".\";\n if (tail.length > 0 && isPathSeparator(path.charCodeAt(len - 1))) {\n tail += \"\\\\\";\n }\n if (device === undefined) {\n if (isAbsolute) {\n if (tail.length > 0) return `\\\\${tail}`;\n else return \"\\\\\";\n }\n return tail;\n } else if (isAbsolute) {\n if (tail.length > 0) return `${device}\\\\${tail}`;\n else return `${device}\\\\`;\n }\n return device + tail;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// This module is browser compatible.\n\nimport { isWindows } from \"jsr:@std/internal@^1.0.14/os\";\nimport { normalize as posixNormalize } from \"./posix/normalize.ts\";\nimport { normalize as windowsNormalize } from \"./windows/normalize.ts\";\n/**\n * Normalize the path, resolving `'..'` and `'.'` segments.\n *\n * Note: Resolving these segments does not necessarily mean that all will be\n * eliminated. A `'..'` at the top-level will be preserved, and an empty path is\n * canonically `'.'`.\n *\n * @example Usage\n * ```ts\n * import { normalize } from \"@std/path/normalize\";\n * import { assertEquals } from \"@std/assert\";\n *\n * if (Deno.build.os === \"windows\") {\n * assertEquals(normalize(\"C:\\\\foo\\\\bar\\\\..\\\\baz\\\\quux\"), \"C:\\\\foo\\\\baz\\\\quux\");\n * assertEquals(normalize(new URL(\"file:///C:/foo/bar/../baz/quux\")), \"C:\\\\foo\\\\baz\\\\quux\");\n * } else {\n * assertEquals(normalize(\"/foo/bar/../baz/quux\"), \"/foo/baz/quux\");\n * assertEquals(normalize(new URL(\"file:///foo/bar/../baz/quux\")), \"/foo/baz/quux\");\n * }\n * ```\n *\n * @param path Path to be normalized\n * @returns The normalized path.\n */\nexport function normalize(path: string | URL): string {\n return isWindows ? windowsNormalize(path) : posixNormalize(path);\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n// deno-lint-ignore-file no-explicit-any\n\n/**\n * True if the runtime is Deno, false otherwise.\n */\nexport const isDeno = (globalThis as any).navigator\n ?.userAgent?.includes(\"Deno\");\n\n/**\n * @returns The Node.js `fs` module.\n */\nexport function getNodeFs() {\n return (globalThis as any).process.getBuiltinModule(\"node:fs\");\n}\n\n/**\n * @returns The Node.js `os` module.\n */\nexport function getNodeOs() {\n return (globalThis as any).process.getBuiltinModule(\"node:os\");\n}\n\n/**\n * @returns The Node.js `path` module.\n */\nexport function getNodePath() {\n return (globalThis as any).process.getBuiltinModule(\"node:path\");\n}\n\n/**\n * @returns The Node.js `process` module.\n */\nexport function getNodeProcess() {\n return (globalThis as any).process.getBuiltinModule(\"node:process\");\n}\n\n/**\n * @returns The Node.js `stream` module.\n */\nexport function getNodeStream() {\n return (globalThis as any).process.getBuiltinModule(\"node:stream\");\n}\n\n/**\n * @returns The Node.js `tty` module.\n */\nexport function getNodeTty() {\n return (globalThis as any).process.getBuiltinModule(\"node:tty\");\n}\n\n/**\n * @returns The Node.js `util` module.\n */\nexport function getNodeUtil() {\n return (globalThis as any).process.getBuiltinModule(\"node:util\");\n}\n\n/**\n * Used for naming temporary files. See {@linkcode makeTempFile} and\n * {@linkcode makeTempFileSync}.\n * @returns A randomized 6-digit hexadecimal string.\n */\nexport function randomId(): string {\n const bytes = new Uint8Array(3);\n crypto.getRandomValues(bytes);\n let result = \"\";\n for (const byte of bytes) {\n result += byte.toString(16).padStart(2, \"0\");\n }\n return result;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\n// @ts-self-types=\"./unstable_errors.d.ts\"\n\nimport { isDeno } from \"./_utils.ts\";\n\n// please keep sorted\nexport const AlreadyExists = isDeno\n ? Deno.errors.AlreadyExists\n : class AlreadyExists extends Error {};\nexport const BadResource = isDeno\n ? Deno.errors.BadResource\n : class BadResource extends Error {};\nexport const BrokenPipe = isDeno\n ? Deno.errors.BrokenPipe\n : class BrokenPipe extends Error {};\nexport const Busy = isDeno ? Deno.errors.Busy : class Busy extends Error {};\nexport const Interrupted = isDeno\n ? Deno.errors.Interrupted\n : class Interrupted extends Error {};\nexport const InvalidData = isDeno\n ? Deno.errors.InvalidData\n : class InvalidData extends Error {};\nexport const NotFound = isDeno\n ? Deno.errors.NotFound\n : class NotFound extends Error {};\nexport const PermissionDenied = isDeno\n ? Deno.errors.PermissionDenied\n : class PermissionDenied extends Error {};\nexport const TimedOut = isDeno\n ? Deno.errors.TimedOut\n : class TimedOut extends Error {};\nexport const UnexpectedEof = isDeno\n ? Deno.errors.UnexpectedEof\n : class UnexpectedEof extends Error {};\nexport const WriteZero = isDeno\n ? Deno.errors.WriteZero\n : class WriteZero extends Error {};\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport * as errors from \"./unstable_errors.js\";\n\ntype Class<T> = new (...params: unknown[]) => T;\n\ntype ClassOrT<T> = T extends Class<infer U> ? U : T;\n\nfunction mapper(Ctor: typeof errors[keyof typeof errors]) {\n return (err: Error) =>\n Object.assign(new Ctor(err.message), {\n stack: err.stack,\n }) as unknown as ClassOrT<typeof Ctor>;\n}\n\nconst map: Record<string, ReturnType<typeof mapper>> = {\n EEXIST: mapper(errors.AlreadyExists),\n ENOENT: mapper(errors.NotFound),\n EBADF: mapper(errors.BadResource),\n};\n\nfunction isNodeErr(e: unknown): e is Error & { code: string } {\n return e instanceof Error && \"code\" in e;\n}\n\nexport function mapError<E>(e: E) {\n if (!isNodeErr(e)) return e;\n return map[e.code]?.(e) || e;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport { getNodeFs, isDeno } from \"./_utils.ts\";\nimport { mapError } from \"./_map_error.ts\";\n\n/**\n * Options which can be set when using {@linkcode mkdir} and\n * {@linkcode mkdirSync}.\n */\nexport interface MkdirOptions {\n /**\n * If set to `true`, means that any intermediate directories will also be\n * created (as with the shell command `mkdir -p`).\n *\n * Intermediate directories are created with the same permissions.\n *\n * When recursive is set to `true`, succeeds silently (without changing any\n * permissions) if a directory already exists at the path, or if the path\n * is a symlink to an existing directory.\n *\n * @default {false}\n */\n recursive?: boolean;\n /**\n * Permissions to use when creating the directory (defaults to `0o777`,\n * before the process's umask).\n *\n * Ignored on Windows.\n */\n mode?: number;\n}\n\n/**\n * Creates a new directory with the specified path.\n *\n * Defaults to throwing error if the directory already exists.\n *\n * Requires `allow-write` permission.\n *\n * @example Usage\n * ```ts ignore\n * import { mkdir } from \"@std/fs/unstable-mkdir\";\n * await mkdir(\"new_dir\");\n * await mkdir(\"nested/directories\", { recursive: true });\n * await mkdir(\"restricted_access_dir\", { mode: 0o700 });\n * ```\n *\n * @tags allow-write\n *\n * @param path The path to the new directory.\n * @param options Options for creating directories.\n */\nexport async function mkdir(\n path: string | URL,\n options?: MkdirOptions,\n): Promise<void> {\n if (isDeno) {\n await Deno.mkdir(path, { ...options });\n } else {\n try {\n await getNodeFs().promises.mkdir(path, { ...options });\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n\n/**\n * Synchronously creates a new directory with the specified path.\n *\n * Defaults to throwing error if the directory already exists.\n *\n * Requires `allow-write` permission.\n *\n * @example Usage\n * ```ts ignore\n * import { mkdirSync } from \"@std/fs/unstable-mkdir\";\n * mkdirSync(\"new_dir\");\n * mkdirSync(\"nested/directories\", { recursive: true });\n * mkdirSync(\"restricted_access_dir\", { mode: 0o700 });\n * ```\n *\n * @tags allow-write\n *\n * @param path The path to the new directory.\n * @param options Options for creating directories.\n */\nexport function mkdirSync(path: string | URL, options?: MkdirOptions) {\n if (isDeno) {\n Deno.mkdirSync(path, { ...options });\n } else {\n try {\n getNodeFs().mkdirSync(path, { ...options });\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport type { FileInfo } from \"./unstable_types.ts\";\nimport { isWindows } from \"jsr:@std/internal@^1.0.14/os\";\n\nexport function toFileInfo(s: import(\"node:fs\").Stats): FileInfo {\n return {\n atime: s.atime,\n // TODO(kt3k): uncomment this when we drop support for Deno 1.x\n // ctime: s.ctime,\n birthtime: s.birthtime,\n blksize: isWindows ? null : s.blksize,\n blocks: isWindows ? null : s.blocks,\n dev: s.dev,\n gid: isWindows ? null : s.gid,\n ino: isWindows ? null : s.ino,\n isDirectory: s.isDirectory(),\n isFile: s.isFile(),\n isSymlink: s.isSymbolicLink(),\n isBlockDevice: isWindows ? null : s.isBlockDevice(),\n isCharDevice: isWindows ? null : s.isCharacterDevice(),\n isFifo: isWindows ? null : s.isFIFO(),\n isSocket: isWindows ? null : s.isSocket(),\n mode: isWindows ? null : s.mode,\n mtime: s.mtime,\n nlink: isWindows ? null : s.nlink,\n rdev: isWindows ? null : s.rdev,\n size: s.size,\n uid: isWindows ? null : s.uid,\n };\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport { getNodeFs, isDeno } from \"./_utils.ts\";\nimport { mapError } from \"./_map_error.ts\";\nimport { toFileInfo } from \"./_to_file_info.ts\";\nimport type { FileInfo } from \"./unstable_types.ts\";\n\n/**\n * Resolves to a {@linkcode FileInfo} for the specified `path`. Will\n * always follow symlinks.\n *\n * Requires `allow-read` permission in Deno.\n *\n * @example Usage\n * ```ts\n * import { assert } from \"@std/assert\";\n * import { stat } from \"@std/fs/unstable-stat\";\n * const fileInfo = await stat(\"README.md\");\n * assert(fileInfo.isFile);\n * ```\n *\n * @tags allow-read\n *\n * @param path The path to the file or directory.\n * @returns A promise that resolves to a {@linkcode FileInfo} for the specified `path`.\n */\nexport async function stat(path: string | URL): Promise<FileInfo> {\n if (isDeno) {\n return Deno.stat(path);\n } else {\n try {\n return toFileInfo(await getNodeFs().promises.stat(path));\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n\n/**\n * Synchronously returns a {@linkcode FileInfo} for the specified\n * `path`. Will always follow symlinks.\n *\n * Requires `allow-read` permission in Deno.\n *\n * @example Usage\n * ```ts\n * import { assert } from \"@std/assert\";\n * import { statSync } from \"@std/fs/unstable-stat\";\n *\n * const fileInfo = statSync(\"README.md\");\n * assert(fileInfo.isFile);\n * ```\n *\n * @tags allow-read\n *\n * @param path The path to the file or directory.\n * @returns A {@linkcode FileInfo} for the specified `path`.\n */\nexport function statSync(path: string | URL): FileInfo {\n if (isDeno) {\n return Deno.statSync(path);\n } else {\n try {\n return toFileInfo(getNodeFs().statSync(path));\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport { getNodeFs } from \"./_utils.ts\";\nimport type { WriteFileOptions } from \"./unstable_types.ts\";\nimport type { OpenOptions } from \"./unstable_open.ts\";\n\ntype WriteBooleanOptions = Pick<\n WriteFileOptions,\n \"append\" | \"create\" | \"createNew\"\n>;\n\ntype OpenBooleanOptions = Pick<\n OpenOptions,\n \"read\" | \"write\" | \"append\" | \"truncate\" | \"create\" | \"createNew\"\n>;\n\n/**\n * Uses the boolean options specified in {@linkcode WriteFileOptions} to\n * construct the composite flag value to pass to the `flag` option in the\n * Node.js `writeFile` function.\n */\nexport function getWriteFsFlag(opt: WriteBooleanOptions): number {\n const { O_APPEND, O_CREAT, O_EXCL, O_TRUNC, O_WRONLY } =\n getNodeFs().constants;\n\n let flag = O_WRONLY;\n if (opt.create) {\n flag |= O_CREAT;\n }\n if (opt.createNew) {\n flag |= O_EXCL;\n }\n if (opt.append) {\n flag |= O_APPEND;\n } else {\n flag |= O_TRUNC;\n }\n return flag;\n}\n\n/**\n * Uses the boolean options specified in {@linkcode OpenOptions} to construct the\n * composite flag value to pass to the `flag` option in the Node.js `open`\n * function.\n */\nexport function getOpenFsFlag(opt: OpenBooleanOptions): number {\n const { O_APPEND, O_CREAT, O_EXCL, O_WRONLY, O_RDONLY, O_RDWR, O_TRUNC } =\n getNodeFs().constants;\n\n if (\n !opt.read && !opt.write && !opt.append && !opt.truncate && !opt.create &&\n !opt.createNew\n ) {\n throw new Error(\"'options' requires at least one option to be true\");\n }\n\n if (!opt.write && opt.truncate) {\n throw new Error(\"'truncate' option requires 'write' to be true\");\n }\n\n if ((opt.create || opt.createNew) && !(opt.write || opt.append)) {\n throw new Error(\n \"'create' or 'createNew' options require 'write' or 'append' to be true\",\n );\n }\n\n // This error is added to match the Deno runtime. Deno throws a `TypeError`\n // (os error 22) for this OpenOption combo. Under Node.js, the bitmask\n // combinations of (O_RDWR | O_TRUNC | O_APPEND) and\n // (O_WRONLY | O_TRUNC | O_APPEND) to open files are valid.\n if (opt.write && opt.append && opt.truncate) {\n throw new TypeError(\"Invalid argument\");\n }\n\n let flag = O_RDONLY;\n if (opt.read && !opt.write) {\n flag |= O_RDONLY;\n }\n\n if (opt.read && opt.write) {\n flag |= O_RDWR;\n }\n\n if (!opt.read && opt.write) {\n flag |= O_WRONLY;\n }\n\n if (opt.create || opt.createNew) {\n flag |= O_CREAT;\n }\n\n if (opt.createNew) {\n flag |= O_EXCL;\n }\n\n if (opt.append) {\n flag |= O_APPEND;\n if (!opt.read) {\n flag |= O_WRONLY;\n } else {\n flag |= O_RDWR;\n }\n }\n\n if (opt.truncate) {\n flag |= O_TRUNC;\n }\n\n return flag;\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport { getNodeFs, isDeno } from \"./_utils.ts\";\nimport { getWriteFsFlag } from \"./_get_fs_flag.ts\";\nimport { mapError } from \"./_map_error.ts\";\nimport type { WriteFileOptions } from \"./unstable_types.ts\";\n\n/**\n * Write `data` to the given `path`, by default creating a new file if needed,\n * else overwriting.\n *\n * Requires `allow-write` permission, and `allow-read` if `options.create` is\n * `false`.\n *\n * @example Usage\n * ```ts ignore\n * import { writeFile } from \"@std/fs/unstable-write-file\";\n * const encoder = new TextEncoder();\n * const data = encoder.encode(\"Hello world\\n\");\n * await Deno.writeFile(\"hello1.txt\", data); // overwrite \"hello1.txt\" or create it\n * await Deno.writeFile(\"hello2.txt\", data, { create: false }); // only works if \"hello2.txt\" exists\n * await Deno.writeFile(\"hello3.txt\", data, { mode: 0o777 }); // set permissions on new file\n * await Deno.writeFile(\"hello4.txt\", data, { append: true }); // add data to the end of the file\n * ```\n *\n * @tags allow-read, allow-write\n *\n * @param path The path of the file that `data` is written to.\n * @param data The content in bytes or a stream of bytes to be written.\n * @param options Options to write files. See {@linkcode WriteFileOptions}.\n */\nexport async function writeFile(\n path: string | URL,\n data: Uint8Array | ReadableStream<Uint8Array>,\n options?: WriteFileOptions,\n): Promise<void> {\n if (isDeno) {\n await Deno.writeFile(path, data, { ...options });\n } else {\n const {\n append = false,\n create = true,\n createNew = false,\n mode,\n signal,\n } = options ?? {};\n\n const flag = getWriteFsFlag({ append, create, createNew });\n try {\n await getNodeFs().promises.writeFile(path, data, { flag, signal });\n if (mode != null) {\n await getNodeFs().promises.chmod(path, mode);\n }\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n\n/**\n * Synchronously write `data` to the given `path`, by default creating a new\n * file if needed, else overwriting.\n *\n * Requires `allow-write` permission, and `allow-read` if `options.create` is\n * `false`.\n *\n * @example Usage\n * ```ts ignore\n * import { writeFileSync } from \"@std/fs/unstable-write-file\";\n * const encoder = new TextEncoder();\n * const data = encoder.encode(\"Hello world\\n\");\n * writeFileSync(\"hello1.txt\", data); // overwrite \"hello1.txt\" or create it\n * writeFileSync(\"hello2.txt\", data, { create: false }); // only works if \"hello2.txt\" exists\n * writeFileSync(\"hello3.txt\", data, { mode: 0o777 }); // set permissions on new file\n * writeFileSync(\"hello4.txt\", data, { append: true }); // add data to the end of the file\n * ```\n *\n * @tags allow-read, allow-write\n *\n * @param path The path of the file that `data` is written to.\n * @param data The content in bytes to be written.\n * @param options Options to write files. See {@linkcode WriteFileOptions}.\n */\nexport function writeFileSync(\n path: string | URL,\n data: Uint8Array,\n options?: WriteFileOptions,\n): void {\n if (isDeno) {\n Deno.writeFileSync(path, data, { ...options });\n } else {\n const {\n append = false,\n create = true,\n createNew = false,\n mode,\n signal,\n } = options ?? {};\n\n const flag = getWriteFsFlag({ append, create, createNew });\n try {\n getNodeFs().writeFileSync(path, data, { flag, signal });\n if (mode != null) {\n getNodeFs().chmodSync(path, mode);\n }\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport { getNodeFs, isDeno } from \"./_utils.ts\";\nimport { getWriteFsFlag } from \"./_get_fs_flag.ts\";\nimport { mapError } from \"./_map_error.ts\";\nimport type { WriteFileOptions } from \"./unstable_types.ts\";\n\n/**\n * Write string `data` to the given `path`, by default creating a new file if\n * needed, else overwriting.\n *\n * Requires `allow-write` permission, and `allow-read` if `options.create` is\n * `false`.\n *\n * @example Usage\n * ```ts ignore\n * import { writeTextFile } from \"@std/fs/unstable-write-text-file\";\n * await writeTextFile(\"hello1.txt\", \"Hello world\\n\"); // overwrite \"hello1.txt\" or create it\n * ```\n *\n * @tags allow-read, allow-write\n *\n * @param path The path of the file that `data` is written to.\n * @param data A UTF-8 string or a stream of UTF-8 strings.\n * @param options Options for writing files. See {@linkcode WriteFileOptions}.\n */\nexport async function writeTextFile(\n path: string | URL,\n data: string | ReadableStream<string>,\n options?: WriteFileOptions,\n): Promise<void> {\n if (isDeno) {\n await Deno.writeTextFile(path, data, { ...options });\n } else {\n const {\n append = false,\n create = true,\n createNew = false,\n mode,\n signal,\n } = options ?? {};\n\n const flag = getWriteFsFlag({ append, create, createNew });\n try {\n await getNodeFs().promises.writeFile(path, data, {\n encoding: \"utf-8\",\n flag,\n signal,\n });\n if (mode != null) {\n await getNodeFs().promises.chmod(path, mode);\n }\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n\n/**\n * Synchronously write string `data` to the given `path`, by default creating\n * a new file if needed, else overwriting.\n *\n * Requires `allow-write` permission, and `allow-read` if `options.create` is\n * `false`.\n *\n * @example Usage\n * ```ts ignore\n * import { writeTextFileSync } from \"@std/fs/unstable-write-text-file\";\n * writeTextFileSync(\"hello1.txt\", \"Hello world\\n\"); // overwrite \"hello1.txt\" or create it\n * ```\n *\n * @tags allow-read, allow-write\n *\n * @param path The path of the file that `data` is written to.\n * @param data A UTF-8 string.\n * @param options Options for writing files. See {@linkcode WriteFileOptions}.\n */\nexport function writeTextFileSync(\n path: string | URL,\n data: string,\n options?: WriteFileOptions,\n): void {\n if (isDeno) {\n Deno.writeTextFileSync(path, data, { ...options });\n } else {\n const {\n append = false,\n create = true,\n createNew = false,\n mode,\n } = options ?? {};\n\n const flag = getWriteFsFlag({ append, create, createNew });\n try {\n getNodeFs().writeFileSync(path, data, { encoding: \"utf-8\", flag });\n if (mode != null) {\n getNodeFs().chmodSync(path, mode);\n }\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n", "import { pooledMap } from \"@std/async\";\nimport * as path from \"@std/path\";\nimport { mkdir } from \"@std/fs/unstable-mkdir\";\nimport { stat } from \"@std/fs/unstable-stat\";\nimport { writeFile } from \"@std/fs/unstable-write-file\";\nimport { writeTextFile } from \"@std/fs/unstable-write-text-file\";\nimport {\n BlobReader,\n TextWriter,\n Uint8ArrayWriter,\n ZipReader,\n} from \"@zip.js/zip.js\";\nimport { createRequire } from \"node:module\";\n\nimport { getPkg, pkg } from \"./utils.mts\";\n\nexport async function install(output: URL) {\n const { default: delance } = await import(\"@delance/builder\");\n\n await mkdir(output, { recursive: true });\n\n const zip: ZipReader<BlobReader> = new ZipReader(\n new BlobReader(await getPkg()),\n );\n\n const prefix = path.normalize(\"extension/dist/\");\n\n for await (\n const _ of pooledMap(4, zip.getEntriesGenerator(), async (entry) => {\n const filename = path.normalize(entry.filename);\n if (!filename.startsWith(prefix)) {\n return;\n }\n\n console.time(filename);\n const dest = filename.slice(prefix.length);\n\n if (entry.directory) {\n await mkdir(new URL(dest, output), { recursive: true });\n return;\n }\n\n if (dest.endsWith(\".bundle.js\")) {\n if (dest.startsWith(\"browser.\")) {\n return;\n }\n const writer = new TextWriter();\n await entry.getData(writer);\n\n const script = await delance(await writer.getData());\n await mkdir(new URL(path.dirname(dest), output), {\n recursive: true,\n });\n\n await writeTextFile(new URL(dest, output), script);\n } else {\n const writer = new Uint8ArrayWriter();\n await entry.getData(writer);\n await mkdir(new URL(path.dirname(dest), output), {\n recursive: true,\n });\n\n await mkdir(new URL(path.dirname(dest), output), {\n recursive: true,\n });\n await writeFile(new URL(dest, output), await writer.getData());\n }\n\n console.timeEnd(filename);\n })\n );\n}\n\nexport async function run(dist: URL) {\n const load = createRequire(dist);\n const output = new URL(`v${pkg.version}-${pkg.delance.sha256}/`, dist);\n\n let processed = true;\n try {\n await stat(new URL(\"server.bundle.js\", output));\n } catch {\n processed = false;\n }\n\n if (!processed) {\n await install(output);\n }\n\n // This acts as a bridge for the CJS <-> ESM world.\n const langserver = new URL(\"langserver.cjs\", dist);\n await writeTextFile(\n langserver,\n `#!/usr/bin/env node\n\nrequire('./v${pkg.version}-${pkg.delance.sha256}/server.bundle.js');`,\n );\n\n load(\"./langserver.cjs\");\n}\n", "import process from \"node:process\";\nimport { readFile } from \"@std/fs/unstable-read-file\";\nimport { retry } from \"@std/async\";\nimport { assertEquals } from \"@std/assert\";\nimport { encodeHex } from \"@std/encoding\";\n\nimport pkg from \"./deno.json\" with { type: \"json\" };\n\nconst reverse = (string: string) => [...string].reverse().join(\"\");\n\nconst BASE_URL = new URL(reverse(\"/moc.oidutslausiv.ecalptekram//:sptth\"));\nconst PUBLISHER = reverse(\"nohtyp-sm\");\nconst EXTENSION = reverse(\"ecnalyp-edocsv\");\n\nconst ITEMS = new URL(`/items?itemName=${PUBLISHER}.${EXTENSION}`, BASE_URL);\n\nconst INIT: RequestInit = {\n headers: {\n \"user-agent\": \"Mozilla/5.0 (Delance) Gecko/20100101 Firefox/120.0\",\n },\n credentials: \"include\",\n};\n\nclass HttpError extends Error {\n status: number;\n constructor(response: Response) {\n super(response.statusText);\n this.status = response.status;\n }\n}\n\nexport async function sha256(blob: Blob) {\n return encodeHex(\n new Uint8Array(\n await crypto.subtle.digest(\"SHA-256\", await blob.arrayBuffer()),\n ),\n );\n}\n\nconst pkgVersion = pkg.version.split(\"-\")[0];\n\nexport async function getPkg({ check = true, version = pkgVersion } = {}) {\n const PACKAGE = new URL(\n `/_apis/public/gallery/publishers/${PUBLISHER}/vsextensions/${EXTENSION}/${version}/vspackage`,\n BASE_URL,\n );\n\n let vsix: Blob | null = null;\n\n if (process.env.DELANCE_VSIX) {\n try {\n vsix = new Blob([\n new Uint8Array(await readFile(process.env.DELANCE_VSIX)),\n ]);\n if (check) {\n assertEquals(\n await sha256(vsix),\n pkg.delance.sha256,\n \"sha256 mismatch\",\n );\n }\n } catch (e) {\n if (\n e instanceof Error && \"syscall\" in e && e.syscall === \"open\"\n ) {\n console.error(e);\n } else {\n throw e;\n }\n }\n }\n\n if (!vsix) {\n const { headers } = await fetch(ITEMS, INIT);\n const cookie = headers\n .getSetCookie()\n .map((c) => c.split(\";\", 2)[0])\n .join(\"; \");\n\n vsix = await retry(async () => {\n const response = await fetch(PACKAGE, {\n headers: {\n cookie,\n },\n redirect: \"follow\",\n referrer: ITEMS.href,\n });\n\n if (!response.ok) {\n throw new HttpError(response);\n }\n\n const blob = await response.blob();\n\n if (check) {\n assertEquals(\n await sha256(blob),\n pkg.delance.sha256,\n \"sha256 mismatch\",\n );\n }\n\n return blob;\n }, {\n isRetriable(err) {\n return err instanceof HttpError &&\n (err.status === 429 || err.status >= 500);\n },\n });\n }\n\n return vsix;\n}\n\nexport { pkg };\n", "// Copyright 2018-2026 the Deno authors. MIT license.\n\nimport { getNodeFs, isDeno } from \"./_utils.ts\";\nimport type { ReadFileOptions } from \"./unstable_types.ts\";\nimport { mapError } from \"./_map_error.ts\";\n\n/**\n * Reads and resolves to the entire contents of a file as an array of bytes.\n * `TextDecoder` can be used to transform the bytes to string if required.\n *\n * Requires `allow-read` permission.\n *\n * @example Usage\n * ```ts no-assert\n * import { readFile } from \"@std/fs/unstable-read-file\";\n * const decoder = new TextDecoder(\"utf-8\");\n * const data = await readFile(\"README.md\");\n * console.log(decoder.decode(data));\n * ```\n *\n * @tags allow-read\n *\n * @param path The path to the file.\n * @param options Options when reading a file. See {@linkcode ReadFileOptions}.\n * @returns A promise that resolves to a `Uint8Array` of the file contents.\n */\nexport async function readFile(\n path: string | URL,\n options?: ReadFileOptions,\n): Promise<Uint8Array> {\n if (isDeno) {\n return Deno.readFile(path, { ...options });\n } else {\n const { signal } = options ?? {};\n try {\n const buf = await getNodeFs().promises.readFile(path, { signal });\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n\n/**\n * Synchronously reads and returns the entire contents of a file as an array\n * of bytes. `TextDecoder` can be used to transform the bytes to string if\n * required.\n *\n * Requires `allow-read` permission.\n *\n * @example Usage\n * ```ts no-assert\n * import { readFileSync } from \"@std/fs/unstable-read-file\";\n * const decoder = new TextDecoder(\"utf-8\");\n * const data = readFileSync(\"README.md\");\n * console.log(decoder.decode(data));\n * ```\n *\n * @tags allow-read\n *\n * @param path The path to the file.\n * @returns A `Uint8Array` of bytes representing the file contents.\n */\nexport function readFileSync(path: string | URL): Uint8Array {\n if (isDeno) {\n return Deno.readFileSync(path);\n } else {\n try {\n const buf = getNodeFs().readFileSync(path);\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);\n } catch (error) {\n throw mapError(error);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["obj", "a", "b", "format", "Deno", "process", "result", "code", "Deno", "result", "common", "result", "k", "A", "B", "M", "N", "fp", "p", "index", "unescape", "result", "t", "format", "alphabet", "rAlphabet", "alphabet", "rAlphabet", "alphabet", "rAlphabet", "alphabet", "rAlphabet", "encode", "alphabet", "decode", "rAlphabet", "encode", "alphabet", "decode", "rAlphabet", "init_mod", "default", "default", "entry", "parse", "parseExpression", "init_mod", "parse", "code", "generate", "transform", "default", "init_mod", "createDebug", "applyTransformAsync", "transform", "logger", "default", "applyTransform", "t", "matcher", "matcher", "t", "t", "matcher", "t", "t", "init_mod", "t", "NODE_FIELDS", "t", "init_mod", "t", "NODE_FIELDS", "k", "init_mod", "t", "init_mod", "matcher", "t", "t", "expression", "predicate", "init_mod", "init_match", "init_mod", "init_match", "matcher", "path", "init_mod", "init_mod", "init_mod", "init_mod", "init_mod", "init_mod", "init_mod", "init_mod", "default", "init_mod", "init_mod", "p", "default", "init_mod", "default", "init_mod", "applyTransform", "init_mod", "mod", "init_mod", "default", "mod", "exp", "init_mod", "default", "mod", "init_mod", "default", "mod", "k", "init_mod", "default", "init_mod", "default", "init_mod", "p", "transform", "init_mod", "init_mod", "matcher", "matcher", "init_mod", "init_ast", "p", "default", "matcher", "ref", "init_mod", "init_ast", "init_mod", "init_ast", "transform", "p", "statement", "applyTransform", "init_mod", "matcher", "generate", "default", "code", "default", "init_mod", "init_mod", "matcher", "init_mod", "init_mod", "init_ast", "p", "result", "arrayExpression", "variableDeclaration", "matcher", "default", "init_mod", "createDebug", "generate", "code", "createDebug", "mod_default", "init_mod", "logger", "applyTransform", "applyTransformAsync", "p", "init_mod", "init_mod", "matcher", "init_mod", "init_mod", "init_mod", "logicalExpression", "binaryExpression", "init_mod", "matcher", "parseExpression", "expression", "init_mod", "matcher", "init_mod", "init_mod", "expression", "init_mod", "i", "matcher", "init_mod", "p", "main", "init_mod", "init_mod", "matcher", "init_mod", "matcher", "init_mod", "matcher", "trueMatcher", "falseMatcher", "init_mod", "init_mod", "matcher", "init_mod", "matcher", "mod_default", "init_mod", "init_mod", "matcher", "transform", "applyTransformAsync", "mod_default", "code", "applyTransform", "init_mod", "transform", "init_mod", "mod_exports", "mod_default", "transform", "code", "generate", "parse", "init_mod", "resolve", "delay", "p", "result", "exp", "code", "isPosixPathSeparator", "code", "fromFileUrl", "assertArg", "assertArg", "dirname", "fromFileUrl", "assertArg", "code", "isPosixPathSeparator", "dirname", "assertArg", "isPathSeparator", "code", "assertArg", "isAbsolute", "normalize", "fromFileUrl", "assertArg", "isAbsolute", "code", "normalize", "init_mod", "normalize", "entry", "dirname", "run"]
|
|
7
7
|
}
|