@@ -40,8 +40,13 @@ import type { Method } from "./method";
4040import type { ModeledMethod } from "./modeled-method" ;
4141import type { ExtensionPack } from "./shared/extension-pack" ;
4242import type { ModelConfigListener } from "../config" ;
43+ import { isCanary } from "../config" ;
4344import { Mode } from "./shared/mode" ;
44- import { loadModeledMethods , saveModeledMethods } from "./modeled-method-fs" ;
45+ import {
46+ GENERATED_MODELS_SUFFIX ,
47+ loadModeledMethods ,
48+ saveModeledMethods ,
49+ } from "./modeled-method-fs" ;
4550import { pickExtensionPack } from "./extension-pack-picker" ;
4651import type { QueryLanguage } from "../common/query-language" ;
4752import { getLanguageDisplayName } from "../common/query-language" ;
@@ -60,6 +65,10 @@ import { parseAccessPathSuggestionRowsToOptions } from "./suggestions-bqrs";
6065import { ModelEvaluator } from "./model-evaluator" ;
6166import type { ModelEvaluationRunState } from "./shared/model-evaluation-run-state" ;
6267import type { VariantAnalysisManager } from "../variant-analysis/variant-analysis-manager" ;
68+ import type { ModelExtensionFile } from "./model-extension-file" ;
69+ import { modelExtensionFileToYaml } from "./yaml" ;
70+ import { outputFile } from "fs-extra" ;
71+ import { join } from "path" ;
6372
6473export class ModelEditorView extends AbstractWebview <
6574 ToModelEditorMessage ,
@@ -645,14 +654,18 @@ export class ModelEditorView extends AbstractWebview<
645654 await runGenerateQueries ( {
646655 queryConstraints : modelGeneration . queryConstraints ( mode ) ,
647656 filterQueries : modelGeneration . filterQueries ,
648- parseResults : ( queryPath , results ) =>
649- modelGeneration . parseResults (
657+ onResults : async ( queryPath , results ) => {
658+ const modeledMethods = modelGeneration . parseResults (
650659 queryPath ,
651660 results ,
652661 modelsAsDataLanguage ,
653662 this . app . logger ,
654- ) ,
655- onResults : async ( modeledMethods ) => {
663+ {
664+ mode,
665+ isCanary : isCanary ( ) ,
666+ } ,
667+ ) ;
668+
656669 this . addModeledMethodsFromArray ( modeledMethods ) ;
657670 } ,
658671 cliServer : this . cliServer ,
@@ -678,15 +691,17 @@ export class ModelEditorView extends AbstractWebview<
678691
679692 protected async generateModeledMethodsOnStartup ( ) : Promise < void > {
680693 const mode = this . modelingStore . getMode ( this . databaseItem ) ;
681- if ( mode !== Mode . Framework ) {
694+ const modelsAsDataLanguage = getModelsAsDataLanguage ( this . language ) ;
695+ const autoModelGeneration = modelsAsDataLanguage . autoModelGeneration ;
696+
697+ if ( autoModelGeneration === undefined ) {
682698 return ;
683699 }
684700
685- const modelsAsDataLanguage = getModelsAsDataLanguage ( this . language ) ;
686- const modelGeneration = modelsAsDataLanguage . modelGeneration ;
687- const autoRun = modelGeneration ?. autoRun ;
688-
689- if ( modelGeneration === undefined || autoRun === undefined ) {
701+ if (
702+ autoModelGeneration . enabled &&
703+ ! autoModelGeneration . enabled ( { mode, isCanary : isCanary ( ) } )
704+ ) {
690705 return ;
691706 }
692707
@@ -698,22 +713,23 @@ export class ModelEditorView extends AbstractWebview<
698713 message : "Generating models" ,
699714 } ) ;
700715
701- const parseResults =
702- autoRun . parseResults ?? modelGeneration . parseResults ;
716+ const extensionFile : ModelExtensionFile = {
717+ extensions : [ ] ,
718+ } ;
703719
704720 try {
705721 await runGenerateQueries ( {
706- queryConstraints : modelGeneration . queryConstraints ( mode ) ,
707- filterQueries : modelGeneration . filterQueries ,
708- parseResults : ( queryPath , results ) =>
709- parseResults (
722+ queryConstraints : autoModelGeneration . queryConstraints ( mode ) ,
723+ filterQueries : autoModelGeneration . filterQueries ,
724+ onResults : ( queryPath , results ) => {
725+ const extensions = autoModelGeneration . parseResultsToYaml (
710726 queryPath ,
711727 results ,
712728 modelsAsDataLanguage ,
713729 this . app . logger ,
714- ) ,
715- onResults : async ( modeledMethods ) => {
716- this . addModeledMethodsFromArray ( modeledMethods ) ;
730+ ) ;
731+
732+ extensionFile . extensions . push ( ... extensions ) ;
717733 } ,
718734 cliServer : this . cliServer ,
719735 queryRunner : this . queryRunner ,
@@ -730,7 +746,25 @@ export class ModelEditorView extends AbstractWebview<
730746 asError ( e ) ,
731747 ) `Failed to auto-run generating models: ${ getErrorMessage ( e ) } ` ,
732748 ) ;
749+ return ;
733750 }
751+
752+ progress ( {
753+ step : 4000 ,
754+ maxStep : 4000 ,
755+ message : "Saving generated models" ,
756+ } ) ;
757+
758+ const fileContents = `# This file was automatically generated based from ${ this . databaseItem . name } . Manual changes will not persist.\n\n${ modelExtensionFileToYaml ( extensionFile ) } ` ;
759+ const filePath = join (
760+ this . extensionPack . path ,
761+ "models" ,
762+ `${ this . language } ${ GENERATED_MODELS_SUFFIX } ` ,
763+ ) ;
764+
765+ await outputFile ( filePath , fileContents ) ;
766+
767+ void this . app . logger . log ( `Saved generated model file to ${ filePath } ` ) ;
734768 } ,
735769 {
736770 cancellable : false ,
0 commit comments