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));
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        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);
            }
        }