11import { diff as semverDiff } from 'semver'
2- import type {
3- PackageFileTree ,
4- DependencyChange ,
5- FileChange ,
6- CompareResponse ,
7- } from '#shared/types'
2+ import type { PackageFileTree , DependencyChange , FileChange , CompareResponse } from '#shared/types'
83
94/** Maximum number of files to include in comparison */
105const MAX_FILES_COMPARE = 1000
@@ -34,6 +29,17 @@ export function compareFileTrees(
3429 const fromFiles = flattenTree ( fromTree )
3530 const toFiles = flattenTree ( toTree )
3631
32+ const hasChanged = ( fromNode : PackageFileTree , toNode : PackageFileTree ) : boolean => {
33+ // Prefer strong hash comparison when both hashes are available
34+ if ( fromNode . hash && toNode . hash ) return fromNode . hash !== toNode . hash
35+ // Fallback to size comparison if hashes are missing
36+ if ( typeof fromNode . size === 'number' && typeof toNode . size === 'number' ) {
37+ return fromNode . size !== toNode . size
38+ }
39+ // If we lack comparable signals, assume unchanged
40+ return false
41+ }
42+
3743 const added : FileChange [ ] = [ ]
3844 const removed : FileChange [ ] = [ ]
3945 const modified : FileChange [ ] = [ ]
@@ -58,8 +64,7 @@ export function compareFileTrees(
5864 newSize : toNode . size ,
5965 } )
6066 } else if ( fromNode . type === 'file' ) {
61- // Check if modified (size changed)
62- if ( fromNode . size !== toNode . size ) {
67+ if ( hasChanged ( fromNode , toNode ) ) {
6368 modified . push ( {
6469 path,
6570 type : 'modified' ,
@@ -135,7 +140,11 @@ export function compareDependencies(
135140 const cleanTo = toVersion . replace ( / ^ [ \^ ~ > = < ] + / , '' )
136141 const diffResult = semverDiff ( cleanFrom , cleanTo )
137142 if ( diffResult ) {
138- if ( diffResult === 'premajor' || diffResult === 'preminor' || diffResult === 'prepatch' ) {
143+ if (
144+ diffResult === 'premajor' ||
145+ diffResult === 'preminor' ||
146+ diffResult === 'prepatch'
147+ ) {
139148 semverDiffType = 'prerelease'
140149 } else if ( [ 'major' , 'minor' , 'patch' , 'prerelease' ] . includes ( diffResult ) ) {
141150 semverDiffType = diffResult as 'major' | 'minor' | 'patch' | 'prerelease'
0 commit comments