@@ -803,93 +803,112 @@ function addPackage (plugin, packageInfo, options, cb) {
803803 return addCb ( err ) ;
804804 }
805805
806- // don't duplicate component.name, component.version
807- db . retrieve ( plugin . type , { name : package . name , version : package . version } , function ( err , results ) {
806+ const targetAttribute = pkgMeta . targetAttribute ;
807+
808+ async . some ( [ 'componenttype' , 'extensiontype' , 'menutype' , 'themetype' ] , ( type , asyncCallback ) => {
809+ if ( ! targetAttribute ) return asyncCallback ( ) ;
810+
811+ db . retrieve ( type , { targetAttribute : targetAttribute } , ( err , results ) => {
812+ asyncCallback ( err , results && results . length ) ;
813+ } ) ;
814+ } , ( err , targetAttributeExists ) => {
808815 if ( err ) {
809816 logger . log ( 'error' , err ) ;
810817 return addCb ( err ) ;
811818 }
812819
813- if ( results && 0 !== results . length ) {
814- // don't add duplicate
815- if ( options . strict ) {
816- return addCb ( new PluginPackageError ( "Can't add plugin: plugin already exists!" ) ) ;
817- }
818- return addCb ( null ) ;
820+ if ( targetAttributeExists ) {
821+ return addCb ( new PluginPackageError ( `Can't add plugin: targetAttribute already exists!` ) ) ;
819822 }
820823
821- db . create ( plugin . type , package , function ( err , newPlugin ) {
824+ // don't duplicate component.name, component.version
825+ db . retrieve ( plugin . type , { name : package . name , version : package . version } , function ( err , results ) {
822826 if ( err ) {
827+ logger . log ( 'error' , err ) ;
828+ return addCb ( err ) ;
829+ }
830+
831+ if ( results && 0 !== results . length ) {
832+ // don't add duplicate
823833 if ( options . strict ) {
824- return addCb ( err ) ;
834+ return addCb ( new PluginPackageError ( "Can't add plugin: plugin already exists!" ) ) ;
825835 }
826-
827- logger . log ( 'error' , 'Failed to add package: ' + package . name , err ) ;
828836 return addCb ( null ) ;
829837 }
830838
831- logger . log ( 'info' , 'Added package: ' + package . name ) ;
832-
833- // #509 update content targeted by previous versions of this package
834- logger . log ( 'info' , 'searching old package types ... ' ) ;
835- db . retrieve ( plugin . type , { name : package . name , version : { $ne : newPlugin . version } } , function ( err , results ) {
836-
839+ db . create ( plugin . type , package , function ( err , newPlugin ) {
837840 if ( err ) {
838- // strictness doesn't matter at this point
839- logger . log ( 'error' , 'Failed to retrieve previous packages: ' + err . message , err ) ;
841+ if ( options . strict ) {
842+ return addCb ( err ) ;
843+ }
844+
845+ logger . log ( 'error' , 'Failed to add package: ' + package . name , err ) ;
846+ return addCb ( null ) ;
840847 }
841848
842- if ( results && results . length ) {
843- // found previous versions to update
844- // only update content using the id of the most recent version
845- var oldPlugin = false ;
846- results . forEach ( function ( item ) {
847- if ( ! oldPlugin ) {
848- oldPlugin = item ;
849- } else if ( semver . gt ( item . version , oldPlugin . version ) ) {
850- oldPlugin = item ;
851- }
852- } ) ;
849+ logger . log ( 'info' , 'Added package: ' + package . name ) ;
853850
854- // Persist the _isAvailableInEditor flag.
855- db . update ( plugin . type , { _id : newPlugin . _id } , { _isAvailableInEditor : oldPlugin . _isAvailableInEditor } , function ( err , results ) {
856- if ( err ) {
857- logger . log ( 'error' , err ) ;
858- return addCb ( err ) ;
859- }
851+ // #509 update content targeted by previous versions of this package
852+ logger . log ( 'info' , 'searching old package types ... ' ) ;
853+ db . retrieve ( plugin . type , { name : package . name , version : { $ne : newPlugin . version } } , function ( err , results ) {
854+
855+ if ( err ) {
856+ // strictness doesn't matter at this point
857+ logger . log ( 'error' , 'Failed to retrieve previous packages: ' + err . message , err ) ;
858+ }
859+
860+ if ( results && results . length ) {
861+ // found previous versions to update
862+ // only update content using the id of the most recent version
863+ var oldPlugin = false ;
864+ results . forEach ( function ( item ) {
865+ if ( ! oldPlugin ) {
866+ oldPlugin = item ;
867+ } else if ( semver . gt ( item . version , oldPlugin . version ) ) {
868+ oldPlugin = item ;
869+ }
870+ } ) ;
860871
861- plugin . updateLegacyContent ( newPlugin , oldPlugin , function ( err ) {
872+ // Persist the _isAvailableInEditor flag.
873+ db . update ( plugin . type , { _id : newPlugin . _id } , { _isAvailableInEditor : oldPlugin . _isAvailableInEditor } , function ( err , results ) {
862874 if ( err ) {
863875 logger . log ( 'error' , err ) ;
864876 return addCb ( err ) ;
865877 }
866878
867- // Remove older versions of this plugin
868- db . destroy ( plugin . type , { name : package . name , version : { $ne : newPlugin . version } } , function ( err ) {
879+ plugin . updateLegacyContent ( newPlugin , oldPlugin , function ( err ) {
869880 if ( err ) {
870881 logger . log ( 'error' , err ) ;
871882 return addCb ( err ) ;
872883 }
873884
874- logger . log ( 'info' , 'Successfully removed versions of ' + package . name + '(' + plugin . type + ') older than ' + newPlugin . version ) ;
875- return addCb ( null , newPlugin ) ;
885+ // Remove older versions of this plugin
886+ db . destroy ( plugin . type , { name : package . name , version : { $ne : newPlugin . version } } , function ( err ) {
887+ if ( err ) {
888+ logger . log ( 'error' , err ) ;
889+ return addCb ( err ) ;
890+ }
891+
892+ logger . log ( 'info' , 'Successfully removed versions of ' + package . name + '(' + plugin . type + ') older than ' + newPlugin . version ) ;
893+ return addCb ( null , newPlugin ) ;
894+ } ) ;
876895 } ) ;
877896 } ) ;
878- } ) ;
879- } else {
880- // nothing to do!
881- // Remove older versions of this plugin
882- db . destroy ( plugin . type , { name : package . name , version : { $ne : newPlugin . version } } , function ( err ) {
883- if ( err ) {
884- logger . log ( 'error' , err ) ;
885- return addCb ( err ) ;
886- }
897+ } else {
898+ // nothing to do!
899+ // Remove older versions of this plugin
900+ db . destroy ( plugin . type , { name : package . name , version : { $ne : newPlugin . version } } , function ( err ) {
901+ if ( err ) {
902+ logger . log ( 'error' , err ) ;
903+ return addCb ( err ) ;
904+ }
887905
888- logger . log ( 'info' , 'Successfully removed versions of ' + package . name + '(' + plugin . type + ') older than ' + newPlugin . version ) ;
906+ logger . log ( 'info' , 'Successfully removed versions of ' + package . name + '(' + plugin . type + ') older than ' + newPlugin . version ) ;
889907
890- return addCb ( null , newPlugin ) ;
891- } ) ;
892- }
908+ return addCb ( null , newPlugin ) ;
909+ } ) ;
910+ }
911+ } ) ;
893912 } ) ;
894913 } ) ;
895914 } ) ;
0 commit comments