From 78959ae4d5cc59aae1c22421c6cae190ae923b33 Mon Sep 17 00:00:00 2001 From: Daniel Del Core Date: Sat, 29 Jan 2022 14:49:41 +1100 Subject: [PATCH] update transform files into valid configs updates build validation logic --- .changeset/large-candles-appear.md | 6 ++ .../@atlaskit__avatar/codeshift.config.js | 2 +- .../codeshift.config.js | 2 +- .../@atlaskit__button/codeshift.config.js | 2 +- .../@atlaskit__calendar/codeshift.config.js | 2 +- .../@atlaskit__checkbox/codeshift.config.js | 2 +- community/@atlaskit__icon/codeshift.config.js | 2 +- community/@atlaskit__menu/codeshift.config.js | 2 +- .../@atlaskit__popper/codeshift.config.js | 2 +- .../@atlaskit__popup/codeshift.config.js | 2 +- .../codeshift.config.js | 2 +- .../@atlaskit__range/codeshift.config.js | 2 +- .../codeshift.config.js | 2 +- .../codeshift.config.js | 2 +- .../@atlaskit__spinner/codeshift.config.js | 2 +- community/@atlaskit__tag/codeshift.config.js | 2 +- .../@atlaskit__textarea/codeshift.config.js | 2 +- .../@atlaskit__textfield/codeshift.config.js | 2 +- .../@atlaskit__toggle/codeshift.config.js | 2 +- .../@emotion__monorepo/codeshift.config.js | 2 +- community/memoize-one/codeshift.config.js | 2 +- package.json | 3 +- packages/validator/src/index.ts | 2 +- scripts/docs.ts | 53 ++++++++-------- scripts/initialize.ts | 4 +- scripts/validate.ts | 63 ++++++++++++------- yarn.lock | 18 ++++-- 27 files changed, 112 insertions(+), 77 deletions(-) create mode 100644 .changeset/large-candles-appear.md diff --git a/.changeset/large-candles-appear.md b/.changeset/large-candles-appear.md new file mode 100644 index 000000000..b9899aa35 --- /dev/null +++ b/.changeset/large-candles-appear.md @@ -0,0 +1,6 @@ +--- +'@codeshift/initializer': minor +'@codeshift/validator': minor +--- + +Updates validation / init logic to be consistent across packages diff --git a/community/@atlaskit__avatar/codeshift.config.js b/community/@atlaskit__avatar/codeshift.config.js index 6f7f21beb..efc48be98 100644 --- a/community/@atlaskit__avatar/codeshift.config.js +++ b/community/@atlaskit__avatar/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '18.0.0': require.resolve('./18.0.0/transform'), diff --git a/community/@atlaskit__breadcrumbs/codeshift.config.js b/community/@atlaskit__breadcrumbs/codeshift.config.js index 4aa480b1a..c34d74249 100644 --- a/community/@atlaskit__breadcrumbs/codeshift.config.js +++ b/community/@atlaskit__breadcrumbs/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '11.0.0': require.resolve('./11.0.0/transform'), diff --git a/community/@atlaskit__button/codeshift.config.js b/community/@atlaskit__button/codeshift.config.js index acdad0254..c9419d13b 100644 --- a/community/@atlaskit__button/codeshift.config.js +++ b/community/@atlaskit__button/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '15.0.0': require.resolve('./15.0.0/transform'), diff --git a/community/@atlaskit__calendar/codeshift.config.js b/community/@atlaskit__calendar/codeshift.config.js index 4aa480b1a..c34d74249 100644 --- a/community/@atlaskit__calendar/codeshift.config.js +++ b/community/@atlaskit__calendar/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '11.0.0': require.resolve('./11.0.0/transform'), diff --git a/community/@atlaskit__checkbox/codeshift.config.js b/community/@atlaskit__checkbox/codeshift.config.js index 332487527..1b444149d 100644 --- a/community/@atlaskit__checkbox/codeshift.config.js +++ b/community/@atlaskit__checkbox/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '12.0.0': require.resolve('./12.0.0/transform'), diff --git a/community/@atlaskit__icon/codeshift.config.js b/community/@atlaskit__icon/codeshift.config.js index b74c62b0d..547bae439 100644 --- a/community/@atlaskit__icon/codeshift.config.js +++ b/community/@atlaskit__icon/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '21.2.0': require.resolve('./21.2.0/transform'), diff --git a/community/@atlaskit__menu/codeshift.config.js b/community/@atlaskit__menu/codeshift.config.js index 6822553f2..b82b6b105 100644 --- a/community/@atlaskit__menu/codeshift.config.js +++ b/community/@atlaskit__menu/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '0.7.0': require.resolve('./0.7.0/transform'), diff --git a/community/@atlaskit__popper/codeshift.config.js b/community/@atlaskit__popper/codeshift.config.js index 50afa4835..333e3ad5c 100644 --- a/community/@atlaskit__popper/codeshift.config.js +++ b/community/@atlaskit__popper/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '5.0.0': require.resolve('./5.0.0/transform'), diff --git a/community/@atlaskit__popup/codeshift.config.js b/community/@atlaskit__popup/codeshift.config.js index 5651029cc..129c7e507 100644 --- a/community/@atlaskit__popup/codeshift.config.js +++ b/community/@atlaskit__popup/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '1.0.0': require.resolve('./1.0.0/transform'), diff --git a/community/@atlaskit__progress-indicator/codeshift.config.js b/community/@atlaskit__progress-indicator/codeshift.config.js index 0cd1e9a92..d00d19adb 100644 --- a/community/@atlaskit__progress-indicator/codeshift.config.js +++ b/community/@atlaskit__progress-indicator/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '9.0.0': require.resolve('./9.0.0/transform'), diff --git a/community/@atlaskit__range/codeshift.config.js b/community/@atlaskit__range/codeshift.config.js index 3c6d9f1c7..50aa5f251 100644 --- a/community/@atlaskit__range/codeshift.config.js +++ b/community/@atlaskit__range/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '4.0.0': require.resolve('./4.0.0/transform'), diff --git a/community/@atlaskit__section-message/codeshift.config.js b/community/@atlaskit__section-message/codeshift.config.js index 7811c2923..a98e06f54 100644 --- a/community/@atlaskit__section-message/codeshift.config.js +++ b/community/@atlaskit__section-message/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '6.0.0': require.resolve('./6.0.0/transform'), diff --git a/community/@atlaskit__side-navigation/codeshift.config.js b/community/@atlaskit__side-navigation/codeshift.config.js index 0fa5dc903..36d683e81 100644 --- a/community/@atlaskit__side-navigation/codeshift.config.js +++ b/community/@atlaskit__side-navigation/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '0.8.0': require.resolve('./0.8.0/transform'), diff --git a/community/@atlaskit__spinner/codeshift.config.js b/community/@atlaskit__spinner/codeshift.config.js index e0cbac560..ebbecfa43 100644 --- a/community/@atlaskit__spinner/codeshift.config.js +++ b/community/@atlaskit__spinner/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '13.0.0': require.resolve('./13.0.0/transform'), diff --git a/community/@atlaskit__tag/codeshift.config.js b/community/@atlaskit__tag/codeshift.config.js index 4aa480b1a..c34d74249 100644 --- a/community/@atlaskit__tag/codeshift.config.js +++ b/community/@atlaskit__tag/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '11.0.0': require.resolve('./11.0.0/transform'), diff --git a/community/@atlaskit__textarea/codeshift.config.js b/community/@atlaskit__textarea/codeshift.config.js index 3c6d9f1c7..50aa5f251 100644 --- a/community/@atlaskit__textarea/codeshift.config.js +++ b/community/@atlaskit__textarea/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '4.0.0': require.resolve('./4.0.0/transform'), diff --git a/community/@atlaskit__textfield/codeshift.config.js b/community/@atlaskit__textfield/codeshift.config.js index 50afa4835..333e3ad5c 100644 --- a/community/@atlaskit__textfield/codeshift.config.js +++ b/community/@atlaskit__textfield/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '5.0.0': require.resolve('./5.0.0/transform'), diff --git a/community/@atlaskit__toggle/codeshift.config.js b/community/@atlaskit__toggle/codeshift.config.js index e63b849df..c79791d28 100644 --- a/community/@atlaskit__toggle/codeshift.config.js +++ b/community/@atlaskit__toggle/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '11.0.0': require.resolve('./11.0.0/transform'), diff --git a/community/@emotion__monorepo/codeshift.config.js b/community/@emotion__monorepo/codeshift.config.js index 651d33ec4..e97ad5135 100644 --- a/community/@emotion__monorepo/codeshift.config.js +++ b/community/@emotion__monorepo/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['danieldelcore'], transforms: { '11.0.0': require.resolve('./11.0.0/transform'), diff --git a/community/memoize-one/codeshift.config.js b/community/memoize-one/codeshift.config.js index f78ee38eb..b56c98deb 100644 --- a/community/memoize-one/codeshift.config.js +++ b/community/memoize-one/codeshift.config.js @@ -1,4 +1,4 @@ -export default { +module.exports = { maintainers: ['alexreardon'], transforms: { '5.0.0': require.resolve('./5.0.0/transform') }, }; diff --git a/package.json b/package.json index f8fab3549..8cd3fa1b2 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "jest-serializer-html-string": "^1.0.1", "jest-watch-typeahead": "^0.4.2", "jscodeshift": "^0.13.1", + "junk": "^3.1.0", "prettier": "^1.16.4", "rimraf": "^2.6.3", "semver": "^7.3.5", @@ -61,7 +62,7 @@ "ts-loader": "^6.2.1", "ts-node": "^9.1.1", "tslib": "^2.2.0", - "typescript": "^4.1.3" + "typescript": "^4.3.5" }, "resolutions": { "colors": "1.4.0" diff --git a/packages/validator/src/index.ts b/packages/validator/src/index.ts index 53ecb0eb3..ce7d040fe 100644 --- a/packages/validator/src/index.ts +++ b/packages/validator/src/index.ts @@ -31,7 +31,7 @@ export async function isValidConfigAtPath(filePath: string) { const config = await fetchConfig(filePath); if (!config) { - throw new Error('Unable to locate config file'); + throw new Error(`Unable to locate config file at path: ${filePath}`); } if (!hasValidTransforms(config)) { diff --git a/scripts/docs.ts b/scripts/docs.ts index dfc3f275f..df9e44e12 100644 --- a/scripts/docs.ts +++ b/scripts/docs.ts @@ -1,41 +1,36 @@ import fs from 'fs-extra'; +import junk from 'junk'; +import path from 'path'; -const COMMUNITY_PATH = `${__dirname}/../community`; -const DOCS_PATH = `${__dirname}/../website/docs/registry`; +import { CodeshiftConfig } from '@codeshift/types'; +import { fetchConfig } from '@codeshift/fetcher'; -function cleanTargetDir(path: string) { - if (fs.existsSync(path)) fs.emptyDirSync(path); -} +const COMMUNITY_PATH = path.join(__dirname, '..', 'community'); +const DOCS_PATH = path.join(__dirname, '..', 'website', 'docs', 'registry'); -interface Config { - maintainers: string[]; - transforms: { - [key: string]: any; - }; - presets: { - [key: string]: any; - }; +function cleanTargetDir(targetPath: string) { + if (fs.existsSync(targetPath)) fs.emptyDirSync(targetPath); } interface DocsData { name: string; - config: Config; + config: CodeshiftConfig; } -function main() { +async function main() { const communityCodemods = fs.readdirSync(COMMUNITY_PATH); const data: DocsData[] = []; + const directories = communityCodemods.filter(dir => junk.not(dir)); - communityCodemods.forEach(dir => { - // eslint-disable-next-line @typescript-eslint/no-var-requires - const config = require(`${COMMUNITY_PATH}/${dir}/codeshift.config.js`) - .default; + for (const dir of directories) { + const config = await fetchConfig(path.join(COMMUNITY_PATH, dir)); - data.push({ - name: dir, - config, - }); - }); + if (!config) { + throw new Error(`Unable to locate config for path: ${dir}`); + } + + data.push({ name: dir, config }); + } cleanTargetDir(DOCS_PATH); @@ -48,7 +43,7 @@ function main() { const packageLink = `[${rawName}](https://www.npmjs.com/package/${rawName})`; fs.outputFileSync( - `${DOCS_PATH}/${name}.mdx`, + path.join(DOCS_PATH, `${name}.mdx`), `--- id: ${safeName} title: ${safeName.replace('__', '/')} @@ -58,10 +53,13 @@ slug: /${safeName} **Target package:** ${packageLink} **Maintainers:** -${config.maintainers.map( +${config.maintainers!.map( maintainer => `- [${maintainer}](https://github.com/${maintainer})`, )} +${ + config.transforms + ? ` ## Transforms ${Object.keys(config.transforms) @@ -80,6 +78,9 @@ $ codeshift --packages ${name}@${key} path/to/source `, ) .join('')} +` + : '' +} ${ config.presets diff --git a/scripts/initialize.ts b/scripts/initialize.ts index f2939813b..32bf37d98 100644 --- a/scripts/initialize.ts +++ b/scripts/initialize.ts @@ -7,8 +7,8 @@ export function main(packageName: string, transform?: string) { if (!transform) throw new Error('Version was not provided'); if (transform) { - initDirectory(packageName, targetPath); - initTransform(packageName, transform, 'version', targetPath); + initDirectory(packageName, targetPath, true); + initTransform(packageName, transform, 'version', targetPath, true); } console.log( diff --git a/scripts/validate.ts b/scripts/validate.ts index 0e1a2e33f..1485a46f3 100644 --- a/scripts/validate.ts +++ b/scripts/validate.ts @@ -1,33 +1,50 @@ import fs, { lstatSync, existsSync } from 'fs-extra'; +import junk from 'junk'; +import path from 'path'; +import chalk from 'chalk'; import { isValidPackageName, isValidConfigAtPath } from '@codeshift/validator'; -async function main(path: string) { - const directories = await fs.readdir(path); +async function main(targetPath: string) { + const directories = await fs.readdir(targetPath); - directories.forEach(async dir => { - if (!isValidPackageName(dir)) { - throw new Error( - `Invalid package name: ${dir}. - If this is a scoped package, please make sure rename the folder to use the "__" characters to denote submodule. - For example: @foo/bar => @foo__bar`, - ); - } - - await isValidConfigAtPath(`${path}/${dir}`); - - const subDirectories = await fs.readdir(`${path}/${dir}`); - subDirectories.forEach(async subDir => { - if ( - lstatSync(`${path}/${dir}/${subDir}`).isDirectory() && - !existsSync(`${path}/${dir}/${subDir}/transform.ts`) && - !existsSync(`${path}/${dir}/${subDir}/transform.js`) - ) { + directories + .filter(dir => !junk.is(dir)) + .forEach(async dir => { + if (!isValidPackageName(dir)) { throw new Error( - `Unable to find transform entry-point for directory "${path}/${dir}/${subDir}". Please ensure you have a valid transform.(ts|js) file containing the entry-point for your codemod`, + `Invalid package name: ${dir}. +If this is a scoped package, please make sure rename the folder to use the "__" characters to denote submodule. +For example: @foo/bar => @foo__bar`, ); } + + const basePath = path.join(__dirname, '..', targetPath, dir); + await isValidConfigAtPath(basePath); + + const subDirectories = await fs.readdir(basePath); + subDirectories + .filter(dir => !junk.is(dir)) + .forEach(async subDir => { + const subPath = path.join(basePath, subDir); + + if ( + lstatSync(subPath).isDirectory() && + !existsSync(path.join(subPath, 'transform.ts')) && + !existsSync(path.join(subPath, 'transform.js')) + ) { + throw new Error( + `Unable to find transform entry-point for directory "${subPath}". Please ensure you have a valid transform.(ts|js) file containing the entry-point for your codemod`, + ); + } + }); }); - }); } -main(process.argv[2]); +(async function() { + try { + main(process.argv[2]); + } catch (error) { + console.error(chalk.red(error)); + process.exit(1); + } +})(); diff --git a/yarn.lock b/yarn.lock index 94893a5b8..d1c1a7701 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1767,6 +1767,11 @@ resolved "https://registry.npmjs.org/@types/node/-/node-12.20.21.tgz#575e91f59c2e79318c2d39a48286c6954e484fd5" integrity sha512-Qk7rOvV2A4vNgXNS88vEvbJE1NDFPCQ8AU+pNElrU2bA4yrRDef3fg3SUe+xkwyin3Bpg/Xh5JkNWTlsOcS2tA== +"@types/node@^16.11.0": + version "16.11.21" + resolved "https://packages.atlassian.com/api/npm/npm-remote/@types/node/-/node-16.11.21.tgz#474d7589a30afcf5291f59bd49cca9ad171ffde4" + integrity sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A== + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" @@ -4943,6 +4948,11 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +junk@^3.1.0: + version "3.1.0" + resolved "https://packages.atlassian.com/api/npm/npm-remote/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" + integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -7179,10 +7189,10 @@ typedarray@^0.0.6: resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.1.3: - version "4.4.2" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz#6d618640d430e3569a1dfb44f7d7e600ced3ee86" - integrity sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ== +typescript@^4.3.5: + version "4.5.5" + resolved "https://packages.atlassian.com/api/npm/npm-remote/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" + integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4"