Skip to content

Commit cc87061

Browse files
committed
remote module fetching
1 parent 79d64ff commit cc87061

File tree

8 files changed

+112
-41
lines changed

8 files changed

+112
-41
lines changed

packages/cli/src/main.ts

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,54 @@
11
import semver from 'semver';
22
import chalk from 'chalk';
3+
import path from 'path';
34
import { PluginManager } from 'live-plugin-manager';
45
// @ts-ignore Run transform(s) on path https://github.com/facebook/jscodeshift/issues/398
56
import * as jscodeshift from 'jscodeshift/src/Runner';
7+
import { isValidConfig } from '@codeshift/validator';
68

79
import { Flags } from './types';
810
import { InvalidUserInputError } from './errors';
911

12+
const packageManager = new PluginManager();
13+
14+
async function fetchPackageConfig(packageName: string) {
15+
// Attempt to find package from the community folder
16+
await packageManager.install(`@codeshift/mod-${packageName}`);
17+
const commPkg = packageManager.require(packageName);
18+
const commConfig = commPkg.default ? commPkg.default : commPkg;
19+
20+
// if (!isValidConfig(commConfig)) {
21+
// }
22+
23+
// Attempt to find source package from npm
24+
await packageManager.install(packageName);
25+
// For source packages, fetching configs is a bit more elaborate
26+
let config;
27+
28+
// Attemp to fetch from the main entrypoint
29+
const info = packageManager.getInfo(packageName);
30+
const pkg = packageManager.require(packageName);
31+
32+
if (info || pkg) {
33+
config = pkg.default ? pkg.default : pkg;
34+
35+
if (config && isValidConfig) {
36+
// Found a config at the main entry-point
37+
}
38+
39+
config = require(path.join(info?.location, 'codeshift.config.js'));
40+
config = require(path.join(info?.location, 'src', 'codeshift.config.js'));
41+
config = require(path.join(
42+
info?.location,
43+
'codemods',
44+
'codeshift.config.js',
45+
));
46+
}
47+
// if ()
48+
49+
return config;
50+
}
51+
1052
export default async function main(paths: string[], flags: Flags) {
1153
let transforms: string[] = [];
1254

@@ -26,8 +68,6 @@ export default async function main(paths: string[], flags: Flags) {
2668
transforms.push(flags.transform);
2769
}
2870

29-
const packageManager = new PluginManager();
30-
3171
if (flags.packages) {
3272
const pkgs = flags.packages.split(',').filter(pkg => !!pkg);
3373

@@ -36,14 +76,8 @@ export default async function main(paths: string[], flags: Flags) {
3676
.split(/[@#]/)
3777
.filter(str => !!str)[0]
3878
.replace('/', '__');
39-
const packageName = `@codeshift/mod-${pkgName}`;
40-
41-
await packageManager.install(packageName);
42-
const codeshiftPackage = packageManager.require(packageName);
4379

44-
const config = codeshiftPackage.default
45-
? codeshiftPackage.default
46-
: codeshiftPackage;
80+
const config = await fetchPackageConfig(pkgName);
4781

4882
const rawTransformIds = pkg.split(/(?=[@#])/).filter(str => !!str);
4983
rawTransformIds.shift();

packages/cli/src/validate.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { isValidConfig, isValidPackageJson } from '@codeshift/validator';
1+
import { isValidConfigAtPath, isValidPackageJson } from '@codeshift/validator';
22

33
export default async function validate(targetPath: string = '.') {
44
try {
5-
await isValidConfig(targetPath);
5+
await isValidConfigAtPath(targetPath);
66
await isValidPackageJson(targetPath);
77
} catch (error) {
88
console.warn(error);

packages/types/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# @codeshift/types

packages/types/package.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "@codeshift/types",
3+
"version": "0.0.0",
4+
"main": "dist/codeshift-types.cjs.js",
5+
"module": "dist/codeshift-types.esm.js",
6+
"types": "dist/codeshift-types.cjs.d.ts",
7+
"license": "MIT",
8+
"repository": "https://github.com/CodeshiftCommunity/CodeshiftCommunity/tree/master/packages/types"
9+
}

packages/types/src/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface CodeshiftConfig {
2+
target?: string[];
3+
maintainers?: string[];
4+
description?: string;
5+
transforms?: Record<string, string>;
6+
presets?: Record<string, string>;
7+
}

packages/validator/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"license": "MIT",
77
"repository": "https://github.com/CodeshiftCommunity/CodeshiftCommunity/tree/master/packages/validator",
88
"dependencies": {
9+
"@codeshift/types": "^0.0.1",
910
"fs-extra": "^9.1.0",
1011
"recast": "^0.20.4",
1112
"semver": "^7.3.5",

packages/validator/src/index.ts

Lines changed: 47 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,69 @@
11
import fs from 'fs-extra';
22
import semver from 'semver';
33
import path from 'path';
4+
import { CodeshiftConfig } from '@codeshift/types';
45

5-
export function isValidPackageName(dir: string) {
6-
return dir.match(/^(@[a-z0-9-~][a-z0-9-._~]*__)?[a-z0-9-~][a-z0-9-._~]*$/);
7-
}
8-
9-
export async function isValidConfig(filePath: string) {
6+
function getConfigFromPath(filePath: string): CodeshiftConfig {
107
const configPath = path.join(process.cwd(), filePath, 'codeshift.config.js');
118
// eslint-disable-next-line @typescript-eslint/no-var-requires
12-
let config = require(configPath);
9+
const config = require(configPath);
10+
11+
return !!config.default ? config.default : config;
12+
}
1313

14-
config = !!config.default ? config.default : config;
14+
function hasValidTransforms(transforms?: Record<string, string>) {
15+
if (!transforms || !Object.keys(transforms).length) return false;
1516

16-
const invalidSemverIds = [];
17-
const invalidPresetIds = [];
17+
let isValid = true;
1818

19-
let hasTransforms = false;
19+
Object.entries(transforms).forEach(([key]) => {
20+
if (!semver.valid(key)) isValid = false;
21+
});
2022

21-
if (config.transforms && Object.keys(config.transforms).length) {
22-
Object.entries(config.transforms).forEach(([key]) => {
23-
hasTransforms = true;
24-
if (!semver.valid(key)) invalidSemverIds.push(key);
25-
});
26-
}
23+
return isValid;
24+
}
2725

28-
if (config.presets && Object.keys(config.presets).length) {
29-
hasTransforms = true;
30-
Object.entries(config.presets).forEach(([key]) => {
31-
if (key.includes(' ')) invalidPresetIds.push(key);
32-
});
33-
}
26+
function hasValidPresets(presets?: Record<string, string>) {
27+
if (!presets || !Object.keys(presets).length) return false;
28+
29+
let isValid = true;
30+
31+
Object.entries(presets).forEach(([key]) => {
32+
if (!key.match(/^[0-9a-zA-Z\-]+$/)) isValid = false;
33+
});
34+
35+
return isValid;
36+
}
37+
38+
export function isValidPackageName(dir: string) {
39+
return dir.match(/^(@[a-z0-9-~][a-z0-9-._~]*__)?[a-z0-9-~][a-z0-9-._~]*$/);
40+
}
41+
42+
export async function isValidConfig(config: CodeshiftConfig) {
43+
return (
44+
hasValidTransforms(config.transforms) || hasValidPresets(config.presets)
45+
);
46+
}
47+
48+
export async function isValidConfigAtPath(filePath: string) {
49+
const config = getConfigFromPath(filePath);
3450

35-
if (!hasTransforms) {
51+
if (
52+
!hasValidTransforms(config.transforms) &&
53+
!hasValidPresets(config.presets)
54+
) {
3655
throw new Error(
37-
`At least one transform should be specified for config at "${configPath}"`,
56+
`At least one transform should be specified for config at "${filePath}"`,
3857
);
3958
}
4059

41-
if (invalidSemverIds.length) {
42-
throw new Error(`Invalid transform ids found for config at "${configPath}".
60+
if (!hasValidTransforms(config.transforms)) {
61+
throw new Error(`Invalid transform ids found for config at "${filePath}".
4362
Please make sure all transforms are identified by a valid semver version. ie 10.0.0`);
4463
}
4564

46-
if (invalidPresetIds.length) {
47-
throw new Error(`Invalid preset ids found for config at "${configPath}".
65+
if (!hasValidPresets(config.presets)) {
66+
throw new Error(`Invalid preset ids found for config at "${filePath}".
4867
Please make sure all presets are kebab case and contain no spaces or special characters. ie sort-imports-by-scope`);
4968
}
5069
}

scripts/validate.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import fs, { lstatSync, existsSync } from 'fs-extra';
2-
import { isValidPackageName, isValidConfig } from '@codeshift/validator';
2+
import { isValidPackageName, isValidConfigAtPath } from '@codeshift/validator';
33

44
async function main(path: string) {
55
const directories = await fs.readdir(path);
@@ -13,7 +13,7 @@ async function main(path: string) {
1313
);
1414
}
1515

16-
await isValidConfig(`${path}/${dir}`);
16+
await isValidConfigAtPath(`${path}/${dir}`);
1717

1818
const subDirectories = await fs.readdir(`${path}/${dir}`);
1919
subDirectories.forEach(async subDir => {

0 commit comments

Comments
 (0)