@@ -72,22 +72,25 @@ export function createDataExtensionYamls(
7272 databaseName : string ,
7373 language : string ,
7474 externalApiUsages : ExternalApiUsage [ ] ,
75- modeledMethods : Record < string , ModeledMethod > ,
75+ newModeledMethods : Record < string , ModeledMethod > ,
76+ existingModeledMethods : Record < string , Record < string , ModeledMethod > > ,
7677 mode : Mode ,
7778) {
7879 switch ( mode ) {
7980 case Mode . Application :
8081 return createDataExtensionYamlsForApplicationMode (
8182 language ,
8283 externalApiUsages ,
83- modeledMethods ,
84+ newModeledMethods ,
85+ existingModeledMethods ,
8486 ) ;
8587 case Mode . Framework :
8688 return createDataExtensionYamlsForFrameworkMode (
8789 databaseName ,
8890 language ,
8991 externalApiUsages ,
90- modeledMethods ,
92+ newModeledMethods ,
93+ existingModeledMethods ,
9194 ) ;
9295 default :
9396 assertNever ( mode ) ;
@@ -97,27 +100,51 @@ export function createDataExtensionYamls(
97100export function createDataExtensionYamlsForApplicationMode (
98101 language : string ,
99102 externalApiUsages : ExternalApiUsage [ ] ,
100- modeledMethods : Record < string , ModeledMethod > ,
103+ newModeledMethods : Record < string , ModeledMethod > ,
104+ existingModeledMethods : Record < string , Record < string , ModeledMethod > > ,
101105) : Record < string , string > {
102- const methodsByLibraryFilename : Record < string , ModeledMethod [ ] > = { } ;
103-
106+ const methodsByLibraryFilename : Record <
107+ string ,
108+ Record < string , ModeledMethod >
109+ > = { } ;
110+
111+ // We only want to generate a yaml file when it's a known external API usage
112+ // and there are new modeled methods for it. This avoids us overwriting other
113+ // files that may contain data we don't know about.
104114 for ( const externalApiUsage of externalApiUsages ) {
105- const modeledMethod = modeledMethods [ externalApiUsage . signature ] ;
106- if ( ! modeledMethod ) {
107- continue ;
115+ if ( externalApiUsage . signature in newModeledMethods ) {
116+ methodsByLibraryFilename [
117+ createFilenameForLibrary ( externalApiUsage . library )
118+ ] = { } ;
108119 }
120+ }
109121
110- const filename = createFilenameForLibrary ( externalApiUsage . library ) ;
122+ // First populate methodsByLibraryFilename with any existing modeled methods.
123+ for ( const [ filename , methods ] of Object . entries ( existingModeledMethods ) ) {
124+ if ( filename in methodsByLibraryFilename ) {
125+ for ( const [ signature , method ] of Object . entries ( methods ) ) {
126+ methodsByLibraryFilename [ filename ] [ signature ] = method ;
127+ }
128+ }
129+ }
111130
112- methodsByLibraryFilename [ filename ] =
113- methodsByLibraryFilename [ filename ] || [ ] ;
114- methodsByLibraryFilename [ filename ] . push ( modeledMethod ) ;
131+ // Add the new modeled methods, potentially overwriting existing modeled methods
132+ // but not removing existing modeled methods that are not in the new set.
133+ for ( const externalApiUsage of externalApiUsages ) {
134+ const method = newModeledMethods [ externalApiUsage . signature ] ;
135+ if ( method ) {
136+ const filename = createFilenameForLibrary ( externalApiUsage . library ) ;
137+ methodsByLibraryFilename [ filename ] [ method . signature ] = method ;
138+ }
115139 }
116140
117141 const result : Record < string , string > = { } ;
118142
119143 for ( const [ filename , methods ] of Object . entries ( methodsByLibraryFilename ) ) {
120- result [ filename ] = createDataExtensionYaml ( language , methods ) ;
144+ result [ filename ] = createDataExtensionYaml (
145+ language ,
146+ Object . values ( methods ) ,
147+ ) ;
121148 }
122149
123150 return result ;
@@ -127,7 +154,8 @@ export function createDataExtensionYamlsForFrameworkMode(
127154 databaseName : string ,
128155 language : string ,
129156 externalApiUsages : ExternalApiUsage [ ] ,
130- modeledMethods : Record < string , ModeledMethod > ,
157+ newModeledMethods : Record < string , ModeledMethod > ,
158+ existingModeledMethods : Record < string , Record < string , ModeledMethod > > ,
131159 prefix = "models/" ,
132160 suffix = ".model" ,
133161) : Record < string , string > {
@@ -136,16 +164,28 @@ export function createDataExtensionYamlsForFrameworkMode(
136164 . slice ( 1 )
137165 . map ( ( part ) => sanitizeExtensionPackName ( part ) )
138166 . join ( "-" ) ;
167+ const filename = `${ prefix } ${ libraryName } ${ suffix } .yml` ;
168+
169+ const methods : Record < string , ModeledMethod > = { } ;
170+
171+ // First populate methodsByLibraryFilename with any existing modeled methods.
172+ for ( const [ signature , method ] of Object . entries (
173+ existingModeledMethods [ filename ] || { } ,
174+ ) ) {
175+ methods [ signature ] = method ;
176+ }
139177
140- const methods = externalApiUsages
141- . map ( ( externalApiUsage ) => modeledMethods [ externalApiUsage . signature ] )
142- . filter ( ( modeledMethod ) => modeledMethod !== undefined ) ;
178+ // Add the new modeled methods, potentially overwriting existing modeled methods
179+ // but not removing existing modeled methods that are not in the new set.
180+ for ( const externalApiUsage of externalApiUsages ) {
181+ const modeledMethod = newModeledMethods [ externalApiUsage . signature ] ;
182+ if ( modeledMethod ) {
183+ methods [ modeledMethod . signature ] = modeledMethod ;
184+ }
185+ }
143186
144187 return {
145- [ `${ prefix } ${ libraryName } ${ suffix } .yml` ] : createDataExtensionYaml (
146- language ,
147- methods ,
148- ) ,
188+ [ filename ] : createDataExtensionYaml ( language , Object . values ( methods ) ) ,
149189 } ;
150190}
151191
0 commit comments