1- import { PackageJsonBase } from '../dep-graph-builders/types' ;
1+ import { Overrides , PackageJsonBase } from '../dep-graph-builders/types' ;
22import { parsePkgJson } from '../dep-graph-builders/util' ;
33
4+ /**
5+ * Parses a npm alias string (e.g., "npm:[email protected] ") and returns the package name and version 6+ */
7+ export const parseNpmAlias = (
8+ aliasString : string ,
9+ ) : { packageName : string ; version : string } | null => {
10+ if ( ! aliasString . startsWith ( 'npm:' ) ) {
11+ return null ;
12+ }
13+ const lastAtIndex = aliasString . lastIndexOf ( '@' ) ;
14+ if ( lastAtIndex <= 4 ) {
15+ // Invalid format: must have content after 'npm:' and before '@'
16+ return null ;
17+ }
18+ return {
19+ packageName : aliasString . substring ( 4 , lastAtIndex ) ,
20+ version : aliasString . substring ( lastAtIndex + 1 ) ,
21+ } ;
22+ } ;
23+
24+ /**
25+ * Adds an alias entry to the package.json aliases field
26+ */
27+ const addAlias = (
28+ pkgJson : PackageJsonBase ,
29+ aliasName : string ,
30+ targetDepName : string ,
31+ semver : string ,
32+ ) : void => {
33+ if ( ! pkgJson [ 'aliases' ] ) {
34+ pkgJson [ 'aliases' ] = { } ;
35+ }
36+ pkgJson [ 'aliases' ] [ aliasName ] = {
37+ aliasName,
38+ aliasTargetDepName : targetDepName ,
39+ semver,
40+ version : null ,
41+ } ;
42+ } ;
43+
444export const rewriteAliasesPkgJson = ( packageJsonContent : string ) : string => {
545 const pkgJsonPreprocessed = parsePkgJson ( packageJsonContent ) ;
646 pkgJsonPreprocessed . dependencies = rewriteAliases (
@@ -19,6 +59,13 @@ export const rewriteAliasesPkgJson = (packageJsonContent: string): string => {
1959 pkgJsonPreprocessed ,
2060 pkgJsonPreprocessed . peerDependencies ,
2161 ) ;
62+ // Process overrides field to extract aliases
63+ if ( pkgJsonPreprocessed . overrides ) {
64+ rewriteAliasesInOverrides (
65+ pkgJsonPreprocessed ,
66+ pkgJsonPreprocessed . overrides ,
67+ ) ;
68+ }
2269 return JSON . stringify ( pkgJsonPreprocessed ) ;
2370} ;
2471
@@ -32,23 +79,38 @@ export const rewriteAliases = (
3279 const newDependencies : Record < string , string > = { } ;
3380 for ( const key in dependencies ) {
3481 const value = dependencies [ key ] ;
35- if ( value . startsWith ( 'npm:' ) ) {
36- if ( ! pkgJsonPreprocessed [ 'aliases' ] ) {
37- pkgJsonPreprocessed [ 'aliases' ] = { } ;
38- }
39- pkgJsonPreprocessed [ 'aliases' ] = {
40- ...pkgJsonPreprocessed [ 'aliases' ] ,
41- ...{
42- [ key ] : {
43- aliasName : key ,
44- aliasTargetDepName : value . substring ( 4 , value . lastIndexOf ( '@' ) ) ,
45- semver : value . substring ( value . lastIndexOf ( '@' ) + 1 , value . length ) ,
46- version : null ,
47- } ,
48- } ,
49- } ;
82+ const parsed = parseNpmAlias ( value ) ;
83+ if ( parsed ) {
84+ addAlias ( pkgJsonPreprocessed , key , parsed . packageName , parsed . version ) ;
5085 }
5186 newDependencies [ key ] = value ;
5287 }
5388 return newDependencies ;
5489} ;
90+
91+ /**
92+ * Recursively processes the overrides object to extract aliases
93+ */
94+ export const rewriteAliasesInOverrides = (
95+ pkgJsonPreprocessed : PackageJsonBase ,
96+ overrides : Overrides ,
97+ ) : void => {
98+ if ( typeof overrides === 'string' ) {
99+ return ; // String values are handled at the parent level where we have the key
100+ }
101+
102+ // Recursive case: process each key-value pair in the overrides object
103+ for ( const key in overrides ) {
104+ const value = overrides [ key ] ;
105+
106+ if ( typeof value === 'string' ) {
107+ const parsed = parseNpmAlias ( value ) ;
108+ if ( parsed ) {
109+ addAlias ( pkgJsonPreprocessed , key , parsed . packageName , parsed . version ) ;
110+ }
111+ } else if ( typeof value === 'object' ) {
112+ // Recursively process nested overrides
113+ rewriteAliasesInOverrides ( pkgJsonPreprocessed , value ) ;
114+ }
115+ }
116+ } ;
0 commit comments