66 window ,
77 workspace ,
88} from "vscode" ;
9+ import { join } from "path" ;
910import { RequestError } from "@octokit/request-error" ;
1011import {
1112 AbstractWebview ,
@@ -21,7 +22,7 @@ import {
2122 showAndLogExceptionWithTelemetry ,
2223 showAndLogErrorMessage ,
2324} from "../common/logging" ;
24- import { outputFile , pathExists , readFile } from "fs-extra" ;
25+ import { outputFile , readFile } from "fs-extra" ;
2526import { load as loadYaml } from "js-yaml" ;
2627import { DatabaseItem , DatabaseManager } from "../databases/local-databases" ;
2728import { CodeQLCliServer } from "../codeql-cli/cli" ;
@@ -34,17 +35,22 @@ import { showResolvableLocation } from "../databases/local-databases/locations";
3435import { decodeBqrsToExternalApiUsages } from "./bqrs" ;
3536import { redactableError } from "../common/errors" ;
3637import { readQueryResults , runQuery } from "./external-api-usage-query" ;
37- import { createDataExtensionYaml , loadDataExtensionYaml } from "./yaml" ;
38+ import {
39+ createDataExtensionYamlsPerLibrary ,
40+ createFilenameForLibrary ,
41+ loadDataExtensionYaml ,
42+ } from "./yaml" ;
3843import { ExternalApiUsage } from "./external-api-usage" ;
3944import { ModeledMethod } from "./modeled-method" ;
40- import { ExtensionPackModelFile } from "./shared/extension-pack" ;
45+ import { ExtensionPack } from "./shared/extension-pack" ;
4146import { autoModel , ModelRequest , ModelResponse } from "./auto-model-api" ;
4247import {
4348 createAutoModelRequest ,
4449 parsePredictedClassifications ,
4550} from "./auto-model" ;
4651import { showLlmGeneration } from "../config" ;
4752import { getAutoModelUsages } from "./auto-model-usages-query" ;
53+ import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders" ;
4854
4955export class DataExtensionsEditorView extends AbstractWebview <
5056 ToDataExtensionsEditorMessage ,
@@ -58,7 +64,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
5864 private readonly queryRunner : QueryRunner ,
5965 private readonly queryStorageDir : string ,
6066 private readonly databaseItem : DatabaseItem ,
61- private readonly modelFile : ExtensionPackModelFile ,
67+ private readonly extensionPack : ExtensionPack ,
6268 ) {
6369 super ( ctx ) ;
6470 }
@@ -95,13 +101,18 @@ export class DataExtensionsEditorView extends AbstractWebview<
95101 case "openExtensionPack" :
96102 await this . app . commands . execute (
97103 "revealInExplorer" ,
98- Uri . file ( this . modelFile . extensionPack . path ) ,
104+ Uri . file ( this . extensionPack . path ) ,
99105 ) ;
100106
101107 break ;
102108 case "openModelFile" :
103109 await window . showTextDocument (
104- await workspace . openTextDocument ( this . modelFile . filename ) ,
110+ await workspace . openTextDocument (
111+ join (
112+ this . extensionPack . path ,
113+ createFilenameForLibrary ( msg . library ) ,
114+ ) ,
115+ ) ,
105116 ) ;
106117
107118 break ;
@@ -147,8 +158,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
147158 await this . postMessage ( {
148159 t : "setDataExtensionEditorViewState" ,
149160 viewState : {
150- extensionPackModelFile : this . modelFile ,
151- modelFileExists : await pathExists ( this . modelFile . filename ) ,
161+ extensionPack : this . extensionPack ,
152162 showLlmButton : showLlmGeneration ( ) ,
153163 } ,
154164 } ) ;
@@ -178,39 +188,55 @@ export class DataExtensionsEditorView extends AbstractWebview<
178188 externalApiUsages : ExternalApiUsage [ ] ,
179189 modeledMethods : Record < string , ModeledMethod > ,
180190 ) : Promise < void > {
181- const yaml = createDataExtensionYaml (
191+ const yamls = createDataExtensionYamlsPerLibrary (
182192 this . databaseItem . language ,
183193 externalApiUsages ,
184194 modeledMethods ,
185195 ) ;
186196
187- await outputFile ( this . modelFile . filename , yaml ) ;
197+ for ( const [ filename , yaml ] of Object . entries ( yamls ) ) {
198+ await outputFile ( join ( this . extensionPack . path , filename ) , yaml ) ;
199+ }
188200
189- void this . app . logger . log (
190- `Saved data extension YAML to ${ this . modelFile . filename } ` ,
191- ) ;
201+ void this . app . logger . log ( `Saved data extension YAML` ) ;
192202 }
193203
194204 protected async loadExistingModeledMethods ( ) : Promise < void > {
195205 try {
196- if ( ! ( await pathExists ( this . modelFile . filename ) ) ) {
197- return ;
206+ const extensions = await this . cliServer . resolveExtensions (
207+ this . extensionPack . path ,
208+ getOnDiskWorkspaceFolders ( ) ,
209+ ) ;
210+
211+ const modelFiles = new Set < string > ( ) ;
212+
213+ if ( this . extensionPack . path in extensions . data ) {
214+ for ( const extension of extensions . data [ this . extensionPack . path ] ) {
215+ modelFiles . add ( extension . file ) ;
216+ }
198217 }
199218
200- const yaml = await readFile ( this . modelFile . filename , "utf8" ) ;
219+ const existingModeledMethods : Record < string , ModeledMethod > = { } ;
201220
202- const data = loadYaml ( yaml , {
203- filename : this . modelFile . filename ,
204- } ) ;
221+ for ( const modelFile of modelFiles ) {
222+ const yaml = await readFile ( modelFile , "utf8" ) ;
205223
206- const existingModeledMethods = loadDataExtensionYaml ( data ) ;
224+ const data = loadYaml ( yaml , {
225+ filename : modelFile ,
226+ } ) ;
207227
208- if ( ! existingModeledMethods ) {
209- void showAndLogErrorMessage (
210- this . app . logger ,
211- `Failed to parse data extension YAML ${ this . modelFile . filename } .` ,
212- ) ;
213- return ;
228+ const modeledMethods = loadDataExtensionYaml ( data ) ;
229+ if ( ! modeledMethods ) {
230+ void showAndLogErrorMessage (
231+ this . app . logger ,
232+ `Failed to parse data extension YAML ${ modelFile } .` ,
233+ ) ;
234+ continue ;
235+ }
236+
237+ for ( const [ key , value ] of Object . entries ( modeledMethods ) ) {
238+ existingModeledMethods [ key ] = value ;
239+ }
214240 }
215241
216242 await this . postMessage ( {
@@ -220,9 +246,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
220246 } catch ( e : unknown ) {
221247 void showAndLogErrorMessage (
222248 this . app . logger ,
223- `Unable to read data extension YAML ${
224- this . modelFile . filename
225- } : ${ getErrorMessage ( e ) } `,
249+ `Unable to read data extension YAML: ${ getErrorMessage ( e ) } ` ,
226250 ) ;
227251 }
228252 }
0 commit comments