1515 */
1616
1717import { makeStyles } from '@material-ui/core' ;
18- import { uniq } from 'lodash' ;
18+ import { cloneDeep , uniq } from 'lodash' ;
1919import React , { Fragment } from 'react' ;
20+ import { KubernetesResource } from '../../../types/KubernetesResource' ;
2021import { PackageRevisionResourcesMap } from '../../../types/PackageRevisionResource' ;
2122import {
2223 addResourceToResourcesMap ,
@@ -27,6 +28,7 @@ import {
2728 ResourceDiffStatus ,
2829 updateResourceInResourcesMap ,
2930} from '../../../utils/packageRevisionResources' ;
31+ import { dumpYaml , loadYaml } from '../../../utils/yaml' ;
3032import { PackageRevisionPageMode } from '../PackageRevisionPage' ;
3133import {
3234 PackageRevisionResourcesTable ,
@@ -175,25 +177,69 @@ export const PackageResourcesList = ({
175177 originalResource ?: PackageResource ,
176178 resource ?: PackageResource ,
177179 ) : void => {
178- let updatedResourcesMap : PackageRevisionResourcesMap | undefined ;
180+ let updatedResourcesMap = cloneDeep ( resourcesMap ) ;
179181
180- if ( originalResource && ! resource ) {
182+ if ( resource ) {
183+ const resourceYaml = loadYaml ( resource . yaml ) as KubernetesResource ;
184+
185+ if ( resourceYaml . metadata . annotations ) {
186+ const PATH_ANNOTATION = 'internal.config.kubernetes.io/path' ;
187+
188+ const newFilename =
189+ resourceYaml . metadata . annotations ?. [ PATH_ANNOTATION ] ;
190+
191+ if ( newFilename ) {
192+ if ( ! newFilename . endsWith ( '.yaml' ) ) {
193+ throw new Error ( 'Filename must must have the .yaml extension' ) ;
194+ }
195+
196+ resource . filename = newFilename ;
197+
198+ delete resourceYaml . metadata . annotations ?. [ PATH_ANNOTATION ] ;
199+ if ( Object . keys ( resourceYaml . metadata . annotations ) . length === 0 ) {
200+ delete resourceYaml . metadata . annotations ;
201+ }
202+
203+ resource . yaml = dumpYaml ( resourceYaml ) ;
204+ }
205+ }
206+ }
207+
208+ const deleteResource =
209+ originalResource &&
210+ ( ! resource || resource . filename !== originalResource . filename ) ;
211+ const updateResource =
212+ originalResource &&
213+ resource &&
214+ resource . filename === originalResource . filename ;
215+ const addResource =
216+ resource &&
217+ ( ! originalResource || resource . filename !== originalResource ?. filename ) ;
218+
219+ if ( ! ( deleteResource || updateResource || addResource ) ) {
220+ throw new Error ( 'No action is set to occur on resources map' ) ;
221+ }
222+
223+ if ( deleteResource ) {
181224 updatedResourcesMap = removeResourceFromResourcesMap (
182- resourcesMap ,
225+ updatedResourcesMap ,
183226 originalResource ,
184227 ) ;
185- } else if ( originalResource && resource ) {
228+ }
229+
230+ if ( updateResource ) {
186231 updatedResourcesMap = updateResourceInResourcesMap (
187- resourcesMap ,
232+ updatedResourcesMap ,
188233 originalResource ,
189234 resource . yaml ,
190235 ) ;
191- } else if ( ! originalResource && resource ) {
192- updatedResourcesMap = addResourceToResourcesMap ( resourcesMap , resource ) ;
193236 }
194237
195- if ( ! updatedResourcesMap ) {
196- throw new Error ( 'Resources map never updated' ) ;
238+ if ( addResource ) {
239+ updatedResourcesMap = addResourceToResourcesMap (
240+ updatedResourcesMap ,
241+ resource ,
242+ ) ;
197243 }
198244
199245 onUpdatedResourcesMap ( updatedResourcesMap ) ;
0 commit comments