@schematics/angular
Version:
Schematics specific to Angular
139 lines (138 loc) • 5.71 kB
TypeScript
/**
* @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;
};