@@ -15,17 +15,21 @@ import { extLogger, TeeLogger } from "../common";
1515import { CoreCompletedQuery , QueryRunner } from "../queryRunner" ;
1616import { qlpackOfDatabase } from "../contextual/queryResolver" ;
1717import { file } from "tmp-promise" ;
18- import { writeFile } from "fs-extra" ;
19- import { dump } from "js-yaml" ;
18+ import { readFile , writeFile } from "fs-extra" ;
19+ import { dump as dumpYaml , load as loadYaml } from "js-yaml" ;
2020import {
2121 getOnDiskWorkspaceFolders ,
2222 showAndLogExceptionWithTelemetry ,
23+ showAndLogWarningMessage ,
2324} from "../helpers" ;
2425import { DatabaseItem } from "../local-databases" ;
2526import { CodeQLCliServer } from "../cli" ;
26- import { assertNever , asError , getErrorMessage } from "../pure/helpers-pure" ;
27+ import { asError , assertNever , getErrorMessage } from "../pure/helpers-pure" ;
2728import { decodeBqrsToExternalApiUsages } from "./bqrs" ;
2829import { redactableError } from "../pure/errors" ;
30+ import { createDataExtensionYaml , loadDataExtensionYaml } from "./yaml" ;
31+ import { ExternalApiUsage } from "./external-api-usage" ;
32+ import { ModeledMethod } from "./modeled-method" ;
2933
3034export class DataExtensionsEditorView extends AbstractWebview <
3135 ToDataExtensionsEditorMessage ,
@@ -70,8 +74,11 @@ export class DataExtensionsEditorView extends AbstractWebview<
7074 await this . onWebViewLoaded ( ) ;
7175
7276 break ;
73- case "applyDataExtensionYaml" :
74- await this . saveYaml ( msg . yaml ) ;
77+ case "saveModeledMethods" :
78+ await this . saveModeledMethods (
79+ msg . externalApiUsages ,
80+ msg . modeledMethods ,
81+ ) ;
7582 await this . loadExternalApiUsages ( ) ;
7683
7784 break ;
@@ -83,20 +90,57 @@ export class DataExtensionsEditorView extends AbstractWebview<
8390 protected async onWebViewLoaded ( ) {
8491 super . onWebViewLoaded ( ) ;
8592
86- await this . loadExternalApiUsages ( ) ;
93+ await Promise . all ( [
94+ this . loadExternalApiUsages ( ) ,
95+ this . loadExistingModeledMethods ( ) ,
96+ ] ) ;
8797 }
8898
89- protected async saveYaml ( yaml : string ) : Promise < void > {
99+ protected async saveModeledMethods (
100+ externalApiUsages : ExternalApiUsage [ ] ,
101+ modeledMethods : Record < string , ModeledMethod > ,
102+ ) : Promise < void > {
90103 const modelFilename = this . calculateModelFilename ( ) ;
91104 if ( ! modelFilename ) {
92105 return ;
93106 }
94107
108+ const yaml = createDataExtensionYaml ( externalApiUsages , modeledMethods ) ;
109+
95110 await writeFile ( modelFilename , yaml ) ;
96111
97112 void extLogger . log ( `Saved data extension YAML to ${ modelFilename } ` ) ;
98113 }
99114
115+ protected async loadExistingModeledMethods ( ) : Promise < void > {
116+ const modelFilename = this . calculateModelFilename ( ) ;
117+ if ( ! modelFilename ) {
118+ return ;
119+ }
120+
121+ try {
122+ const yaml = await readFile ( modelFilename , "utf8" ) ;
123+
124+ const data = loadYaml ( yaml , {
125+ filename : modelFilename ,
126+ } ) ;
127+
128+ const existingModeledMethods = loadDataExtensionYaml ( data ) ;
129+
130+ if ( ! existingModeledMethods ) {
131+ void showAndLogWarningMessage ( "Failed to parse data extension YAML." ) ;
132+ return ;
133+ }
134+
135+ await this . postMessage ( {
136+ t : "setExistingModeledMethods" ,
137+ existingModeledMethods,
138+ } ) ;
139+ } catch ( e : unknown ) {
140+ void extLogger . log ( `Unable to read data extension YAML: ${ e } ` ) ;
141+ }
142+ }
143+
100144 protected async loadExternalApiUsages ( ) : Promise < void > {
101145 try {
102146 const queryResult = await this . runQuery ( ) ;
@@ -165,7 +209,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
165209 } ,
166210 } ) ;
167211 }
168- await writeFile ( suiteFile , dump ( suiteYaml ) , "utf8" ) ;
212+ await writeFile ( suiteFile , dumpYaml ( suiteYaml ) , "utf8" ) ;
169213
170214 const queries = await this . cliServer . resolveQueriesInSuite (
171215 suiteFile ,
0 commit comments