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