@kamaalio/codemod-kit 0.0.40 โ 0.0.42
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/index.d.ts +1 -1
- package/dist/codemods/types.d.ts +1 -2
- package/dist/git/schemas.d.ts +2 -14
- package/dist/index.cjs +21 -22
- package/dist/index.d.ts +1 -1
- package/dist/index.js +12 -13
- package/package.json +17 -17
package/dist/codemods/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { runCodemods, runCodemod, commitEditModifications, findAndReplace, findAndReplaceEdits, findAndReplaceConfig, findAndReplaceConfigModifications, traverseUp, runCodemodsOnProjects, } from './utils.js';
|
|
2
|
-
export type { Codemod, Modifications, FindAndReplaceConfig, RunCodemodOkResult, RunCodemodResult, CodemodRunnerCodemod, RepositoryToClone, } from './types.js';
|
|
2
|
+
export type { Codemod, Modifications, FindAndReplaceConfig, RunCodemodOkResult, RunCodemodResult, CodemodRunnerCodemod, RepositoryToClone, CodemodOptions, } from './types.js';
|
package/dist/codemods/types.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export type RunCodemodOkResult = {
|
|
|
10
10
|
root: string;
|
|
11
11
|
};
|
|
12
12
|
export type RunCodemodResult = Result<RunCodemodOkResult, Error>;
|
|
13
|
-
type CodemodOptions = {
|
|
13
|
+
export type CodemodOptions = {
|
|
14
14
|
postTransform?: Record<string, unknown>;
|
|
15
15
|
};
|
|
16
16
|
export type Codemod = {
|
|
@@ -46,4 +46,3 @@ export type FindAndReplaceConfig = {
|
|
|
46
46
|
rule: Rule<TypesMap>;
|
|
47
47
|
transformer: ((node: SgNode<TypesMap, Kinds<TypesMap>>, rule: Rule<TypesMap>) => types.Optional<Edit | string> | Array<Edit | string>) | string;
|
|
48
48
|
};
|
|
49
|
-
export {};
|
package/dist/git/schemas.d.ts
CHANGED
|
@@ -2,17 +2,5 @@ import z from 'zod';
|
|
|
2
2
|
export declare const DefaultBranchRefSchema: z.ZodObject<{
|
|
3
3
|
defaultBranchRef: z.ZodObject<{
|
|
4
4
|
name: z.ZodString;
|
|
5
|
-
},
|
|
6
|
-
|
|
7
|
-
}, {
|
|
8
|
-
name: string;
|
|
9
|
-
}>;
|
|
10
|
-
}, "strip", z.ZodTypeAny, {
|
|
11
|
-
defaultBranchRef: {
|
|
12
|
-
name: string;
|
|
13
|
-
};
|
|
14
|
-
}, {
|
|
15
|
-
defaultBranchRef: {
|
|
16
|
-
name: string;
|
|
17
|
-
};
|
|
18
|
-
}>;
|
|
5
|
+
}, z.z.core.$strip>;
|
|
6
|
+
}, z.z.core.$strip>;
|
package/dist/index.cjs
CHANGED
|
@@ -22,7 +22,7 @@ var __webpack_require__ = {};
|
|
|
22
22
|
})();
|
|
23
23
|
(()=>{
|
|
24
24
|
__webpack_require__.r = (exports1)=>{
|
|
25
|
-
if (
|
|
25
|
+
if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
26
26
|
value: 'Module'
|
|
27
27
|
});
|
|
28
28
|
Object.defineProperty(exports1, '__esModule', {
|
|
@@ -33,15 +33,15 @@ var __webpack_require__ = {};
|
|
|
33
33
|
var __webpack_exports__ = {};
|
|
34
34
|
__webpack_require__.r(__webpack_exports__);
|
|
35
35
|
__webpack_require__.d(__webpack_exports__, {
|
|
36
|
-
traverseUp: ()=>traverseUp,
|
|
37
36
|
findAndReplace: ()=>findAndReplace,
|
|
38
|
-
findAndReplaceConfig: ()=>findAndReplaceConfig,
|
|
39
|
-
commitEditModifications: ()=>commitEditModifications,
|
|
40
|
-
runCodemod: ()=>runCodemod,
|
|
41
|
-
findAndReplaceConfigModifications: ()=>findAndReplaceConfigModifications,
|
|
42
37
|
findAndReplaceEdits: ()=>findAndReplaceEdits,
|
|
38
|
+
traverseUp: ()=>traverseUp,
|
|
39
|
+
runCodemodsOnProjects: ()=>runCodemodsOnProjects,
|
|
40
|
+
commitEditModifications: ()=>commitEditModifications,
|
|
43
41
|
runCodemods: ()=>runCodemods,
|
|
44
|
-
|
|
42
|
+
findAndReplaceConfig: ()=>findAndReplaceConfig,
|
|
43
|
+
runCodemod: ()=>runCodemod,
|
|
44
|
+
findAndReplaceConfigModifications: ()=>findAndReplaceConfigModifications
|
|
45
45
|
});
|
|
46
46
|
const external_node_path_namespaceObject = require("node:path");
|
|
47
47
|
var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
|
|
@@ -468,17 +468,17 @@ async function makePullRequestsForCodemodResults(codemods, codemodResults, repos
|
|
|
468
468
|
async function makePullRequestsForCodemodResult(codemod, codemodResult, repositories) {
|
|
469
469
|
const { success } = groupResults(codemodResult);
|
|
470
470
|
const hasChanges = success.some((result)=>result.hasChanges);
|
|
471
|
-
if (!hasChanges) return void console.log(
|
|
471
|
+
if (!hasChanges) return void console.log(`๐ธ nothing transformed for '${codemod.name}'`);
|
|
472
472
|
await Promise.all(repositories.map(async (repository)=>{
|
|
473
473
|
await repository.commit(codemod.commitMessage);
|
|
474
474
|
const pushResult = await repository.push();
|
|
475
|
-
if (pushResult.isErr()) return void console.error(
|
|
475
|
+
if (pushResult.isErr()) return void console.error(`โ Failed to push changes`, pushResult.error.message);
|
|
476
476
|
const pullRequestResult = await makePullRequest({
|
|
477
477
|
workingDirectory: repository.path,
|
|
478
478
|
title: codemod.commitMessage
|
|
479
479
|
});
|
|
480
|
-
if (pullRequestResult.isErr()) return void console.error(
|
|
481
|
-
console.log(
|
|
480
|
+
if (pullRequestResult.isErr()) return void console.error(`โ
already pushed transformation for`, repository.address);
|
|
481
|
+
console.log(`โ
pull request created`, pullRequestResult.value.stdout);
|
|
482
482
|
}));
|
|
483
483
|
}
|
|
484
484
|
async function makePullRequest(params) {
|
|
@@ -488,7 +488,7 @@ async function makePullRequest(params) {
|
|
|
488
488
|
}
|
|
489
489
|
async function runCodemodsOnProjects(repositoriesToClone, codemods, options) {
|
|
490
490
|
const clonedRepositories = await cloneRepositories(repositoriesToClone, options.workingDirectory);
|
|
491
|
-
console.log(
|
|
491
|
+
console.log(`๐จ๏ธ cloned ${clonedRepositories.length} ${1 === clonedRepositories.length ? 'repository' : 'repositories'}`);
|
|
492
492
|
const codemodRepositoriesMappedByCodemodName = await prepareRepositoriesForCodemods(clonedRepositories, codemods, options.workingDirectory);
|
|
493
493
|
const codemodResults = await runCodemodRunner(codemods, codemodRepositoriesMappedByCodemodName, options.workingDirectory);
|
|
494
494
|
if (options.pushChanges) await makePullRequestsForCodemodResults(codemods, codemodResults, codemodRepositoriesMappedByCodemodName);
|
|
@@ -510,7 +510,7 @@ async function codemodPreCodemodRun(repositories, codemod) {
|
|
|
510
510
|
const preparationResults = await Promise.all(repositories.map((repo)=>repo.prepareForUpdate(codemod.name)));
|
|
511
511
|
const { failure: preparationFailures } = groupResults(preparationResults);
|
|
512
512
|
const failedRepositoryAddresses = preparationFailures.map((failure)=>failure.repository.address);
|
|
513
|
-
if (preparationFailures.length > 0) console.error(
|
|
513
|
+
if (preparationFailures.length > 0) console.error(`โ failed to prepare [${failedRepositoryAddresses.join(', ')}] for '${codemod.name}'`);
|
|
514
514
|
return new Set(failedRepositoryAddresses);
|
|
515
515
|
}
|
|
516
516
|
async function codemodPostTransform(transformedContent) {
|
|
@@ -534,7 +534,7 @@ async function runCodemodRunner(codemods, repositories, workingDirectory) {
|
|
|
534
534
|
}
|
|
535
535
|
});
|
|
536
536
|
const end = performance.now();
|
|
537
|
-
console.log(
|
|
537
|
+
console.log(`โจ '${codemod.name}' codemod took ${((end - start) / 1000).toFixed(2)} seconds`);
|
|
538
538
|
return [
|
|
539
539
|
codemod.name,
|
|
540
540
|
result
|
|
@@ -556,8 +556,7 @@ async function prepareRepositoriesForCodemods(repositories, codemods, workingDir
|
|
|
556
556
|
if (prepareResult.isErr()) throw prepareResult.error;
|
|
557
557
|
return prepareResult.value;
|
|
558
558
|
}));
|
|
559
|
-
console.log(
|
|
560
|
-
\xb7 ${updatedRepositories.map((repo)=>repo.address).join("\n\xb7 ")}`);
|
|
559
|
+
console.log(`๐ prepared the following repos for codemods:\nยท ${updatedRepositories.map((repo)=>repo.address).join('\nยท ')}`);
|
|
561
560
|
return Object.fromEntries(await Promise.all(codemods.map(copyRepo(workingDirectory, updatedRepositories))));
|
|
562
561
|
}
|
|
563
562
|
async function runCodemods(codemods, transformationPath, options) {
|
|
@@ -585,7 +584,7 @@ async function runCodemod(codemod, transformationPath, options) {
|
|
|
585
584
|
return collectionIsEmpty(extensions) || extensions.has(external_node_path_default().extname(filepath));
|
|
586
585
|
});
|
|
587
586
|
if (0 === targets.length) return [];
|
|
588
|
-
if (enableLogging) console.log(
|
|
587
|
+
if (enableLogging) console.log(`๐ง '${codemod.name}' targeting ${targets.length} ${1 === targets.length ? 'file' : 'files'} to transform, chill and grab some matรฉ`);
|
|
589
588
|
const results = await Promise.all(targets.map(async (filepath)=>{
|
|
590
589
|
const fullPath = external_node_path_default().join(transformationPath, filepath);
|
|
591
590
|
try {
|
|
@@ -597,7 +596,7 @@ async function runCodemod(codemod, transformationPath, options) {
|
|
|
597
596
|
if (hasChanges) {
|
|
598
597
|
const transformedContent = await hooks.postTransform(modifiedContent, codemod);
|
|
599
598
|
if (!runInDryMode) await promises_default().writeFile(fullPath, transformedContent);
|
|
600
|
-
if (enableLogging) console.log(
|
|
599
|
+
if (enableLogging) console.log(`๐ finished '${codemod.name}'`, {
|
|
601
600
|
filename: filepath
|
|
602
601
|
});
|
|
603
602
|
}
|
|
@@ -608,7 +607,7 @@ async function runCodemod(codemod, transformationPath, options) {
|
|
|
608
607
|
root: external_node_path_default().resolve(transformationPath, filepath.split('/')[0])
|
|
609
608
|
});
|
|
610
609
|
} catch (error) {
|
|
611
|
-
if (enableLogging) console.error(
|
|
610
|
+
if (enableLogging) console.error(`โ '${codemod.name}' failed to parse file`, filepath, error);
|
|
612
611
|
return (0, external_neverthrow_namespaceObject.err)(error);
|
|
613
612
|
}
|
|
614
613
|
}));
|
|
@@ -740,7 +739,7 @@ function copyRepo(workingDirectory, repositories) {
|
|
|
740
739
|
await (0, external_execa_namespaceObject.$)`mkdir -p ${codemodWorkingDirectory}`;
|
|
741
740
|
const codeRepositories = await Promise.all(repositories.map((repo)=>{
|
|
742
741
|
const newPath = external_node_path_default().join(codemodWorkingDirectory, repo.name);
|
|
743
|
-
console.log(
|
|
742
|
+
console.log(`ยฉ๏ธ copying ${repo.name} -> ${newPath}`);
|
|
744
743
|
return repo.copy(newPath);
|
|
745
744
|
}));
|
|
746
745
|
return [
|
|
@@ -792,7 +791,7 @@ exports.runCodemod = __webpack_exports__.runCodemod;
|
|
|
792
791
|
exports.runCodemods = __webpack_exports__.runCodemods;
|
|
793
792
|
exports.runCodemodsOnProjects = __webpack_exports__.runCodemodsOnProjects;
|
|
794
793
|
exports.traverseUp = __webpack_exports__.traverseUp;
|
|
795
|
-
for(var
|
|
794
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
796
795
|
"commitEditModifications",
|
|
797
796
|
"findAndReplace",
|
|
798
797
|
"findAndReplaceConfig",
|
|
@@ -802,7 +801,7 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
|
802
801
|
"runCodemods",
|
|
803
802
|
"runCodemodsOnProjects",
|
|
804
803
|
"traverseUp"
|
|
805
|
-
].indexOf(
|
|
804
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
806
805
|
Object.defineProperty(exports, '__esModule', {
|
|
807
806
|
value: true
|
|
808
807
|
});
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { runCodemods, runCodemod, commitEditModifications, findAndReplace, findAndReplaceEdits, findAndReplaceConfig, findAndReplaceConfigModifications, traverseUp, runCodemodsOnProjects, type Codemod, type Modifications, type FindAndReplaceConfig, type RunCodemodOkResult, type RunCodemodResult, type CodemodRunnerCodemod, type RepositoryToClone, } from './codemods/index.js';
|
|
1
|
+
export { runCodemods, runCodemod, commitEditModifications, findAndReplace, findAndReplaceEdits, findAndReplaceConfig, findAndReplaceConfigModifications, traverseUp, runCodemodsOnProjects, type Codemod, type Modifications, type FindAndReplaceConfig, type RunCodemodOkResult, type RunCodemodResult, type CodemodRunnerCodemod, type RepositoryToClone, type CodemodOptions, } from './codemods/index.js';
|
package/dist/index.js
CHANGED
|
@@ -419,17 +419,17 @@ async function makePullRequestsForCodemodResults(codemods, codemodResults, repos
|
|
|
419
419
|
async function makePullRequestsForCodemodResult(codemod, codemodResult, repositories) {
|
|
420
420
|
const { success } = groupResults(codemodResult);
|
|
421
421
|
const hasChanges = success.some((result)=>result.hasChanges);
|
|
422
|
-
if (!hasChanges) return void console.log(
|
|
422
|
+
if (!hasChanges) return void console.log(`๐ธ nothing transformed for '${codemod.name}'`);
|
|
423
423
|
await Promise.all(repositories.map(async (repository)=>{
|
|
424
424
|
await repository.commit(codemod.commitMessage);
|
|
425
425
|
const pushResult = await repository.push();
|
|
426
|
-
if (pushResult.isErr()) return void console.error(
|
|
426
|
+
if (pushResult.isErr()) return void console.error(`โ Failed to push changes`, pushResult.error.message);
|
|
427
427
|
const pullRequestResult = await makePullRequest({
|
|
428
428
|
workingDirectory: repository.path,
|
|
429
429
|
title: codemod.commitMessage
|
|
430
430
|
});
|
|
431
|
-
if (pullRequestResult.isErr()) return void console.error(
|
|
432
|
-
console.log(
|
|
431
|
+
if (pullRequestResult.isErr()) return void console.error(`โ
already pushed transformation for`, repository.address);
|
|
432
|
+
console.log(`โ
pull request created`, pullRequestResult.value.stdout);
|
|
433
433
|
}));
|
|
434
434
|
}
|
|
435
435
|
async function makePullRequest(params) {
|
|
@@ -439,7 +439,7 @@ async function makePullRequest(params) {
|
|
|
439
439
|
}
|
|
440
440
|
async function runCodemodsOnProjects(repositoriesToClone, codemods, options) {
|
|
441
441
|
const clonedRepositories = await cloneRepositories(repositoriesToClone, options.workingDirectory);
|
|
442
|
-
console.log(
|
|
442
|
+
console.log(`๐จ๏ธ cloned ${clonedRepositories.length} ${1 === clonedRepositories.length ? 'repository' : 'repositories'}`);
|
|
443
443
|
const codemodRepositoriesMappedByCodemodName = await prepareRepositoriesForCodemods(clonedRepositories, codemods, options.workingDirectory);
|
|
444
444
|
const codemodResults = await runCodemodRunner(codemods, codemodRepositoriesMappedByCodemodName, options.workingDirectory);
|
|
445
445
|
if (options.pushChanges) await makePullRequestsForCodemodResults(codemods, codemodResults, codemodRepositoriesMappedByCodemodName);
|
|
@@ -461,7 +461,7 @@ async function codemodPreCodemodRun(repositories, codemod) {
|
|
|
461
461
|
const preparationResults = await Promise.all(repositories.map((repo)=>repo.prepareForUpdate(codemod.name)));
|
|
462
462
|
const { failure: preparationFailures } = groupResults(preparationResults);
|
|
463
463
|
const failedRepositoryAddresses = preparationFailures.map((failure)=>failure.repository.address);
|
|
464
|
-
if (preparationFailures.length > 0) console.error(
|
|
464
|
+
if (preparationFailures.length > 0) console.error(`โ failed to prepare [${failedRepositoryAddresses.join(', ')}] for '${codemod.name}'`);
|
|
465
465
|
return new Set(failedRepositoryAddresses);
|
|
466
466
|
}
|
|
467
467
|
async function codemodPostTransform(transformedContent) {
|
|
@@ -485,7 +485,7 @@ async function runCodemodRunner(codemods, repositories, workingDirectory) {
|
|
|
485
485
|
}
|
|
486
486
|
});
|
|
487
487
|
const end = performance.now();
|
|
488
|
-
console.log(
|
|
488
|
+
console.log(`โจ '${codemod.name}' codemod took ${((end - start) / 1000).toFixed(2)} seconds`);
|
|
489
489
|
return [
|
|
490
490
|
codemod.name,
|
|
491
491
|
result
|
|
@@ -507,8 +507,7 @@ async function prepareRepositoriesForCodemods(repositories, codemods, workingDir
|
|
|
507
507
|
if (prepareResult.isErr()) throw prepareResult.error;
|
|
508
508
|
return prepareResult.value;
|
|
509
509
|
}));
|
|
510
|
-
console.log(
|
|
511
|
-
\xb7 ${updatedRepositories.map((repo)=>repo.address).join("\n\xb7 ")}`);
|
|
510
|
+
console.log(`๐ prepared the following repos for codemods:\nยท ${updatedRepositories.map((repo)=>repo.address).join('\nยท ')}`);
|
|
512
511
|
return Object.fromEntries(await Promise.all(codemods.map(copyRepo(workingDirectory, updatedRepositories))));
|
|
513
512
|
}
|
|
514
513
|
async function runCodemods(codemods, transformationPath, options) {
|
|
@@ -536,7 +535,7 @@ async function runCodemod(codemod, transformationPath, options) {
|
|
|
536
535
|
return collectionIsEmpty(extensions) || extensions.has(node_path.extname(filepath));
|
|
537
536
|
});
|
|
538
537
|
if (0 === targets.length) return [];
|
|
539
|
-
if (enableLogging) console.log(
|
|
538
|
+
if (enableLogging) console.log(`๐ง '${codemod.name}' targeting ${targets.length} ${1 === targets.length ? 'file' : 'files'} to transform, chill and grab some matรฉ`);
|
|
540
539
|
const results = await Promise.all(targets.map(async (filepath)=>{
|
|
541
540
|
const fullPath = node_path.join(transformationPath, filepath);
|
|
542
541
|
try {
|
|
@@ -548,7 +547,7 @@ async function runCodemod(codemod, transformationPath, options) {
|
|
|
548
547
|
if (hasChanges) {
|
|
549
548
|
const transformedContent = await hooks.postTransform(modifiedContent, codemod);
|
|
550
549
|
if (!runInDryMode) await promises.writeFile(fullPath, transformedContent);
|
|
551
|
-
if (enableLogging) console.log(
|
|
550
|
+
if (enableLogging) console.log(`๐ finished '${codemod.name}'`, {
|
|
552
551
|
filename: filepath
|
|
553
552
|
});
|
|
554
553
|
}
|
|
@@ -559,7 +558,7 @@ async function runCodemod(codemod, transformationPath, options) {
|
|
|
559
558
|
root: node_path.resolve(transformationPath, filepath.split('/')[0])
|
|
560
559
|
});
|
|
561
560
|
} catch (error) {
|
|
562
|
-
if (enableLogging) console.error(
|
|
561
|
+
if (enableLogging) console.error(`โ '${codemod.name}' failed to parse file`, filepath, error);
|
|
563
562
|
return err(error);
|
|
564
563
|
}
|
|
565
564
|
}));
|
|
@@ -691,7 +690,7 @@ function copyRepo(workingDirectory, repositories) {
|
|
|
691
690
|
await $`mkdir -p ${codemodWorkingDirectory}`;
|
|
692
691
|
const codeRepositories = await Promise.all(repositories.map((repo)=>{
|
|
693
692
|
const newPath = node_path.join(codemodWorkingDirectory, repo.name);
|
|
694
|
-
console.log(
|
|
693
|
+
console.log(`ยฉ๏ธ copying ${repo.name} -> ${newPath}`);
|
|
695
694
|
return repo.copy(newPath);
|
|
696
695
|
}));
|
|
697
696
|
return [
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kamaalio/codemod-kit",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.42",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"author": "Kamaal Farah",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,28 +19,28 @@
|
|
|
19
19
|
"dist"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@ast-grep/napi": "^0.
|
|
23
|
-
"@kamaalio/kamaal": "^0.
|
|
24
|
-
"execa": "^9.6.
|
|
22
|
+
"@ast-grep/napi": "^0.40.5",
|
|
23
|
+
"@kamaalio/kamaal": "^0.8.0",
|
|
24
|
+
"execa": "^9.6.1",
|
|
25
25
|
"fast-glob": "^3.3.3",
|
|
26
26
|
"neverthrow": "^8.2.0",
|
|
27
|
-
"zod": "^3.
|
|
27
|
+
"zod": "^4.3.5"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@eslint/js": "^9.
|
|
30
|
+
"@eslint/js": "^9.39.2",
|
|
31
31
|
"@kamaalio/prettier-config": "^0.1.2",
|
|
32
|
-
"@rslib/core": "^0.
|
|
33
|
-
"@types/node": "^
|
|
34
|
-
"@vitest/coverage-v8": "
|
|
35
|
-
"eslint": "^9.
|
|
36
|
-
"globals": "^
|
|
32
|
+
"@rslib/core": "^0.19.1",
|
|
33
|
+
"@types/node": "^25.0.6",
|
|
34
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
35
|
+
"eslint": "^9.39.2",
|
|
36
|
+
"globals": "^17.0.0",
|
|
37
37
|
"husky": "^9.1.7",
|
|
38
|
-
"lint-staged": "^16.
|
|
39
|
-
"prettier": "^3.
|
|
40
|
-
"tsx": "^4.
|
|
41
|
-
"typescript": "^5.
|
|
42
|
-
"typescript-eslint": "^8.
|
|
43
|
-
"vitest": "^
|
|
38
|
+
"lint-staged": "^16.2.7",
|
|
39
|
+
"prettier": "^3.7.4",
|
|
40
|
+
"tsx": "^4.21.0",
|
|
41
|
+
"typescript": "^5.9.3",
|
|
42
|
+
"typescript-eslint": "^8.52.0",
|
|
43
|
+
"vitest": "^4.0.16"
|
|
44
44
|
},
|
|
45
45
|
"lint-staged": {
|
|
46
46
|
"**/*": "prettier --write --ignore-unknown"
|