public bool CompileAssets(IFunctionCompilerMetadata functionCompilerMetadata, string newAssemblyNamespace, IFunctionAppConfiguration configuration, IReadOnlyCollection <string> externalAssemblies, string outputBinaryFolder) { HandlebarsHelpers.AzureFunctions.HandlebarsHelperRegistration.RegisterHelpers(); bool isFSharpProject = functionCompilerMetadata.FunctionDefinitions.Any(x => x.IsFunctionalFunction); if (isFSharpProject) { _compilerLog.Warning("FSharp output is currently experimental"); } OpenApiOutputModel openApi = _openApiCompiler.Compile(functionCompilerMetadata.OpenApiConfiguration, functionCompilerMetadata.FunctionDefinitions, outputBinaryFolder); _assemblyCompiler.OpenApiOutputModel = openApi; _jsonCompiler.Compile(functionCompilerMetadata.FunctionDefinitions, openApi, outputBinaryFolder, newAssemblyNamespace); return(_assemblyCompiler.Compile(functionCompilerMetadata.FunctionDefinitions, configuration?.GetType() ?? functionCompilerMetadata.BacklinkReferenceType, configuration != null ? null : functionCompilerMetadata.BacklinkPropertyInfo, newAssemblyNamespace, externalAssemblies, outputBinaryFolder, $"{newAssemblyNamespace}.dll", functionCompilerMetadata.CompilerOptions, functionCompilerMetadata.OutputAuthoredSourceFolder)); }
public bool Compile() { string newAssemblyNamespace = $"{_configurationSourceAssembly.GetName().Name.Replace("-", "_")}.Functions"; IFunctionCompilerMetadata functionCompilerMetadata = null; IFunctionAppConfiguration configuration = ConfigurationLocator.FindConfiguration(_configurationSourceAssembly); if (configuration == null) { functionCompilerMetadata = ConfigurationLocator.FindCompilerMetadata(_configurationSourceAssembly); if (functionCompilerMetadata == null) { _compilerLog.Error($"The assembly {_configurationSourceAssembly.GetName().Name} does not contain a public class implementing the IFunctionAppConfiguration interface"); return(false); } } else { FunctionHostBuilder builder = new FunctionHostBuilder(_serviceCollection, _commandRegistry, false); configuration.Build(builder); new PostBuildPatcher().Patch(builder, newAssemblyNamespace); if (!VerifyCommandAndResponseTypes(builder)) { return(false); } functionCompilerMetadata = new FunctionCompilerMetadata { FunctionDefinitions = builder.FunctionDefinitions, OpenApiConfiguration = builder.OpenApiConfiguration, OutputAuthoredSourceFolder = builder.OutputAuthoredSourceFolder }; } IReadOnlyCollection <string> externalAssemblies = GetExternalAssemblyLocations(functionCompilerMetadata.FunctionDefinitions); OpenApiOutputModel openApi = _openApiCompiler.Compile(functionCompilerMetadata.OpenApiConfiguration, functionCompilerMetadata.FunctionDefinitions, _outputBinaryFolder); _jsonCompiler.Compile(functionCompilerMetadata.FunctionDefinitions, openApi, _outputBinaryFolder, newAssemblyNamespace); return(_assemblyCompiler.Compile(functionCompilerMetadata.FunctionDefinitions, configuration?.GetType() ?? functionCompilerMetadata.BacklinkReferenceType, configuration != null ? null : functionCompilerMetadata.BacklinkPropertyInfo, newAssemblyNamespace, externalAssemblies, _outputBinaryFolder, $"{newAssemblyNamespace}.dll", openApi, _compileTarget, functionCompilerMetadata.OutputAuthoredSourceFolder)); }
public bool CompileAssets(IFunctionCompilerMetadata functionCompilerMetadata, string newAssemblyNamespace, IFunctionAppConfiguration configuration, IReadOnlyCollection <string> externalAssemblies, string outputBinaryFolder) { _compilerLog.Warning("ASP.Net Core output is currently experimental"); FunctionMonkey.Compiler.Core.HandlebarsHelpers.AspNetCore.HandlebarsHelperRegistration.RegisterHelpers(); OpenApiOutputModel openApi = _openApiCompiler.Compile(functionCompilerMetadata.OpenApiConfiguration, functionCompilerMetadata.FunctionDefinitions, outputBinaryFolder); _assemblyCompiler.OpenApiOutputModel = openApi; return(_assemblyCompiler.Compile(functionCompilerMetadata.FunctionDefinitions, configuration?.GetType() ?? functionCompilerMetadata.BacklinkReferenceType, configuration != null ? null : functionCompilerMetadata.BacklinkPropertyInfo, newAssemblyNamespace, externalAssemblies, outputBinaryFolder, $"{newAssemblyNamespace}.dll", functionCompilerMetadata.CompilerOptions, functionCompilerMetadata.OutputAuthoredSourceFolder)); }
public void Compile(IReadOnlyCollection <AbstractFunctionDefinition> functionDefinitions, OpenApiOutputModel openApiOutputModel, string outputBinaryFolder, string outputNamespaceName) { foreach (AbstractFunctionDefinition functionDefinition in functionDefinitions) { string templateSource = _templateProvider.GetJsonTemplate(functionDefinition); Func <object, string> template = Handlebars.Compile(templateSource); functionDefinition.AssemblyName = $"{outputNamespaceName}.dll"; functionDefinition.FunctionClassTypeName = $"{functionDefinition.Namespace}.{functionDefinition.Name}"; string json = template(functionDefinition); WriteFunctionTemplate(outputBinaryFolder, functionDefinition.Name, json); if (functionDefinition is CosmosDbFunctionDefinition cosmosDbFunctionDefinition) { if (cosmosDbFunctionDefinition.TrackRemainingWork) { TimerFunctionDefinition cosmosMonitorDefinition = new TimerFunctionDefinition(functionDefinition.CommandType) { AssemblyName = cosmosDbFunctionDefinition.AssemblyName, CommandDeserializerType = null, CommandType = null, CronExpression = cosmosDbFunctionDefinition.RemainingWorkCronExpression, FunctionClassTypeName = $"{functionDefinition.Namespace}.Monitor{functionDefinition.Name}" }; string timerTemplateSource = _templateProvider.GetJsonTemplate(cosmosMonitorDefinition); Func <object, string> timerTemplate = Handlebars.Compile(timerTemplateSource); string timerJson = timerTemplate(cosmosMonitorDefinition); WriteFunctionTemplate(outputBinaryFolder, $"Monitor{functionDefinition.Name}", timerJson); } } } if (openApiOutputModel != null && !string.IsNullOrWhiteSpace(openApiOutputModel.UserInterfaceRoute)) { string templateSource = _templateProvider.GetTemplate("swaggerui", "json"); Func <object, string> template = Handlebars.Compile(templateSource); string json = template(new { AssemblyFilename = $"{outputNamespaceName}.dll", Namespace = outputNamespaceName, OpenApiUserInterfaceRoute = openApiOutputModel.UserInterfaceRoute }); WriteFunctionTemplate(outputBinaryFolder, "OpenApiProvider", json); } if (openApiOutputModel != null && !string.IsNullOrWhiteSpace(openApiOutputModel.ReDocUserInterfaceRoute)) { string reDocTemplateSource = _templateProvider.GetTemplate("redocui", "json"); Func <object, string> reDocTemplate = Handlebars.Compile(reDocTemplateSource); string reDocJson = reDocTemplate(new { AssemblyFilename = $"{outputNamespaceName}.dll", Namespace = outputNamespaceName, ReDocUserInterfaceRoute = openApiOutputModel.ReDocUserInterfaceRoute }); WriteFunctionTemplate(outputBinaryFolder, "ReDocProvider", reDocJson); } { string templateSource = _templateProvider.GetTemplate("extensions", "json"); Func <object, string> template = Handlebars.Compile(templateSource); string json = template(new { AssemblyName = $"{outputNamespaceName}", Namespace = outputNamespaceName }); WriteExtensionsTemplate(outputBinaryFolder, json); } }