Skip to content

Commit

Permalink
Add options validation for other plugins
Browse files Browse the repository at this point in the history
  • Loading branch information
edsrzf committed May 2, 2021
1 parent 05a1d3d commit 6319866
Show file tree
Hide file tree
Showing 7 changed files with 87 additions and 9 deletions.
8 changes: 5 additions & 3 deletions packages/ts-migrate-plugins/src/plugins/add-conversions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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}'.
Expand All @@ -16,6 +15,7 @@ const supportedDiagnostics = new Set([

const addConversionsPlugin: Plugin<Options> = {
name: 'add-conversions',

run({ fileName, sourceFile, text, options, getLanguageService }) {
// Filter out diagnostics we care about.
const diags = getLanguageService()
Expand All @@ -31,6 +31,8 @@ const addConversionsPlugin: Plugin<Options> = {
const printer = ts.createPrinter();
return printer.printFile(newSourceFile);
},

validate: validateAnyAliasOptions,
};

export default addConversionsPlugin;
Expand Down
25 changes: 24 additions & 1 deletion packages/ts-migrate-plugins/src/plugins/jsdoc.ts
Original file line number Diff line number Diff line change
@@ -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<string, TypeOptions>;

Expand Down Expand Up @@ -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<Options> = {
name: 'jsdoc',

run({ sourceFile, text, options }) {
const result = ts.transform(sourceFile, [jsDocTransformerFactory(options)]);
const newSourceFile = result.transformed[0];
Expand All @@ -54,6 +75,8 @@ const jsDocPlugin: Plugin<Options> = {
const printer = ts.createPrinter();
return printer.printFile(newSourceFile);
},

validate: createValidate(optionProperties),
};

export default jsDocPlugin;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Options> = {
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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;`
Expand All @@ -16,6 +21,7 @@ const WITH_DEFAULT_PROPS_HELPER = `WithDefaultProps`;

const reactDefaultPropsPlugin: Plugin<Options> = {
name: 'react-default-props',

run({ sourceFile, text, options }) {
const importDeclarations = sourceFile.statements.filter(ts.isImportDeclaration);
const expressionStatements = sourceFile.statements.filter(ts.isExpressionStatement);
Expand Down Expand Up @@ -344,6 +350,8 @@ const reactDefaultPropsPlugin: Plugin<Options> = {

return updateSourceText(text, updates);
},

validate: createValidate(optionProperties),
};

// the target project might not have this as an internal dependency in project.json
Expand Down
23 changes: 20 additions & 3 deletions packages/ts-migrate-plugins/src/plugins/react-props.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Options> = {
name: 'react-props',

run({ fileName, sourceFile, options }) {
if (!fileName.endsWith('.tsx')) return undefined;

Expand Down Expand Up @@ -79,6 +94,8 @@ const reactPropsPlugin: Plugin<Options> = {
: [];
return updateSourceText(updatedSourceText, importUpdates);
},

validate: createValidate(optionProperties),
};

export default reactPropsPlugin;
Expand Down
16 changes: 14 additions & 2 deletions packages/ts-migrate-plugins/src/plugins/react-shape.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,23 @@ 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`
* only if we have them - this file might have shapes
*/
const reactShapePlugin: Plugin<Options> = {
name: 'react-shape',

run({ fileName, sourceFile, options, text }) {
const baseName = path.basename(fileName);
const importDeclarations = sourceFile.statements.filter(ts.isImportDeclaration);
Expand Down Expand Up @@ -219,6 +226,11 @@ const reactShapePlugin: Plugin<Options> = {

return updateSourceText(text, updates);
},

validate: createValidate({
...anyAliasProperty,
...anyFunctionAliasProperty,
}),
};

function getTypeForTheShape(
Expand Down
8 changes: 8 additions & 0 deletions packages/ts-migrate-plugins/src/plugins/ts-ignore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Options> = {
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;
Expand Down

0 comments on commit 6319866

Please sign in to comment.