@kamaalio/codemod-kit 0.0.38 → 0.0.39

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.
@@ -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>>>, repositories: Array<Repository<Tag>>): Promise<void>;
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, repositories) {
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
- if (null == codemod) throw new Error('Invariant found codemod should be present');
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 codemodResults = await runCodemodRunner(codemods, clonedRepositories, options.workingDirectory);
491
- if (options.pushChanges) await makePullRequestsForCodemodResults(codemods, codemodResults, clonedRepositories);
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 = codemodRepositoriesMappedByCodemodName[codemod.name];
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(repositories, codemod);
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(async (codemod)=>{
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 = {};
@@ -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, repositories) {
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
- if (null == codemod) throw new Error('Invariant found codemod should be present');
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 codemodResults = await runCodemodRunner(codemods, clonedRepositories, options.workingDirectory);
442
- if (options.pushChanges) await makePullRequestsForCodemodResults(codemods, codemodResults, clonedRepositories);
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 = codemodRepositoriesMappedByCodemodName[codemod.name];
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(repositories, codemod);
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(async (codemod)=>{
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 = {};
@@ -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();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kamaalio/codemod-kit",
3
- "version": "0.0.38",
3
+ "version": "0.0.39",
4
4
  "type": "module",
5
5
  "author": "Kamaal Farah",
6
6
  "license": "MIT",