@@ -16,11 +16,12 @@ import { extLogger, TeeLogger } from "../common";
1616import { CoreCompletedQuery , QueryRunner } from "../queryRunner" ;
1717import { qlpackOfDatabase } from "../contextual/queryResolver" ;
1818import { file } from "tmp-promise" ;
19- import { writeFile } from "fs-extra" ;
20- import { dump } from "js-yaml" ;
19+ import { readFile , writeFile } from "fs-extra" ;
20+ import { dump as dumpYaml , load as loadYaml } from "js-yaml" ;
2121import {
2222 getOnDiskWorkspaceFolders ,
2323 showAndLogExceptionWithTelemetry ,
24+ showAndLogWarningMessage ,
2425} from "../helpers" ;
2526import { DatabaseItem } from "../local-databases" ;
2627import { CodeQLCliServer } from "../cli" ;
@@ -29,6 +30,9 @@ import { ResolvableLocationValue } from "../pure/bqrs-cli-types";
2930import { showResolvableLocation } from "../interface-utils" ;
3031import { decodeBqrsToExternalApiUsages } from "./bqrs" ;
3132import { redactableError } from "../pure/errors" ;
33+ import { createDataExtensionYaml , loadDataExtensionYaml } from "./yaml" ;
34+ import { ExternalApiUsage } from "./external-api-usage" ;
35+ import { ModeledMethod } from "./modeled-method" ;
3236
3337export class DataExtensionsEditorView extends AbstractWebview <
3438 ToDataExtensionsEditorMessage ,
@@ -77,8 +81,11 @@ export class DataExtensionsEditorView extends AbstractWebview<
7781 await this . jumpToUsage ( msg . location ) ;
7882
7983 break ;
80- case "applyDataExtensionYaml" :
81- await this . saveYaml ( msg . yaml ) ;
84+ case "saveModeledMethods" :
85+ await this . saveModeledMethods (
86+ msg . externalApiUsages ,
87+ msg . modeledMethods ,
88+ ) ;
8289 await this . loadExternalApiUsages ( ) ;
8390
8491 break ;
@@ -90,7 +97,10 @@ export class DataExtensionsEditorView extends AbstractWebview<
9097 protected async onWebViewLoaded ( ) {
9198 super . onWebViewLoaded ( ) ;
9299
93- await this . loadExternalApiUsages ( ) ;
100+ await Promise . all ( [
101+ this . loadExternalApiUsages ( ) ,
102+ this . loadExistingModeledMethods ( ) ,
103+ ] ) ;
94104 }
95105
96106 protected async jumpToUsage (
@@ -113,17 +123,51 @@ export class DataExtensionsEditorView extends AbstractWebview<
113123 }
114124 }
115125
116- protected async saveYaml ( yaml : string ) : Promise < void > {
126+ protected async saveModeledMethods (
127+ externalApiUsages : ExternalApiUsage [ ] ,
128+ modeledMethods : Record < string , ModeledMethod > ,
129+ ) : Promise < void > {
117130 const modelFilename = this . calculateModelFilename ( ) ;
118131 if ( ! modelFilename ) {
119132 return ;
120133 }
121134
135+ const yaml = createDataExtensionYaml ( externalApiUsages , modeledMethods ) ;
136+
122137 await writeFile ( modelFilename , yaml ) ;
123138
124139 void extLogger . log ( `Saved data extension YAML to ${ modelFilename } ` ) ;
125140 }
126141
142+ protected async loadExistingModeledMethods ( ) : Promise < void > {
143+ const modelFilename = this . calculateModelFilename ( ) ;
144+ if ( ! modelFilename ) {
145+ return ;
146+ }
147+
148+ try {
149+ const yaml = await readFile ( modelFilename , "utf8" ) ;
150+
151+ const data = loadYaml ( yaml , {
152+ filename : modelFilename ,
153+ } ) ;
154+
155+ const existingModeledMethods = loadDataExtensionYaml ( data ) ;
156+
157+ if ( ! existingModeledMethods ) {
158+ void showAndLogWarningMessage ( "Failed to parse data extension YAML." ) ;
159+ return ;
160+ }
161+
162+ await this . postMessage ( {
163+ t : "setExistingModeledMethods" ,
164+ existingModeledMethods,
165+ } ) ;
166+ } catch ( e : unknown ) {
167+ void extLogger . log ( `Unable to read data extension YAML: ${ e } ` ) ;
168+ }
169+ }
170+
127171 protected async loadExternalApiUsages ( ) : Promise < void > {
128172 try {
129173 const queryResult = await this . runQuery ( ) ;
@@ -192,7 +236,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
192236 } ,
193237 } ) ;
194238 }
195- await writeFile ( suiteFile , dump ( suiteYaml ) , "utf8" ) ;
239+ await writeFile ( suiteFile , dumpYaml ( suiteYaml ) , "utf8" ) ;
196240
197241 const queries = await this . cliServer . resolveQueriesInSuite (
198242 suiteFile ,
0 commit comments