/**
 * @license
 * Copyright Google LLC All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.dev/license
 */
/**
 * @fileoverview This file is the single source of truth for all "TODO" notes
 * generated by the Jasmine to Vitest schematic.
 *
 * It defines the `TODO_NOTES` constant, which contains the message and optional
 * documentation URL for each category of manual migration task.
 *
 * The file also exports advanced mapped types (`TodoCategory`, `TodoContextMap`)
 * that are inferred directly from the `TODO_NOTES` object. This creates a
 * maintainable, type-safe system that ensures consistency across all
 * transformers and prevents runtime errors.
 */
/**
 * The central configuration for all "TODO" notes. Each key represents a unique
 * `TodoCategory`.
 *
 * Each entry is an object with:
 * - `message`: A string or a function that returns a string. If it's a function,
 *   it receives a `context` object to generate a dynamic message.
 * - `url`: An optional documentation URL that will be appended to the message.
 */
export declare const TODO_NOTES: {
    readonly pending: {
        readonly message: "The pending() function was converted to a skipped test (`it.skip`).";
        readonly url: "https://vitest.dev/api/vi.html#it-skip";
    };
    readonly toHaveSpyInteractions: {
        readonly message: string;
    };
    readonly toThrowMatching: {
        readonly message: (context: {
            name: string;
        }) => string;
        readonly url: "https://vitest.dev/api/expect.html#tothrowerror";
    };
    readonly toBePending: {
        readonly message: string;
    };
    readonly 'unsupported-expect-async-matcher': {
        readonly message: (context: {
            name: string;
        }) => string;
    };
    readonly 'arrayWithExactContents-dynamic-variable': {
        readonly message: "Cannot transform jasmine.arrayWithExactContents with a dynamic variable. Please migrate this manually.";
    };
    readonly 'arrayWithExactContents-check': {
        readonly message: "Verify this matches strict array content (multiset equality). Vitest's arrayContaining is a subset check.";
    };
    readonly 'expect-nothing': {
        readonly message: "expect().nothing() has been removed because it is redundant in Vitest. Tests without assertions pass by default.";
    };
    readonly 'unsupported-global-function': {
        readonly message: (context: {
            name: string;
        }) => string;
    };
    readonly addMatchers: {
        readonly message: "jasmine.addMatchers is not supported. Please manually migrate to expect.extend().";
        readonly url: "https://vitest.dev/api/expect.html#expect-extend";
    };
    readonly addCustomEqualityTester: {
        readonly message: "jasmine.addCustomEqualityTester is not supported. Please manually migrate to expect.addEqualityTesters().";
        readonly url: "https://vitest.dev/api/expect.html#expect-addequalitytesters";
    };
    readonly mapContaining: {
        readonly message: string;
    };
    readonly setContaining: {
        readonly message: string;
    };
    readonly 'unknown-jasmine-property': {
        readonly message: (context: {
            name: string;
        }) => string;
    };
    readonly spyOnAllFunctions: {
        readonly message: string;
        readonly url: "https://vitest.dev/api/vi.html#vi-spyon";
    };
    readonly 'createSpyObj-single-argument': {
        readonly message: "jasmine.createSpyObj called with a single argument is not supported for transformation.";
        readonly url: "https://vitest.dev/api/vi.html#vi-fn";
    };
    readonly 'createSpyObj-dynamic-variable': {
        readonly message: "Cannot transform jasmine.createSpyObj with a dynamic variable. Please migrate this manually.";
        readonly url: "https://vitest.dev/api/vi.html#vi-fn";
    };
    readonly 'createSpyObj-dynamic-property-map': {
        readonly message: "Cannot transform jasmine.createSpyObj with a dynamic property map. Please migrate this manually.";
        readonly url: "https://vitest.dev/api/vi.html#vi-fn";
    };
    readonly 'unsupported-spy-strategy': {
        readonly message: (context: {
            name: string;
        }) => string;
        readonly url: "https://vitest.dev/api/mocked.html#mock";
    };
    readonly 'mostRecent-without-args': {
        readonly message: string;
        readonly url: "https://vitest.dev/api/mocked.html#mock-lastcall";
    };
    readonly 'unhandled-done-usage': {
        readonly message: "The 'done' callback was used in an unhandled way. Please migrate manually.";
    };
};
/**
 * A union type of all possible "TODO" categories.
 * It is derived from the keys of the `TODO_NOTES` object to ensure that only
 * valid categories can be used throughout the transformers.
 */
export type TodoCategory = keyof typeof TODO_NOTES;
/**
 * A mapped type that creates a map from a `TodoCategory` to the type of the
 * context object that its message function expects. This provides strong type
 * safety for calls to `addTodoComment`.
 *
 * It works by checking if the `message` property for a given category is a
 * function. If it is, it uses `infer` to extract the type of the first
 * parameter (`P`). If it's not a function, it resolves to `never`.
 *
 * @example
 * // `Context` will be `{ name: string }`
 * type Context = TodoContextMap['unknown-jasmine-property'];
 *
 * // `Context` will be `never`
 * type Context = TodoContextMap['pending'];
 */
export type TodoContextMap = {
    [K in TodoCategory]: (typeof TODO_NOTES)[K]['message'] extends (context: infer P) => string ? P : never;
};
