@kamaalio/codemod-kit 0.0.38 → 0.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/codemods/types.d.ts +7 -2
- package/dist/github/utils.d.ts +1 -1
- package/dist/index.cjs +27 -22
- package/dist/index.js +27 -22
- package/package.json +1 -1
package/dist/codemods/types.d.ts
CHANGED
|
@@ -10,14 +10,18 @@ export type RunCodemodOkResult = {
|
|
|
10
10
|
root: string;
|
|
11
11
|
};
|
|
12
12
|
export type RunCodemodResult = Result<RunCodemodOkResult, Error>;
|
|
13
|
+
type CodemodOptions = {
|
|
14
|
+
postTransform?: Record<string, unknown>;
|
|
15
|
+
};
|
|
13
16
|
export type Codemod = {
|
|
14
17
|
name: string;
|
|
15
18
|
languages: Set<NapiLang> | Array<NapiLang>;
|
|
16
|
-
|
|
19
|
+
options?: CodemodOptions;
|
|
20
|
+
transformer: (content: string, filename?: types.Optional<string>, codemod?: types.Optional<Codemod>) => Promise<string>;
|
|
17
21
|
postTransform?: (results: {
|
|
18
22
|
root: string;
|
|
19
23
|
results: Array<RunCodemodOkResult>;
|
|
20
|
-
}) => Promise<void>;
|
|
24
|
+
}, codemod: Codemod) => Promise<void>;
|
|
21
25
|
targetFiltering?: (filepath: string, codemod: Codemod) => boolean;
|
|
22
26
|
};
|
|
23
27
|
export type CodemodRunnerCodemod<Tag = string, C extends Codemod = Codemod> = C & {
|
|
@@ -42,3 +46,4 @@ export type FindAndReplaceConfig = {
|
|
|
42
46
|
rule: Rule<TypesMap>;
|
|
43
47
|
transformer: ((node: SgNode<TypesMap, Kinds<TypesMap>>, rule: Rule<TypesMap>) => types.Optional<Edit | string> | Array<Edit | string>) | string;
|
|
44
48
|
};
|
|
49
|
+
export {};
|
package/dist/github/utils.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { Codemod, CodemodRunnerCodemod } from '../codemods/index.js';
|
|
|
4
4
|
export declare function makePullRequestsForCodemodResults<Tag = string, C extends Codemod = Codemod>(codemods: Array<CodemodRunnerCodemod<Tag, C>>, codemodResults: Record<string, Array<Result<{
|
|
5
5
|
hasChanges: boolean;
|
|
6
6
|
content: string;
|
|
7
|
-
}, Error>>>,
|
|
7
|
+
}, Error>>>, repositoriesMappedByCodemodName: Record<string, Array<Repository<Tag>>>): Promise<void>;
|
|
8
8
|
export declare function makePullRequestsForCodemodResult<Tag = string, C extends Codemod = Codemod>(codemod: CodemodRunnerCodemod<Tag, C>, codemodResult: Array<Result<{
|
|
9
9
|
hasChanges: boolean;
|
|
10
10
|
content: string;
|
package/dist/index.cjs
CHANGED
|
@@ -456,10 +456,12 @@ function dedupeRepositoriesToClone(repositories, cwd) {
|
|
|
456
456
|
}, initialDedupeResult).result;
|
|
457
457
|
return dedupedRepos;
|
|
458
458
|
}
|
|
459
|
-
async function makePullRequestsForCodemodResults(codemods, codemodResults,
|
|
459
|
+
async function makePullRequestsForCodemodResults(codemods, codemodResults, repositoriesMappedByCodemodName) {
|
|
460
460
|
for (const [codemodName, codemodResult] of Object.entries(codemodResults)){
|
|
461
461
|
const codemod = codemods.find((c)=>c.name === codemodName);
|
|
462
|
-
|
|
462
|
+
kamaal_namespaceObject.asserts.invariant(null != codemod, 'Codemod should have been present');
|
|
463
|
+
const repositories = repositoriesMappedByCodemodName[codemodName];
|
|
464
|
+
kamaal_namespaceObject.asserts.invariant(null != repositories, 'Repositories should have been present');
|
|
463
465
|
await makePullRequestsForCodemodResult(codemod, codemodResult, repositories);
|
|
464
466
|
}
|
|
465
467
|
}
|
|
@@ -482,13 +484,14 @@ async function makePullRequestsForCodemodResult(codemod, codemodResult, reposito
|
|
|
482
484
|
async function makePullRequest(params) {
|
|
483
485
|
return tryCatchAsync(()=>(0, external_execa_namespaceObject.$)({
|
|
484
486
|
cwd: params.workingDirectory
|
|
485
|
-
})`gh pr create --title ${params.title} --fill`);
|
|
487
|
+
})`gh pr create --draft --title ${params.title} --fill`);
|
|
486
488
|
}
|
|
487
489
|
async function runCodemodsOnProjects(repositoriesToClone, codemods, options) {
|
|
488
490
|
const clonedRepositories = await cloneRepositories(repositoriesToClone, options.workingDirectory);
|
|
489
491
|
console.log(`\u{1F5A8}\u{FE0F} cloned ${clonedRepositories.length} ${1 === clonedRepositories.length ? 'repository' : 'repositories'}`);
|
|
490
|
-
const
|
|
491
|
-
|
|
492
|
+
const codemodRepositoriesMappedByCodemodName = await prepareRepositoriesForCodemods(clonedRepositories, codemods, options.workingDirectory);
|
|
493
|
+
const codemodResults = await runCodemodRunner(codemods, codemodRepositoriesMappedByCodemodName, options.workingDirectory);
|
|
494
|
+
if (options.pushChanges) await makePullRequestsForCodemodResults(codemods, codemodResults, codemodRepositoriesMappedByCodemodName);
|
|
492
495
|
}
|
|
493
496
|
function utils_codemodTargetFiltering(repositories, failedRepositoryAddressesMappedByCodemodNames) {
|
|
494
497
|
return (filepath, codemod)=>{
|
|
@@ -514,10 +517,9 @@ async function codemodPostTransform(transformedContent) {
|
|
|
514
517
|
return transformedContent;
|
|
515
518
|
}
|
|
516
519
|
async function runCodemodRunner(codemods, repositories, workingDirectory) {
|
|
517
|
-
const codemodRepositoriesMappedByCodemodName = await prepareRepositoriesForCodemods(repositories, codemods, workingDirectory);
|
|
518
520
|
const results = Object.fromEntries(await Promise.all(codemods.map(async (codemod)=>{
|
|
519
521
|
const start = performance.now();
|
|
520
|
-
const codemodRepositories =
|
|
522
|
+
const codemodRepositories = repositories[codemod.name];
|
|
521
523
|
kamaal_namespaceObject.asserts.invariant(null != codemodRepositories, 'Codemod repositories should be present');
|
|
522
524
|
const codemodWorkingDirectory = external_node_path_default().resolve(workingDirectory, codemod.name.replace(/\//g, '-'));
|
|
523
525
|
const failedRepositoryAddressesMappedByCodemodNames = {};
|
|
@@ -525,7 +527,7 @@ async function runCodemodRunner(codemods, repositories, workingDirectory) {
|
|
|
525
527
|
rootPaths: codemodRepositories.map((repository)=>repository.path),
|
|
526
528
|
hooks: {
|
|
527
529
|
preCodemodRun: async (codemod)=>{
|
|
528
|
-
failedRepositoryAddressesMappedByCodemodNames[codemod.name] = await codemodPreCodemodRun(
|
|
530
|
+
failedRepositoryAddressesMappedByCodemodNames[codemod.name] = await codemodPreCodemodRun(codemodRepositories, codemod);
|
|
529
531
|
},
|
|
530
532
|
targetFiltering: utils_codemodTargetFiltering(groupByFlat(codemodRepositories, 'name'), failedRepositoryAddressesMappedByCodemodNames),
|
|
531
533
|
postTransform: codemodPostTransform
|
|
@@ -556,19 +558,7 @@ async function prepareRepositoriesForCodemods(repositories, codemods, workingDir
|
|
|
556
558
|
}));
|
|
557
559
|
console.log(`\u{1F4CB} prepared the following repos for codemods:
|
|
558
560
|
\xb7 ${updatedRepositories.map((repo)=>repo.address).join("\n\xb7 ")}`);
|
|
559
|
-
return Object.fromEntries(await Promise.all(codemods.map(
|
|
560
|
-
const codemodWorkingDirectory = external_node_path_default().resolve(workingDirectory, codemod.name.replace(/\//g, '-'));
|
|
561
|
-
await (0, external_execa_namespaceObject.$)`mkdir -p ${codemodWorkingDirectory}`;
|
|
562
|
-
const codeRepositories = await Promise.all(updatedRepositories.map((repo)=>{
|
|
563
|
-
const newPath = external_node_path_default().join(codemodWorkingDirectory, repo.name);
|
|
564
|
-
console.log(`\xa9\u{FE0F} copying ${repo.name} -> ${newPath}`);
|
|
565
|
-
return repo.copy(newPath);
|
|
566
|
-
}));
|
|
567
|
-
return [
|
|
568
|
-
codemod.name,
|
|
569
|
-
codeRepositories
|
|
570
|
-
];
|
|
571
|
-
})));
|
|
561
|
+
return Object.fromEntries(await Promise.all(codemods.map(copyRepo(workingDirectory, updatedRepositories))));
|
|
572
562
|
}
|
|
573
563
|
async function runCodemods(codemods, transformationPath, options) {
|
|
574
564
|
const results = {};
|
|
@@ -631,7 +621,7 @@ async function runCodemod(codemod, transformationPath, options) {
|
|
|
631
621
|
root,
|
|
632
622
|
results: successesGroupedByRoot[root] ?? []
|
|
633
623
|
}));
|
|
634
|
-
await Promise.all(rootPathsWithResults.map((r)=>(codemod.postTransform ?? (async ()=>{}))(r)));
|
|
624
|
+
await Promise.all(rootPathsWithResults.map((r)=>(codemod.postTransform ?? (async ()=>{}))(r, codemod)));
|
|
635
625
|
return results;
|
|
636
626
|
}
|
|
637
627
|
function traverseUp(node, until) {
|
|
@@ -744,6 +734,21 @@ function findAndReplace(content, rule, transformer) {
|
|
|
744
734
|
const edits = findAndReplaceEdits(content, rule, transformer);
|
|
745
735
|
return root.commitEdits(edits);
|
|
746
736
|
}
|
|
737
|
+
function copyRepo(workingDirectory, repositories) {
|
|
738
|
+
return async (codemod)=>{
|
|
739
|
+
const codemodWorkingDirectory = external_node_path_default().resolve(workingDirectory, codemod.name.replace(/\//g, '-'));
|
|
740
|
+
await (0, external_execa_namespaceObject.$)`mkdir -p ${codemodWorkingDirectory}`;
|
|
741
|
+
const codeRepositories = await Promise.all(repositories.map((repo)=>{
|
|
742
|
+
const newPath = external_node_path_default().join(codemodWorkingDirectory, repo.name);
|
|
743
|
+
console.log(`\xa9\u{FE0F} copying ${repo.name} -> ${newPath}`);
|
|
744
|
+
return repo.copy(newPath);
|
|
745
|
+
}));
|
|
746
|
+
return [
|
|
747
|
+
codemod.name,
|
|
748
|
+
codeRepositories
|
|
749
|
+
];
|
|
750
|
+
};
|
|
751
|
+
}
|
|
747
752
|
async function commitEditModifications(edits, modifications) {
|
|
748
753
|
if (0 === edits.length) return modifications;
|
|
749
754
|
const root = modifications.ast.root();
|
package/dist/index.js
CHANGED
|
@@ -407,10 +407,12 @@ function dedupeRepositoriesToClone(repositories, cwd) {
|
|
|
407
407
|
}, initialDedupeResult).result;
|
|
408
408
|
return dedupedRepos;
|
|
409
409
|
}
|
|
410
|
-
async function makePullRequestsForCodemodResults(codemods, codemodResults,
|
|
410
|
+
async function makePullRequestsForCodemodResults(codemods, codemodResults, repositoriesMappedByCodemodName) {
|
|
411
411
|
for (const [codemodName, codemodResult] of Object.entries(codemodResults)){
|
|
412
412
|
const codemod = codemods.find((c)=>c.name === codemodName);
|
|
413
|
-
|
|
413
|
+
asserts.invariant(null != codemod, 'Codemod should have been present');
|
|
414
|
+
const repositories = repositoriesMappedByCodemodName[codemodName];
|
|
415
|
+
asserts.invariant(null != repositories, 'Repositories should have been present');
|
|
414
416
|
await makePullRequestsForCodemodResult(codemod, codemodResult, repositories);
|
|
415
417
|
}
|
|
416
418
|
}
|
|
@@ -433,13 +435,14 @@ async function makePullRequestsForCodemodResult(codemod, codemodResult, reposito
|
|
|
433
435
|
async function makePullRequest(params) {
|
|
434
436
|
return tryCatchAsync(()=>$({
|
|
435
437
|
cwd: params.workingDirectory
|
|
436
|
-
})`gh pr create --title ${params.title} --fill`);
|
|
438
|
+
})`gh pr create --draft --title ${params.title} --fill`);
|
|
437
439
|
}
|
|
438
440
|
async function runCodemodsOnProjects(repositoriesToClone, codemods, options) {
|
|
439
441
|
const clonedRepositories = await cloneRepositories(repositoriesToClone, options.workingDirectory);
|
|
440
442
|
console.log(`\u{1F5A8}\u{FE0F} cloned ${clonedRepositories.length} ${1 === clonedRepositories.length ? 'repository' : 'repositories'}`);
|
|
441
|
-
const
|
|
442
|
-
|
|
443
|
+
const codemodRepositoriesMappedByCodemodName = await prepareRepositoriesForCodemods(clonedRepositories, codemods, options.workingDirectory);
|
|
444
|
+
const codemodResults = await runCodemodRunner(codemods, codemodRepositoriesMappedByCodemodName, options.workingDirectory);
|
|
445
|
+
if (options.pushChanges) await makePullRequestsForCodemodResults(codemods, codemodResults, codemodRepositoriesMappedByCodemodName);
|
|
443
446
|
}
|
|
444
447
|
function utils_codemodTargetFiltering(repositories, failedRepositoryAddressesMappedByCodemodNames) {
|
|
445
448
|
return (filepath, codemod)=>{
|
|
@@ -465,10 +468,9 @@ async function codemodPostTransform(transformedContent) {
|
|
|
465
468
|
return transformedContent;
|
|
466
469
|
}
|
|
467
470
|
async function runCodemodRunner(codemods, repositories, workingDirectory) {
|
|
468
|
-
const codemodRepositoriesMappedByCodemodName = await prepareRepositoriesForCodemods(repositories, codemods, workingDirectory);
|
|
469
471
|
const results = Object.fromEntries(await Promise.all(codemods.map(async (codemod)=>{
|
|
470
472
|
const start = performance.now();
|
|
471
|
-
const codemodRepositories =
|
|
473
|
+
const codemodRepositories = repositories[codemod.name];
|
|
472
474
|
asserts.invariant(null != codemodRepositories, 'Codemod repositories should be present');
|
|
473
475
|
const codemodWorkingDirectory = node_path.resolve(workingDirectory, codemod.name.replace(/\//g, '-'));
|
|
474
476
|
const failedRepositoryAddressesMappedByCodemodNames = {};
|
|
@@ -476,7 +478,7 @@ async function runCodemodRunner(codemods, repositories, workingDirectory) {
|
|
|
476
478
|
rootPaths: codemodRepositories.map((repository)=>repository.path),
|
|
477
479
|
hooks: {
|
|
478
480
|
preCodemodRun: async (codemod)=>{
|
|
479
|
-
failedRepositoryAddressesMappedByCodemodNames[codemod.name] = await codemodPreCodemodRun(
|
|
481
|
+
failedRepositoryAddressesMappedByCodemodNames[codemod.name] = await codemodPreCodemodRun(codemodRepositories, codemod);
|
|
480
482
|
},
|
|
481
483
|
targetFiltering: utils_codemodTargetFiltering(groupByFlat(codemodRepositories, 'name'), failedRepositoryAddressesMappedByCodemodNames),
|
|
482
484
|
postTransform: codemodPostTransform
|
|
@@ -507,19 +509,7 @@ async function prepareRepositoriesForCodemods(repositories, codemods, workingDir
|
|
|
507
509
|
}));
|
|
508
510
|
console.log(`\u{1F4CB} prepared the following repos for codemods:
|
|
509
511
|
\xb7 ${updatedRepositories.map((repo)=>repo.address).join("\n\xb7 ")}`);
|
|
510
|
-
return Object.fromEntries(await Promise.all(codemods.map(
|
|
511
|
-
const codemodWorkingDirectory = node_path.resolve(workingDirectory, codemod.name.replace(/\//g, '-'));
|
|
512
|
-
await $`mkdir -p ${codemodWorkingDirectory}`;
|
|
513
|
-
const codeRepositories = await Promise.all(updatedRepositories.map((repo)=>{
|
|
514
|
-
const newPath = node_path.join(codemodWorkingDirectory, repo.name);
|
|
515
|
-
console.log(`\xa9\u{FE0F} copying ${repo.name} -> ${newPath}`);
|
|
516
|
-
return repo.copy(newPath);
|
|
517
|
-
}));
|
|
518
|
-
return [
|
|
519
|
-
codemod.name,
|
|
520
|
-
codeRepositories
|
|
521
|
-
];
|
|
522
|
-
})));
|
|
512
|
+
return Object.fromEntries(await Promise.all(codemods.map(copyRepo(workingDirectory, updatedRepositories))));
|
|
523
513
|
}
|
|
524
514
|
async function runCodemods(codemods, transformationPath, options) {
|
|
525
515
|
const results = {};
|
|
@@ -582,7 +572,7 @@ async function runCodemod(codemod, transformationPath, options) {
|
|
|
582
572
|
root,
|
|
583
573
|
results: successesGroupedByRoot[root] ?? []
|
|
584
574
|
}));
|
|
585
|
-
await Promise.all(rootPathsWithResults.map((r)=>(codemod.postTransform ?? (async ()=>{}))(r)));
|
|
575
|
+
await Promise.all(rootPathsWithResults.map((r)=>(codemod.postTransform ?? (async ()=>{}))(r, codemod)));
|
|
586
576
|
return results;
|
|
587
577
|
}
|
|
588
578
|
function traverseUp(node, until) {
|
|
@@ -695,6 +685,21 @@ function findAndReplace(content, rule, transformer) {
|
|
|
695
685
|
const edits = findAndReplaceEdits(content, rule, transformer);
|
|
696
686
|
return root.commitEdits(edits);
|
|
697
687
|
}
|
|
688
|
+
function copyRepo(workingDirectory, repositories) {
|
|
689
|
+
return async (codemod)=>{
|
|
690
|
+
const codemodWorkingDirectory = node_path.resolve(workingDirectory, codemod.name.replace(/\//g, '-'));
|
|
691
|
+
await $`mkdir -p ${codemodWorkingDirectory}`;
|
|
692
|
+
const codeRepositories = await Promise.all(repositories.map((repo)=>{
|
|
693
|
+
const newPath = node_path.join(codemodWorkingDirectory, repo.name);
|
|
694
|
+
console.log(`\xa9\u{FE0F} copying ${repo.name} -> ${newPath}`);
|
|
695
|
+
return repo.copy(newPath);
|
|
696
|
+
}));
|
|
697
|
+
return [
|
|
698
|
+
codemod.name,
|
|
699
|
+
codeRepositories
|
|
700
|
+
];
|
|
701
|
+
};
|
|
702
|
+
}
|
|
698
703
|
async function commitEditModifications(edits, modifications) {
|
|
699
704
|
if (0 === edits.length) return modifications;
|
|
700
705
|
const root = modifications.ast.root();
|