@@ -28,9 +28,9 @@ internal class CreateFunctionAction : BaseAction
28
28
private readonly IUserInputHandler _userInputHandler ;
29
29
private readonly InitAction _initAction ;
30
30
private readonly ITemplatesManager _templatesManager ;
31
- private IEnumerable < Template > _templates ;
32
- private IEnumerable < NewTemplate > _newTemplates ;
33
- private IEnumerable < UserPrompt > _userPrompts ;
31
+ private readonly Lazy < IEnumerable < Template > > _templates ;
32
+ private readonly Lazy < IEnumerable < NewTemplate > > _newTemplates ;
33
+ private readonly Lazy < IEnumerable < UserPrompt > > _userPrompts ;
34
34
private WorkerRuntime _workerRuntime ;
35
35
36
36
public CreateFunctionAction ( ITemplatesManager templatesManager , ISecretsManager secretsManager , IContextHelpManager contextHelpManager )
@@ -40,6 +40,9 @@ public CreateFunctionAction(ITemplatesManager templatesManager, ISecretsManager
40
40
_contextHelpManager = contextHelpManager ;
41
41
_initAction = new InitAction ( _templatesManager , _secretsManager ) ;
42
42
_userInputHandler = new UserInputHandler ( _templatesManager ) ;
43
+ _templates = new Lazy < IEnumerable < Template > > ( ( ) => { return _templatesManager . Templates . Result ; } ) ;
44
+ _newTemplates = new Lazy < IEnumerable < NewTemplate > > ( ( ) => { return _templatesManager . NewTemplates . Result ; } ) ;
45
+ _userPrompts = new Lazy < IEnumerable < UserPrompt > > ( ( ) => { return _templatesManager . UserPrompts . Result ; } ) ;
43
46
}
44
47
45
48
public string Language { get ; set ; }
@@ -110,18 +113,8 @@ public override async Task RunAsync()
110
113
return ;
111
114
}
112
115
113
- // Ensure that the _templates are loaded before we proceed
114
- _templates = await _templatesManager . Templates ;
115
-
116
116
await UpdateLanguageAndRuntime ( ) ;
117
117
118
- // Depends on UpdateLanguageAndRuntime to set 'Language'
119
- if ( IsNewPythonProgrammingModel ( ) )
120
- {
121
- _newTemplates = await _templatesManager . NewTemplates ;
122
- _userPrompts = await _templatesManager . UserPrompts ;
123
- }
124
-
125
118
if ( WorkerRuntimeLanguageHelper . IsDotnet ( _workerRuntime ) && ! Csx )
126
119
{
127
120
if ( string . IsNullOrWhiteSpace ( TemplateName ) )
@@ -155,7 +148,7 @@ public override async Task RunAsync()
155
148
FileName = "function_app.py" ;
156
149
}
157
150
158
- var userPrompt = _userPrompts . First ( x => string . Equals ( x . Id , "app-selectedFileName" , StringComparison . OrdinalIgnoreCase ) ) ;
151
+ var userPrompt = _userPrompts . Value . First ( x => string . Equals ( x . Id , "app-selectedFileName" , StringComparison . OrdinalIgnoreCase ) ) ;
159
152
while ( ! _userInputHandler . ValidateResponse ( userPrompt , FileName ) )
160
153
{
161
154
_userInputHandler . PrintInputLabel ( userPrompt , PySteinFunctionAppPy ) ;
@@ -192,12 +185,7 @@ public override async Task RunAsync()
192
185
providedInputs [ GetFileNameParamId ] = FileName ;
193
186
}
194
187
195
- var template = _newTemplates . FirstOrDefault ( t => string . Equals ( t . Name , TemplateName , StringComparison . CurrentCultureIgnoreCase ) && string . Equals ( t . Language , Language , StringComparison . CurrentCultureIgnoreCase ) ) ;
196
-
197
- if ( template is null )
198
- {
199
- throw new CliException ( $ "Can't find template \" { TemplateName } \" in \" { Language } \" ") ;
200
- }
188
+ var template = _newTemplates . Value . FirstOrDefault ( t => string . Equals ( t . Name , TemplateName , StringComparison . CurrentCultureIgnoreCase ) && string . Equals ( t . Language , Language , StringComparison . CurrentCultureIgnoreCase ) ) ;
201
189
202
190
var templateJob = template . Jobs . Single ( x => x . Type . Equals ( jobName , StringComparison . OrdinalIgnoreCase ) ) ;
203
191
@@ -316,19 +304,18 @@ public async Task UpdateLanguageAndRuntime()
316
304
if ( _workerRuntime == WorkerRuntime . None )
317
305
{
318
306
SelectionMenuHelper . DisplaySelectionWizardPrompt ( "language" ) ;
319
- Language = SelectionMenuHelper . DisplaySelectionWizard ( _templates . Select ( t => t . Metadata . Language ) . Where ( l => ! l . Equals ( "python" , StringComparison . OrdinalIgnoreCase ) ) . Distinct ( ) ) ;
307
+ Language = SelectionMenuHelper . DisplaySelectionWizard ( _templates . Value . Select ( t => t . Metadata . Language ) . Where ( l => ! l . Equals ( "python" , StringComparison . OrdinalIgnoreCase ) ) . Distinct ( ) ) ;
320
308
_workerRuntime = WorkerRuntimeLanguageHelper . SetWorkerRuntime ( _secretsManager , Language ) ;
321
309
}
322
310
else if ( ! WorkerRuntimeLanguageHelper . IsDotnet ( _workerRuntime ) || Csx )
323
311
{
324
312
var languages = WorkerRuntimeLanguageHelper . LanguagesForWorker ( _workerRuntime ) ;
325
- var displayList = _templates ?
313
+ var displayList = _templates . Value
326
314
. Select ( t => t . Metadata . Language )
327
315
. Where ( l => languages . Contains ( l , StringComparer . OrdinalIgnoreCase ) )
328
316
. Distinct ( StringComparer . OrdinalIgnoreCase )
329
317
. ToArray ( ) ;
330
-
331
- if ( displayList ? . Length == 1 )
318
+ if ( displayList . Length == 1 )
332
319
{
333
320
Language = displayList . First ( ) ;
334
321
}
@@ -359,15 +346,15 @@ private IEnumerable<Template> GetLanguageTemplates(string templateLanguage, bool
359
346
if ( IsNewNodeJsProgrammingModel ( _workerRuntime ) ||
360
347
( forNewModelHelp && ( Languages . TypeScript . EqualsIgnoreCase ( templateLanguage ) || Languages . JavaScript . EqualsIgnoreCase ( templateLanguage ) ) ) )
361
348
{
362
- return _templates . Where ( t => t . Id . EndsWith ( "-4.x" ) && t . Metadata . Language . Equals ( templateLanguage , StringComparison . OrdinalIgnoreCase ) ) ;
349
+ return _templates . Value . Where ( t => t . Id . EndsWith ( "-4.x" ) && t . Metadata . Language . Equals ( templateLanguage , StringComparison . OrdinalIgnoreCase ) ) ;
363
350
}
364
351
else if ( _workerRuntime == WorkerRuntime . Node )
365
352
{
366
353
// Ensuring that we only show v3 templates for node when the user has not opted into the new model
367
- return _templates . Where ( t => ! t . Id . EndsWith ( "-4.x" ) && t . Metadata . Language . Equals ( templateLanguage , StringComparison . OrdinalIgnoreCase ) ) ;
354
+ return _templates . Value . Where ( t => ! t . Id . EndsWith ( "-4.x" ) && t . Metadata . Language . Equals ( templateLanguage , StringComparison . OrdinalIgnoreCase ) ) ;
368
355
}
369
356
370
- return _templates . Where ( t => t . Metadata . Language . Equals ( templateLanguage , StringComparison . OrdinalIgnoreCase ) ) ;
357
+ return _templates . Value . Where ( t => t . Metadata . Language . Equals ( templateLanguage , StringComparison . OrdinalIgnoreCase ) ) ;
371
358
}
372
359
373
360
private IEnumerable < string > GetTriggerNamesFromNewTemplates ( string templateLanguage , bool forNewModelHelp = false )
@@ -379,7 +366,7 @@ private IEnumerable<NewTemplate> GetNewTemplates(string templateLanguage, bool f
379
366
{
380
367
if ( IsNewPythonProgrammingModel ( ) || ( Languages . Python . EqualsIgnoreCase ( templateLanguage ) && forNewModelHelp ) )
381
368
{
382
- return _newTemplates . Where ( t => t . Language . Equals ( templateLanguage , StringComparison . OrdinalIgnoreCase ) ) ;
369
+ return _newTemplates . Value . Where ( t => t . Language . Equals ( templateLanguage , StringComparison . OrdinalIgnoreCase ) ) ;
383
370
}
384
371
385
372
throw new CliException ( "The new version of templates are only supported for Python." ) ;
@@ -527,9 +514,9 @@ private bool IsNewNodeJsProgrammingModel(WorkerRuntime workerRuntime)
527
514
{
528
515
if ( workerRuntime == WorkerRuntime . Node )
529
516
{
530
- if ( FileSystemHelpers . FileExists ( PackageJsonFileName ) )
517
+ if ( FileSystemHelpers . FileExists ( Constants . PackageJsonFileName ) )
531
518
{
532
- var packageJsonData = FileSystemHelpers . ReadAllTextFromFile ( PackageJsonFileName ) ;
519
+ var packageJsonData = FileSystemHelpers . ReadAllTextFromFile ( Constants . PackageJsonFileName ) ;
533
520
var packageJson = JsonConvert . DeserializeObject < JToken > ( packageJsonData ) ;
534
521
var funcPackageVersion = packageJson [ "dependencies" ] [ "@azure/functions" ] ;
535
522
if ( funcPackageVersion != null && new Regex ( "^[^0-9]*4" ) . IsMatch ( funcPackageVersion . ToString ( ) ) )
0 commit comments