@@ -38,6 +38,7 @@ export async function publish(args) {
3838 writeFileSync ( packageJsonPath , JSON . stringify ( json , null , 2 ) ) ;
3939 }
4040
41+
4142 /** @type {import('../types').PackageJson } */
4243 const packageJson = JSON . parse ( readFileSync ( packageJsonPath , 'utf-8' ) ) ;
4344 const buildTime = new Date ( ) . toISOString ( ) ;
@@ -53,6 +54,8 @@ export async function publish(args) {
5354 logger . warn ( `No access token provided. Publishing to registry ${ args . registry } may fail.` ) ;
5455 }
5556
57+ processPackageJson ( packageDirectory , packageJson , { logger } ) ;
58+
5659 if ( webhook ) {
5760 let msg = `📦 **Publish package** \`${ packageJson . name } \`\n` ;
5861 msg += "```\n" ;
@@ -221,3 +224,59 @@ export async function publish(args) {
221224 appendFileSync ( process . env . GITHUB_OUTPUT , `package-published=${ needsPublish } \n` ) ;
222225 }
223226}
227+
228+
229+
230+ /**
231+ * Processes the package.json file to replace local dependencies with their current versions.
232+ * @param {string } packageJsonDirectory - The directory where the package.json file is located.
233+ * @param {import('../types').PackageJson } packageJson - The package.json object to process.
234+ * @param {{logger:import('@caporal/core').Logger} } args
235+ */
236+ function processPackageJson ( packageJsonDirectory , packageJson , args ) {
237+
238+ let modified = false ;
239+
240+ if ( packageJson . dependencies ) {
241+ replaceLocalPathWithVersion ( packageJson . dependencies ) ;
242+ }
243+ if ( packageJson . devDependencies ) {
244+ replaceLocalPathWithVersion ( packageJson . devDependencies ) ;
245+ }
246+ if ( packageJson . peerDependencies ) {
247+ replaceLocalPathWithVersion ( packageJson . peerDependencies ) ;
248+ }
249+ if ( packageJson . optionalDependencies ) {
250+ replaceLocalPathWithVersion ( packageJson . optionalDependencies ) ;
251+ }
252+
253+ if ( modified ) {
254+ args . logger . info ( `[${ packageJson . name } ]: Modified package.json to replace local paths with versions.` ) ;
255+ writeFileSync ( resolve ( packageJsonDirectory , 'package.json' ) , JSON . stringify ( packageJson , null , 2 ) , 'utf-8' ) ;
256+ }
257+
258+ /**
259+ * @param {Record<string, string> } object
260+ */
261+ function replaceLocalPathWithVersion ( object ) {
262+ for ( const [ key , value ] of Object . entries ( object ) ) {
263+ if ( value . startsWith ( 'file:' ) ) {
264+ const localpath = value . substring ( "file:" . length ) . trim ( ) ;
265+ const localPackageJsonPath = resolve ( packageJsonDirectory , localpath , 'package.json' ) ;
266+ if ( ! existsSync ( localPackageJsonPath ) ) {
267+ args . logger . warn ( `[${ packageJson . name } ]: Dependency '${ key } ' is a local path '${ localpath } ' but no package.json found at ${ localPackageJsonPath } . Keeping as is.` ) ;
268+ continue ;
269+ }
270+ const localPackageJson = JSON . parse ( readFileSync ( localPackageJsonPath , 'utf-8' ) ) ;
271+ if ( localPackageJson . version ) {
272+ modified = true ;
273+ args . logger . info ( `[${ packageJson . name } ]: Replacing dependency '${ key } ' with version '${ localPackageJson . version } ' (from ${ localPackageJsonPath } )` ) ;
274+ object [ key ] = localPackageJson . version ;
275+ } else {
276+ args . logger . warn ( `[${ packageJson . name } ]: Dependency '${ key } ' is a local path but has no version in ${ localPackageJsonPath } . Keeping as is.` ) ;
277+ }
278+
279+ }
280+ }
281+ }
282+ }
0 commit comments