@@ -16,10 +16,11 @@ import { CoreCompletedQuery, QueryRunner } from "../queryRunner";
1616import { qlpackOfDatabase } from "../contextual/queryResolver" ;
1717import { file } from "tmp-promise" ;
1818import { readFile , writeFile } from "fs-extra" ;
19- import { dump , load } from "js-yaml" ;
19+ import { dump as dumpYaml , load as loadYaml } from "js-yaml" ;
2020import {
2121 getOnDiskWorkspaceFolders ,
2222 showAndLogExceptionWithTelemetry ,
23+ showAndLogWarningMessage ,
2324} from "../helpers" ;
2425import { DatabaseItem , DatabaseManager } from "../local-databases" ;
2526import { CodeQLCliServer } from "../cli" ;
@@ -29,6 +30,8 @@ import { promptImportGithubDatabase } from "../databaseFetcher";
2930import { App } from "../common/app" ;
3031import { decodeBqrsToExternalApiUsages } from "./bqrs" ;
3132import { redactableError } from "../pure/errors" ;
33+ import { createDataExtensionYaml , loadDataExtensionYaml } from "./yaml" ;
34+ import { ExternalApiUsage } from "./external-api-usage" ;
3235import { ModeledMethod } from "./modeled-method" ;
3336
3437export class DataExtensionsEditorView extends AbstractWebview <
@@ -76,8 +79,11 @@ export class DataExtensionsEditorView extends AbstractWebview<
7679 await this . onWebViewLoaded ( ) ;
7780
7881 break ;
79- case "applyDataExtensionYaml" :
80- await this . saveYaml ( msg . yaml ) ;
82+ case "saveModeledMethods" :
83+ await this . saveModeledMethods (
84+ msg . externalApiUsages ,
85+ msg . modeledMethods ,
86+ ) ;
8187 await this . loadExternalApiUsages ( ) ;
8288
8389 break ;
@@ -93,36 +99,51 @@ export class DataExtensionsEditorView extends AbstractWebview<
9399 protected async onWebViewLoaded ( ) {
94100 super . onWebViewLoaded ( ) ;
95101
96- await Promise . all ( [ this . loadExternalApiUsages ( ) , this . readExistingYaml ( ) ] ) ;
102+ await Promise . all ( [
103+ this . loadExternalApiUsages ( ) ,
104+ this . loadExistingModeledMethods ( ) ,
105+ ] ) ;
97106 }
98107
99- protected async saveYaml ( yaml : string ) : Promise < void > {
100- const modelFilename = this . modelFileName ;
108+ protected async saveModeledMethods (
109+ externalApiUsages : ExternalApiUsage [ ] ,
110+ modeledMethods : Record < string , ModeledMethod > ,
111+ ) : Promise < void > {
112+ const modelFilename = this . calculateModelFilename ( ) ;
101113 if ( ! modelFilename ) {
102114 return ;
103115 }
104116
117+ const yaml = createDataExtensionYaml ( externalApiUsages , modeledMethods ) ;
118+
105119 await writeFile ( modelFilename , yaml ) ;
106120
107121 void extLogger . log ( `Saved data extension YAML to ${ modelFilename } ` ) ;
108122 }
109123
110- protected async readExistingYaml ( ) : Promise < void > {
111- const modelFilename = this . modelFileName ;
124+ protected async loadExistingModeledMethods ( ) : Promise < void > {
125+ const modelFilename = this . calculateModelFilename ( ) ;
112126 if ( ! modelFilename ) {
113127 return ;
114128 }
115129
116130 try {
117131 const yaml = await readFile ( modelFilename , "utf8" ) ;
118132
119- const data = load ( yaml , {
133+ const data = loadYaml ( yaml , {
120134 filename : modelFilename ,
121135 } ) ;
122136
137+ const existingModeledMethods = loadDataExtensionYaml ( data ) ;
138+
139+ if ( ! existingModeledMethods ) {
140+ void showAndLogWarningMessage ( "Failed to parse data extension YAML." ) ;
141+ return ;
142+ }
143+
123144 await this . postMessage ( {
124- t : "setExistingYamlData " ,
125- data ,
145+ t : "setExistingModeledMethods " ,
146+ existingModeledMethods ,
126147 } ) ;
127148 } catch ( e : unknown ) {
128149 void extLogger . log ( `Unable to read data extension YAML: ${ e } ` ) ;
@@ -275,7 +296,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
275296 } ,
276297 } ) ;
277298 }
278- await writeFile ( suiteFile , dump ( suiteYaml ) , "utf8" ) ;
299+ await writeFile ( suiteFile , dumpYaml ( suiteYaml ) , "utf8" ) ;
279300
280301 const queries = await this . cliServer . resolveQueriesInSuite (
281302 suiteFile ,
@@ -354,7 +375,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
354375 } ) ;
355376 }
356377
357- private get modelFileName ( ) : string | undefined {
378+ private calculateModelFilename ( ) : string | undefined {
358379 const workspaceFolder = workspace . workspaceFolders ?. find (
359380 ( folder ) => folder . name === "ql" ,
360381 ) ;
0 commit comments