diff --git a/packages/ts-migrate-plugins/src/plugins/add-conversions.ts b/packages/ts-migrate-plugins/src/plugins/add-conversions.ts index f8d363c..383b364 100644 --- a/packages/ts-migrate-plugins/src/plugins/add-conversions.ts +++ b/packages/ts-migrate-plugins/src/plugins/add-conversions.ts @@ -2,10 +2,9 @@ import ts from 'typescript'; import { Plugin } from 'ts-migrate-server'; import { isDiagnosticWithLinePosition } from '../utils/type-guards'; import getTokenAtPosition from './utils/token-pos'; +import { AnyAliasOptions, validateAnyAliasOptions } from '../utils/validateOptions'; -type Options = { - anyAlias?: string; -}; +type Options = AnyAliasOptions; const supportedDiagnostics = new Set([ // TS2339: Property '{0}' does not exist on type '{1}'. @@ -16,6 +15,7 @@ const supportedDiagnostics = new Set([ const addConversionsPlugin: Plugin = { name: 'add-conversions', + run({ fileName, sourceFile, text, options, getLanguageService }) { // Filter out diagnostics we care about. const diags = getLanguageService() @@ -31,6 +31,8 @@ const addConversionsPlugin: Plugin = { const printer = ts.createPrinter(); return printer.printFile(newSourceFile); }, + + validate: validateAnyAliasOptions, }; export default addConversionsPlugin; diff --git a/packages/ts-migrate-plugins/src/plugins/jsdoc.ts b/packages/ts-migrate-plugins/src/plugins/jsdoc.ts index a2e4481..38c0725 100644 --- a/packages/ts-migrate-plugins/src/plugins/jsdoc.ts +++ b/packages/ts-migrate-plugins/src/plugins/jsdoc.ts @@ -1,7 +1,12 @@ /* eslint-disable no-bitwise */ import ts from 'typescript'; import { Plugin } from 'ts-migrate-server'; -import { AnyAliasOptions } from '../utils/validateOptions'; +import { + AnyAliasOptions, + Properties, + anyAliasProperty, + createValidate, +} from '../utils/validateOptions'; type TypeMap = Record; @@ -43,8 +48,24 @@ type Options = { typeMap?: TypeMap; } & AnyAliasOptions; +const optionProperties: Properties = { + ...anyAliasProperty, + annotateReturns: { type: 'boolean' }, + typeMap: { + oneOf: [ + { type: 'string' }, + { + type: 'object', + properties: { tsName: { type: 'string' }, acceptsTypeParameters: { type: 'boolean' } }, + additionalProperties: false, + }, + ], + }, +}; + const jsDocPlugin: Plugin = { name: 'jsdoc', + run({ sourceFile, text, options }) { const result = ts.transform(sourceFile, [jsDocTransformerFactory(options)]); const newSourceFile = result.transformed[0]; @@ -54,6 +75,8 @@ const jsDocPlugin: Plugin = { const printer = ts.createPrinter(); return printer.printFile(newSourceFile); }, + + validate: createValidate(optionProperties), }; export default jsDocPlugin; diff --git a/packages/ts-migrate-plugins/src/plugins/react-class-lifecycle-methods.ts b/packages/ts-migrate-plugins/src/plugins/react-class-lifecycle-methods.ts index cbeb011..078009b 100644 --- a/packages/ts-migrate-plugins/src/plugins/react-class-lifecycle-methods.ts +++ b/packages/ts-migrate-plugins/src/plugins/react-class-lifecycle-methods.ts @@ -2,16 +2,24 @@ import ts from 'typescript'; import { Plugin } from 'ts-migrate-server'; import { getReactComponentHeritageType, isReactClassComponent } from './utils/react'; import updateSourceText, { SourceTextUpdate } from '../utils/updateSourceText'; +import { createValidate, Properties } from '../utils/validateOptions'; type Options = { force?: boolean }; +const optionProperties: Properties = { + force: { type: 'boolean' }, +}; + const reactClassLifecycleMethodsPlugin: Plugin = { name: 'react-class-lifecycle-methods', + run({ fileName, sourceFile, text, options }) { return /\.tsx$/.test(fileName) ? annotateReactComponentLifecycleMethods(sourceFile, text, options.force) : undefined; }, + + validate: createValidate(optionProperties), }; export default reactClassLifecycleMethodsPlugin; diff --git a/packages/ts-migrate-plugins/src/plugins/react-default-props.ts b/packages/ts-migrate-plugins/src/plugins/react-default-props.ts index ac543e3..f21c883 100644 --- a/packages/ts-migrate-plugins/src/plugins/react-default-props.ts +++ b/packages/ts-migrate-plugins/src/plugins/react-default-props.ts @@ -1,11 +1,16 @@ import ts from 'typescript'; import { Plugin } from 'ts-migrate-server'; import updateSourceText, { SourceTextUpdate } from '../utils/updateSourceText'; +import { createValidate, Properties } from '../utils/validateOptions'; type Options = { useDefaultPropsHelper?: boolean; }; +const optionProperties: Properties = { + useDefaultPropsHelper: { type: 'boolean' }, +}; + /** * At first, we are going to check is there any * - `CompName.defaultProps = defaultPropsName;` @@ -16,6 +21,7 @@ const WITH_DEFAULT_PROPS_HELPER = `WithDefaultProps`; const reactDefaultPropsPlugin: Plugin = { name: 'react-default-props', + run({ sourceFile, text, options }) { const importDeclarations = sourceFile.statements.filter(ts.isImportDeclaration); const expressionStatements = sourceFile.statements.filter(ts.isExpressionStatement); @@ -344,6 +350,8 @@ const reactDefaultPropsPlugin: Plugin = { return updateSourceText(text, updates); }, + + validate: createValidate(optionProperties), }; // the target project might not have this as an internal dependency in project.json diff --git a/packages/ts-migrate-plugins/src/plugins/react-props.ts b/packages/ts-migrate-plugins/src/plugins/react-props.ts index 34bc39c..9c131c5 100644 --- a/packages/ts-migrate-plugins/src/plugins/react-props.ts +++ b/packages/ts-migrate-plugins/src/plugins/react-props.ts @@ -13,18 +13,33 @@ import updateSourceText, { SourceTextUpdate } from '../utils/updateSourceText'; import getTypeFromPropTypesObjectLiteral, { createPropsTypeNameGetter } from './utils/react-props'; import { getTextPreservingWhitespace } from './utils/text'; import { updateImports, DefaultImport, NamedImport } from './utils/imports'; -import { AnyAliasOptions } from '../utils/validateOptions'; +import { + AnyAliasOptions, + AnyFunctionAliasOptions, + Properties, + anyAliasProperty, + anyFunctionAliasProperty, + createValidate, +} from '../utils/validateOptions'; type Options = { - anyFunctionAlias?: string; shouldUpdateAirbnbImports?: boolean; shouldKeepPropTypes?: boolean; -} & AnyAliasOptions; +} & AnyAliasOptions & + AnyFunctionAliasOptions; + +const optionProperties: Properties = { + ...anyAliasProperty, + ...anyFunctionAliasProperty, + shouldUpdateAirbnbImports: { type: 'boolean' }, + shouldKeepPropTypes: { type: 'boolean' }, +}; export type PropTypesIdentifierMap = { [property: string]: string }; const reactPropsPlugin: Plugin = { name: 'react-props', + run({ fileName, sourceFile, options }) { if (!fileName.endsWith('.tsx')) return undefined; @@ -79,6 +94,8 @@ const reactPropsPlugin: Plugin = { : []; return updateSourceText(updatedSourceText, importUpdates); }, + + validate: createValidate(optionProperties), }; export default reactPropsPlugin; diff --git a/packages/ts-migrate-plugins/src/plugins/react-shape.ts b/packages/ts-migrate-plugins/src/plugins/react-shape.ts index 91bf290..e4eee52 100644 --- a/packages/ts-migrate-plugins/src/plugins/react-shape.ts +++ b/packages/ts-migrate-plugins/src/plugins/react-shape.ts @@ -4,9 +4,15 @@ import path from 'path'; import { Plugin } from 'ts-migrate-server'; import getTypeFromPropTypesObjectLiteral from './utils/react-props'; import updateSourceText, { SourceTextUpdate } from '../utils/updateSourceText'; -import { AnyAliasOptions } from '../utils/validateOptions'; +import { + AnyAliasOptions, + AnyFunctionAliasOptions, + anyAliasProperty, + anyFunctionAliasProperty, + createValidate, +} from '../utils/validateOptions'; -type Options = { anyFunctionAlias?: string } & AnyAliasOptions; +type Options = AnyAliasOptions & AnyFunctionAliasOptions; /** * first we are checking if we have imports of `prop-types` or `react-validators` @@ -14,6 +20,7 @@ type Options = { anyFunctionAlias?: string } & AnyAliasOptions; */ const reactShapePlugin: Plugin = { name: 'react-shape', + run({ fileName, sourceFile, options, text }) { const baseName = path.basename(fileName); const importDeclarations = sourceFile.statements.filter(ts.isImportDeclaration); @@ -219,6 +226,11 @@ const reactShapePlugin: Plugin = { return updateSourceText(text, updates); }, + + validate: createValidate({ + ...anyAliasProperty, + ...anyFunctionAliasProperty, + }), }; function getTypeForTheShape( diff --git a/packages/ts-migrate-plugins/src/plugins/ts-ignore.ts b/packages/ts-migrate-plugins/src/plugins/ts-ignore.ts index be3ed6b..62ca00e 100644 --- a/packages/ts-migrate-plugins/src/plugins/ts-ignore.ts +++ b/packages/ts-migrate-plugins/src/plugins/ts-ignore.ts @@ -3,17 +3,25 @@ import ts from 'typescript'; import { Plugin } from 'ts-migrate-server'; import { isDiagnosticWithLinePosition } from '../utils/type-guards'; import updateSourceText, { SourceTextUpdate } from '../utils/updateSourceText'; +import { createValidate, Properties } from '../utils/validateOptions'; type Options = { useTsIgnore?: boolean }; +const optionProperties: Properties = { + useTsIgnore: { type: 'boolean' }, +}; + const tsIgnorePlugin: Plugin = { name: 'ts-ignore', + run({ getLanguageService, fileName, sourceFile, options }) { const diagnostics = getLanguageService() .getSemanticDiagnostics(fileName) .filter(isDiagnosticWithLinePosition); return getTextWithIgnores(sourceFile, diagnostics, options); }, + + validate: createValidate(optionProperties), }; export default tsIgnorePlugin;