jscodeshift transforms for migrating Button from v0 to v1 (#1663)

* Add new transform files

* Simple rename transforms

* Fix bugs

* Fix documentation

* Initial Checkbox migration

* Comments

* Initial Button migration

* Change files

* Initial package setup

* Initial package setup

* use strict

* README

* Fix typo

* Fix bug

* Fix bug

* Stand up tests?

* Get jest to work

* SIlence some warnings

* Fix some output file errors

* Set up typescript

* Make test file ts

* Translate file to TS

* Fix bugs

* Fix the README

* Fix the README

* Change files

* Fix prettier script

* Fix depcheck

* Undo changes to .vscode settings

* Remove incomplete codemods

* Add some comment on tests

* Add some comments

* Move files under packages

* Change files

* Minor fixes

* Minor fixes

* Rename package bring back tsconfig

* Remove unneeded import

* Delete transform change file

* Fix directory
This commit is contained in:
Ruriko Araki 2022-09-22 11:32:17 -07:00 коммит произвёл GitHub
Родитель 2d9c0cfd73
Коммит 1160d21823
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
17 изменённых файлов: 371 добавлений и 12 удалений

Просмотреть файл

@ -5,3 +5,4 @@ jest.config.js
packages/just-stack-monorepo/template/common/scripts
packages/example-lib
packages/documentation/website/build
packages/codemods/src/__testfixtures__

2
.prettierignore Normal file
Просмотреть файл

@ -0,0 +1,2 @@
#Ignore transforms test output files
**/src/__testfixtures__/*.output.tsx

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "Fix documentation",
"packageName": "@fluentui-react-native/checkbox",
"email": "ruaraki@microsoft.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Add button-v0-to-button-v1 script",
"packageName": "@fluentui-react-native/codemods",
"email": "ruaraki@microsoft.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,26 @@
# @fluentui-react-native/transforms
This package supplies transforms that help with refactoring FURN code. The transforms are passed into [jscodeshift](https://github.com/facebook/jscodeshift) to transform code.
## Usage
1. Install jscodeshift using the instructions [here](https://github.com/facebook/jscodeshift#install)
2. Run the transforms using the following command:
```cli
jscodeshift -t <path to transform file> --parser=tsx --extensions=tsx <path to file to be transformed>
```
For example
```cli
jscodeshift -t transforms/src/button-v0-to-v1.ts --parser=tsx --extensions=tsx apps/fluent-tester/src/TestComponents/Button/deprecated
```
## Tests
Test files are named in the format `<transform>-test.ts`. The "defineTest" from [jscodeshift](https://github.com/facebook/jscodeshift) is used to run the test.
Each test has an input and output file under the `__testfixtures__` folder. The input is an example of code before the transform is run, and the output is what the code should look like after running the transform.
Using this, we can ensure that the codemod works the way we intend to.
One caveat is that the codemod doesn't quite respect Prettier settings and doesn't seem to correctly format the output. So the output files are ignored by Prettier.

Просмотреть файл

@ -0,0 +1 @@
module.exports = require('@fluentui-react-native/scripts/babel.config');

Просмотреть файл

@ -0,0 +1,2 @@
const { configureJest } = require('@fluentui-react-native/scripts');
module.exports = configureJest({ testRegex: '/__tests__/.*-test\\.ts$' });

Просмотреть файл

@ -0,0 +1,3 @@
const { preset } = require('@fluentui-react-native/scripts');
preset();

Просмотреть файл

@ -0,0 +1,37 @@
{
"name": "@fluentui-react-native/codemods",
"version": "0.0.1",
"description": "Transform files to make refactoring FURN code easier",
"license": "MIT",
"author": "Microsoft <fluentuinativeowners@microsoft.com>",
"homepage": "https://github.com/microsoft/fluentui-react-native",
"main": "src/index.ts",
"module": "src/index.ts",
"typings": "lib/index.d.ts",
"scripts": {
"just": "fluentui-scripts",
"clean": "fluentui-scripts clean",
"depcheck": "fluentui-scripts depcheck",
"lint": "fluentui-scripts eslint",
"test": "fluentui-scripts jest",
"prettier": "fluentui-scripts prettier",
"prettier-fix": "fluentui-scripts prettier --fix true"
},
"repository": {
"type": "git",
"url": "https://github.com/microsoft/fluentui-react-native.git",
"directory": "packages/codemods"
},
"devDependencies": {
"@fluentui-react-native/eslint-config-rules": "^0.1.1",
"@fluentui-react-native/scripts": "^0.1.1",
"@fluentui-react-native/test-tools": ">=0.1.1 <1.0.0",
"@types/jscodeshift": "^0.11.5",
"jscodeshift": "^0.13.1"
},
"depcheck": {
"ignorePatterns": [
"src/__testfixtures__/*"
]
}
}

Просмотреть файл

@ -0,0 +1,37 @@
import { Button, PrimaryButton, StealthButton } from '@fluentui/react-native';
import { IFocusable } from '@fluentui-react-native/interactive-hooks';
import { Stack } from '@fluentui-react-native/stack';
import * as React from 'react';
import { SvgIconProps } from '@fluentui-react-native/icon';
export const ButtonFocusTest_deprecated: React.FunctionComponent = () => {
const [state, setState] = React.useState({
focused: false,
});
const buttonRef = React.useRef<IFocusable>(null);
const onFocus = React.useCallback(() => {
setState({ focused: !state.focused });
if (buttonRef.current && !state.focused) {
buttonRef.current.focus();
}
}, [state, setState]);
const testImage = require('./assets/icon_24x24.png');
const svgProps: SvgIconProps = {
viewBox: '0 0 500 500',
};
const iconProps = { svgSource: svgProps, width: 20, height: 20 };
return (
<Stack>
<Button content={state.focused ? 'Focused' : 'Not Focused'} componentRef={buttonRef} accessibilityLabel="overridden button name" />
<Button content="Click to focus" onClick={onFocus} tooltip="button tooltip" />
<Button content="Disabled Button" onClick={onFocus} tooltip="disabled button" disabled />
<PrimaryButton content="Primary Button" onClick={onFocus} />
<StealthButton content="Stealth Button" onClick={onFocus} />
<Button startIcon={testImage} content="Button with png Icon" tooltip="button tooltip" />
<Button endIcon={iconProps} content="Button with Right Icon" tooltip="button tooltip" />
</Stack>
);
};

Просмотреть файл

@ -0,0 +1,37 @@
import { ButtonV1 as Button } from '@fluentui/react-native';
import { IFocusable } from '@fluentui-react-native/interactive-hooks';
import { Stack } from '@fluentui-react-native/stack';
import * as React from 'react';
import { SvgIconProps } from '@fluentui-react-native/icon';
export const ButtonFocusTest_deprecated: React.FunctionComponent = () => {
const [state, setState] = React.useState({
focused: false,
});
const buttonRef = React.useRef<IFocusable>(null);
const onFocus = React.useCallback(() => {
setState({ focused: !state.focused });
if (buttonRef.current && !state.focused) {
buttonRef.current.focus();
}
}, [state, setState]);
const testImage = require('./assets/icon_24x24.png');
const svgProps: SvgIconProps = {
viewBox: '0 0 500 500',
};
const iconProps = { svgSource: svgProps, width: 20, height: 20 };
return (
<Stack>
<Button componentRef={buttonRef} accessibilityLabel="overridden button name">{state.focused ? 'Focused' : 'Not Focused'}</Button>
<Button onClick={onFocus} tooltip="button tooltip">Click to focus</Button>
<Button onClick={onFocus} tooltip="disabled button" disabled>Disabled Button</Button>
<Button onClick={onFocus} appearance='primary'>Primary Button</Button>
<Button onClick={onFocus} appearance='subtle'>Stealth Button</Button>
<Button icon={testImage} tooltip="button tooltip" iconPosition='before'>Button with png Icon</Button>
<Button icon={iconProps} tooltip="button tooltip" iconPosition='after'>Button with Right Icon</Button>
</Stack>
);
};

Просмотреть файл

@ -0,0 +1,7 @@
import { defineTest } from 'jscodeshift/dist/testUtils';
jest.autoMockOff();
describe('button-v0-to-v1', () => {
defineTest(__dirname, 'button-v0-to-v1', null, 'button-v0-to-v1', { parser: 'tsx' });
});

Просмотреть файл

@ -0,0 +1,110 @@
import { Transform, JSCodeshift, FileInfo, API, Options, ImportDeclaration, ASTPath, JSXElement } from 'jscodeshift';
export const transform: Transform = (fileInfo: FileInfo, api: API, options: Options) => {
const j: JSCodeshift = api.jscodeshift;
const printOptions = options.printOptions || {
printWidth: 140,
quote: 'single',
tabWidth: 2,
trailingComma: true,
};
const root = j(fileInfo.source);
root
// Find all imports that import from '@fluentui/react-native' or '@fluentui-react-native/button'
.find(
j.ImportDeclaration,
(path: ImportDeclaration) => path.source.value === '@fluentui/react-native' || path.source.value === '@fluentui-react-native/button',
)
.forEach((path: ASTPath<ImportDeclaration>) => {
if (!path.value.specifiers) {
return;
}
// Find the first import specifier that imports Button, PrimaryButton or StealthButton.
const buttonSpecifier = path.value.specifiers.findIndex(
(specifier) =>
specifier.type === 'ImportSpecifier' &&
(specifier.imported.name === 'Button' ||
specifier.imported.name === 'PrimaryButton' ||
specifier.imported.name === 'StealthButton'),
);
// Change that import to be 'ButtonV1 as Button'
if (buttonSpecifier !== undefined && buttonSpecifier !== -1) {
path.value.specifiers[buttonSpecifier] = j.importSpecifier(j.identifier('ButtonV1'), j.identifier('Button'));
}
// Filter out all other instances of importing Button, PrimaryButton, or StealthButton so that ButtonV1 is only imported once.
path.value.specifiers = path.value.specifiers.filter(
(specifier) =>
specifier.type !== 'ImportSpecifier' ||
(specifier.imported.name !== 'Button' &&
specifier.imported.name !== 'PrimaryButton' &&
specifier.imported.name !== 'StealthButton'),
);
});
// Change JSX instances of previous buttons to new type of button
root.findJSXElements('PrimaryButton').forEach((path: ASTPath<JSXElement>) => {
if (path.value.openingElement.name.type === 'JSXIdentifier') {
path.value.openingElement.name.name = 'Button';
if (path.value.openingElement.attributes === undefined) {
path.value.openingElement.attributes = [];
}
path.value.openingElement.attributes.push(j.jsxAttribute(j.jsxIdentifier('appearance'), j.literal('primary')));
}
});
root.findJSXElements('StealthButton').forEach((path) => {
if (path.value.openingElement.name.type === 'JSXIdentifier') {
path.value.openingElement.name.name = 'Button';
if (path.value.openingElement.attributes === undefined) {
path.value.openingElement.attributes = [];
}
path.value.openingElement.attributes.push(j.jsxAttribute(j.jsxIdentifier('appearance'), j.literal('subtle')));
}
});
// Replace old props with new props
root.findJSXElements('Button').forEach((path) => {
let attributes = path.value.openingElement.attributes;
if (attributes === undefined) {
attributes = [];
}
attributes.forEach((attribute) => {
if (attribute.type === 'JSXAttribute') {
if (attribute.name.name === 'startIcon') {
attribute.name.name = 'icon';
attributes!.push(j.jsxAttribute(j.jsxIdentifier('iconPosition'), j.literal('before')));
}
if (attribute.name.name === 'endIcon') {
attribute.name.name = 'icon';
attributes!.push(j.jsxAttribute(j.jsxIdentifier('iconPosition'), j.literal('after')));
}
if (attribute.name.name === 'content') {
path.value.openingElement.selfClosing = false;
path.value.closingElement = j.jsxClosingElement(j.jsxIdentifier('Button'));
const child = attribute.value;
if (child) {
path.value.children = [child];
}
}
}
});
path.value.openingElement.attributes = attributes.filter((path) => path.type === 'JSXSpreadAttribute' || path.name.name !== 'content');
});
return root.toSource(printOptions);
};
export default transform;

Просмотреть файл

@ -0,0 +1,9 @@
{
"extends": "@fluentui-react-native/scripts/tsconfig.json",
"compilerOptions": {
"outDir": "lib",
"types": ["node", "jest"]
},
"include": ["src"],
"exclude": ["src/__testfixtures__"]
}

Просмотреть файл

@ -27,7 +27,7 @@ import { CheckboxV1 as Checkbox } from '@fluentui-react-native/checkbox';
### Props repurposed
- `ariaLabel` => Use `accessibilityLabel` prop instead
- `boxSide` => Use `after` value for `labelPosition` prop instead of `start` or `before` value for `labelPosition` prop instead of `after`
- `boxSide` => Use `after` value for `labelPosition` prop instead of `start` or `before` value for `labelPosition` prop instead of `end`
### Props removed

Просмотреть файл

@ -12,6 +12,7 @@ const { ts } = require('./tasks/ts');
const { eslint } = require('./tasks/eslint');
const { depcheckTask } = require('./tasks/depcheck');
const { checkForModifiedFiles } = require('./tasks/checkForModifiedFilesTask');
const { findGitRoot } = require('workspace-tools');
export function preset() {
// this add s a resolve path for the build tooling deps like TS from the scripts folder
@ -35,7 +36,11 @@ export function preset() {
task('ts:esm', ts.esm);
task('eslint', eslint);
task('ts:commonjs-only', ts.commonjsOnly);
task('prettier', () => (argv().fix ? prettierTask({ files: ['src/.'] }) : prettierCheckTask({ files: ['src/.'] })));
task('prettier', () =>
argv().fix
? prettierTask({ files: ['src/.'], ignorePath: path.join(findGitRoot(process.cwd()), '.prettierignore') })
: prettierCheckTask({ files: ['src/.'], ignorePath: path.join(findGitRoot(process.cwd()), '.prettierignore') }),
);
task('checkForModifiedFiles', checkForModifiedFiles);
task('tsall', parallel('ts:commonjs', 'ts:esm'));
task(

Просмотреть файл

@ -292,7 +292,7 @@
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.1.tgz#72d647b4ff6a4f82878d184613353af1dd0290f9"
integrity sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==
"@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.12.3", "@babel/core@^7.14.0", "@babel/core@^7.15.5", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
"@babel/core@^7.1.0", "@babel/core@^7.1.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.15.5", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
version "7.19.1"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.1.tgz#c8fa615c5e88e272564ace3d42fbc8b17bfeb22b"
integrity sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==
@ -637,7 +637,7 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e"
integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==
"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.18.10", "@babel/parser@^7.19.1", "@babel/parser@^7.4.3", "@babel/parser@^7.9.4":
"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.18.10", "@babel/parser@^7.19.1", "@babel/parser@^7.4.3", "@babel/parser@^7.9.4":
version "7.19.1"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.1.tgz#6f6d6c2e621aad19a92544cc217ed13f1aac5b4c"
integrity sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==
@ -668,7 +668,7 @@
"@babel/helper-remap-async-to-generator" "^7.18.9"
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.18.6":
"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
@ -725,7 +725,7 @@
"@babel/helper-plugin-utils" "^7.18.9"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.1.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.1.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
@ -760,7 +760,7 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.1.0", "@babel/plugin-proposal-optional-chaining@^7.18.9":
"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.1.0", "@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.18.9":
version "7.18.9"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993"
integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==
@ -851,6 +851,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-syntax-flow@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1"
integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-import-assertions@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4"
@ -1046,6 +1053,14 @@
"@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-syntax-flow" "^7.16.7"
"@babel/plugin-transform-flow-strip-types@^7.18.6":
version "7.19.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f"
integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg==
dependencies:
"@babel/helper-plugin-utils" "^7.19.0"
"@babel/plugin-syntax-flow" "^7.18.6"
"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.18.8":
version "7.18.8"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1"
@ -1085,7 +1100,7 @@
"@babel/helper-plugin-utils" "^7.18.6"
babel-plugin-dynamic-import-node "^2.3.3"
"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.1.0", "@babel/plugin-transform-modules-commonjs@^7.18.6":
"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.1.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883"
integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==
@ -1382,6 +1397,15 @@
"@babel/helper-validator-option" "^7.16.7"
"@babel/plugin-transform-flow-strip-types" "^7.16.7"
"@babel/preset-flow@^7.13.13":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.18.6.tgz#83f7602ba566e72a9918beefafef8ef16d2810cb"
integrity sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ==
dependencies:
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/helper-validator-option" "^7.18.6"
"@babel/plugin-transform-flow-strip-types" "^7.18.6"
"@babel/preset-modules@^0.1.5":
version "0.1.5"
resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9"
@ -1405,7 +1429,7 @@
"@babel/plugin-transform-react-jsx-development" "^7.18.6"
"@babel/plugin-transform-react-pure-annotations" "^7.18.6"
"@babel/preset-typescript@^7.0.0", "@babel/preset-typescript@^7.1.0", "@babel/preset-typescript@^7.8.0":
"@babel/preset-typescript@^7.0.0", "@babel/preset-typescript@^7.1.0", "@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.8.0":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399"
integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==
@ -1425,6 +1449,17 @@
pirates "^4.0.5"
source-map-support "^0.5.16"
"@babel/register@^7.13.16":
version "7.18.9"
resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.18.9.tgz#1888b24bc28d5cc41c412feb015e9ff6b96e439c"
integrity sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==
dependencies:
clone-deep "^4.0.1"
find-cache-dir "^2.0.0"
make-dir "^2.1.0"
pirates "^4.0.5"
source-map-support "^0.5.16"
"@babel/runtime@7.18.9":
version "7.18.9"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a"
@ -3165,6 +3200,14 @@
jest-diff "^26.0.0"
pretty-format "^26.0.0"
"@types/jscodeshift@^0.11.5":
version "0.11.5"
resolved "https://registry.yarnpkg.com/@types/jscodeshift/-/jscodeshift-0.11.5.tgz#51198aa72ceb66d36ceba3918e1ab445b868f29b"
integrity sha512-7JV0qdblTeWFigevmwFUgROXX395F+MQx6v0YqPn8Bx0B4Sng6alEejz9PENzgLYpG+zL0O4tGdBzc4gKZH8XA==
dependencies:
ast-types "^0.14.1"
recast "^0.20.3"
"@types/jsftp@2.1.2":
version "2.1.2"
resolved "https://registry.yarnpkg.com/@types/jsftp/-/jsftp-2.1.2.tgz#4acfe315d7d2d73de84309554a8d1374bba37d4e"
@ -4610,7 +4653,7 @@ assign-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
ast-types@0.14.2:
ast-types@0.14.2, ast-types@^0.14.1:
version "0.14.2"
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd"
integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==
@ -9416,6 +9459,31 @@ jscodeshift@^0.11.0:
temp "^0.8.1"
write-file-atomic "^2.3.0"
jscodeshift@^0.13.1:
version "0.13.1"
resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.13.1.tgz#69bfe51e54c831296380585c6d9e733512aecdef"
integrity sha512-lGyiEbGOvmMRKgWk4vf+lUrCWO/8YR8sUR3FKF1Cq5fovjZDlIcw3Hu5ppLHAnEXshVffvaM0eyuY/AbOeYpnQ==
dependencies:
"@babel/core" "^7.13.16"
"@babel/parser" "^7.13.16"
"@babel/plugin-proposal-class-properties" "^7.13.0"
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8"
"@babel/plugin-proposal-optional-chaining" "^7.13.12"
"@babel/plugin-transform-modules-commonjs" "^7.13.8"
"@babel/preset-flow" "^7.13.13"
"@babel/preset-typescript" "^7.13.0"
"@babel/register" "^7.13.16"
babel-core "^7.0.0-bridge.0"
chalk "^4.1.2"
flow-parser "0.*"
graceful-fs "^4.2.4"
micromatch "^3.1.10"
neo-async "^2.5.0"
node-dir "^0.1.17"
recast "^0.20.4"
temp "^0.8.4"
write-file-atomic "^2.3.0"
jsdoc-plugin-typescript@2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/jsdoc-plugin-typescript/-/jsdoc-plugin-typescript-2.1.0.tgz#6fc1c192e5f31e4ded9e266d7a17cc378c7560d5"
@ -12251,7 +12319,7 @@ realpath-native@^1.1.0:
dependencies:
util.promisify "^1.0.0"
recast@^0.20.3:
recast@^0.20.3, recast@^0.20.4:
version "0.20.5"
resolved "https://registry.yarnpkg.com/recast/-/recast-0.20.5.tgz#8e2c6c96827a1b339c634dd232957d230553ceae"
integrity sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==
@ -13399,7 +13467,7 @@ temp@0.8.3:
os-tmpdir "^1.0.0"
rimraf "~2.2.6"
temp@^0.8.1:
temp@^0.8.1, temp@^0.8.4:
version "0.8.4"
resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2"
integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==