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));
        }
Example #2
0
        private static bool TryFindCompilerMetadata(out MethodInfo linkBackInfo, out IFunctionCompilerMetadata findConfiguration)
        {
            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
            linkBackInfo      = null;
            findConfiguration = null;

            foreach (Assembly assembly in assemblies)
            {
                IFunctionCompilerMetadata configuration = FindCompilerMetadata(assembly);
                if (configuration != null)
                {
                    {
                        findConfiguration = configuration;
                        return(true);
                    }
                }

                string assemblyName = assembly.GetName().Name;
                if (assemblyName.EndsWith(".Functions.dll"))
                {
                    Type[] candidateReferenceLinkBackTypes = assembly.GetTypes()
                                                             .Where(x => x.Name == "ReferenceLinkBack" && x.IsAbstract && x.IsSealed).ToArray();
                    if (candidateReferenceLinkBackTypes.Length == 1)
                    {
                        if (candidateReferenceLinkBackTypes[0].GetCustomAttributes <ReferenceLinkBackAttribute>().Any())
                        {
                            linkBackInfo = candidateReferenceLinkBackTypes[0].GetMethod("ForceLinkBack");
                        }
                    }
                }
            }

            return(false);
        }
Example #3
0
        public static IFunctionCompilerMetadata FindCompilerMetadata(Assembly assembly)
        {
            if (assembly == null)
            {
                return(FindCompilerMetadata());
            }

            try
            {
                foreach (Type type in assembly.GetTypes())
                {
                    foreach (PropertyInfo propertyInfo in type.GetProperties(BindingFlags.Public | BindingFlags.Static))
                    {
                        if (propertyInfo.PropertyType == typeof(IFunctionCompilerMetadata))
                        {
                            IFunctionCompilerMetadata
                              metadata = (IFunctionCompilerMetadata)propertyInfo.GetValue(null);
                            return(metadata);
                        }
                    }
                }

                return(null);
            }
            catch (ReflectionTypeLoadException rex)
            {
                throw RaiseTypeLoadingException(rex);
            }
        }
Example #4
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));
        }
Example #5
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));
        }
Example #6
0
        public bool Compile()
        {
            string newAssemblyNamespace = $"{_configurationSourceAssembly.GetName().Name.Replace("-", "_")}.Functions";
            IFunctionCompilerMetadata functionCompilerMetadata = null;

            IFunctionAppConfiguration configuration  = null;
            FunctionAppHostBuilder    appHostBuilder = null;
            IFunctionAppHost          appHost        = ConfigurationLocator.FindFunctionAppHost(_configurationSourceAssembly);

            if (appHost != null)
            {
                appHostBuilder = new FunctionAppHostBuilder();
                appHost.Build(appHostBuilder);
                if (appHostBuilder.FunctionAppConfiguration != null)
                {
                    configuration = (IFunctionAppConfiguration)Activator.CreateInstance(appHostBuilder.FunctionAppConfiguration);
                }
            }

            if (configuration == null)
            {
                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);
                if (appHostBuilder != null)
                {
                    builder.Options = appHostBuilder.Options;
                }
                configuration.Build(builder);
                DefaultMediatorSettings.SetDefaultsIfRequired(builder);
                if (!ValidateCommandTypes(builder))
                {
                    return(false);
                }
                IMediatorResultTypeExtractor extractor = CreateMediatorResultTypeExtractor(builder.Options.MediatorResultTypeExtractor);
                if (extractor == null)
                {
                    return(false);
                }
                new PostBuildPatcher(extractor).Patch(builder, newAssemblyNamespace);
                if (!VerifyCommandAndResponseTypes(builder))
                {
                    return(false);
                }

                if (!VerifyOutputBindings(builder))
                {
                    return(false);
                }

                functionCompilerMetadata = new FunctionCompilerMetadata
                {
                    FunctionDefinitions        = builder.FunctionDefinitions,
                    OpenApiConfiguration       = builder.OpenApiConfiguration,
                    OutputAuthoredSourceFolder = builder.Options.OutputSourceTo,
                    CompilerOptions            = builder.Options
                };
            }

            PostBuildPatcher.EnsureFunctionsHaveUniqueNames(functionCompilerMetadata.FunctionDefinitions);

            IReadOnlyCollection <string> externalAssemblies =
                GetExternalAssemblyLocations(functionCompilerMetadata.FunctionDefinitions);

            ITargetCompiler targetCompiler = functionCompilerMetadata.CompilerOptions.HttpTarget == CompileTargetEnum.AzureFunctions
                ? (ITargetCompiler) new AzureFunctionsCompiler(_compilerLog)
                : new AspNetCoreCompiler(_compilerLog);

            return(targetCompiler.CompileAssets(functionCompilerMetadata,
                                                newAssemblyNamespace,
                                                configuration,
                                                externalAssemblies,
                                                _outputBinaryFolder));
        }
Example #7
0
        public RuntimeInstance(Assembly functionAppConfigurationAssembly,
                               Action <IServiceCollection, ICommandRegistry> beforeServiceProviderBuild,
                               IServiceCollection serviceCollection)
        {
            if (serviceCollection == null)
            {
                System.Console.WriteLine("No service collection supplied by runtime");
            }
            ServiceCollection    = serviceCollection ?? new ServiceCollection();
            BuiltServiceProvider = new Lazy <IServiceProvider>(() => ServiceCollection.BuildServiceProvider());

            FunctionAppHostBuilder    appHostBuilder = null;
            IFunctionAppConfiguration configuration  = null;
            IFunctionAppHost          appHost        = ConfigurationLocator.FindFunctionAppHost(functionAppConfigurationAssembly);

            if (appHost != null)
            {
                appHostBuilder = new FunctionAppHostBuilder();
                appHost.Build(appHostBuilder);
                if (appHostBuilder.FunctionAppConfiguration != null)
                {
                    configuration = (IFunctionAppConfiguration)Activator.CreateInstance(appHostBuilder.FunctionAppConfiguration);
                }
            }

            if (configuration == null)
            {
                configuration = ConfigurationLocator.FindConfiguration(functionAppConfigurationAssembly);
            }

            CommandingDependencyResolverAdapter adapter = new CommandingDependencyResolverAdapter(
                (fromType, toInstance) => ServiceCollection.AddSingleton(fromType, toInstance),
                (fromType, toType) => ServiceCollection.AddTransient(fromType, toType),
                resolveType => ServiceProvider.GetService(resolveType)
                );

            ICommandRegistry commandRegistry;

            // ReSharper disable once SuspiciousTypeConversion.Global - externally provided
            if (configuration != null && configuration is ICommandingConfigurator commandingConfigurator)
            {
                commandRegistry = commandingConfigurator.AddCommanding(adapter);
            }
            else
            {
                CommandingRuntime commandingRuntime = new CommandingRuntime();
                commandRegistry = commandingRuntime.AddCommanding(adapter);
            }

            // Register internal implementations
            RegisterInternalImplementations();

            FunctionHostBuilder       builder = null;
            IFunctionCompilerMetadata functionCompilerMetadata = null;
            CompileTargetEnum         compileTarget;

            if (configuration != null)
            {
                // Invoke the builder process
                builder = CreateBuilderFromConfiguration(commandRegistry, configuration);
                if (appHostBuilder != null)
                {
                    builder.Options = appHostBuilder.Options;
                }
                FunctionBuilder functionBuilder = (FunctionBuilder)builder.FunctionBuilder;
                FunctionDefinitions = builder.FunctionDefinitions;
                compileTarget       = builder.Options.HttpTarget;
                SetupAuthorization(builder, functionBuilder);
            }
            else
            {
                functionCompilerMetadata = LocateFunctionCompilerMetadata(functionAppConfigurationAssembly);
                FunctionDefinitions      = functionCompilerMetadata.FunctionDefinitions;
                compileTarget            = functionCompilerMetadata.CompilerOptions.HttpTarget;
            }

            PostBuildPatcher.EnsureFunctionsHaveUniqueNames(FunctionDefinitions);

            RegisterCoreDependencies(builder?.MediatorType ?? typeof(DefaultMediatorDecorator), FunctionDefinitions, compileTarget);

            RegisterTimerCommandFactories(FunctionDefinitions);

            RegisterHttpDependencies(FunctionDefinitions);

            RegisterCosmosDependencies(FunctionDefinitions);

            RegisterOutputBindingDependencies(FunctionDefinitions);


            CreatePluginFunctions(functionCompilerMetadata?.ClaimsMappings, FunctionDefinitions);

            RegisterLoggerIfRequired();
        }
Example #8
0
        private IFunctionCompilerMetadata LocateFunctionCompilerMetadata(Assembly functionAppConfigurationAssembly)
        {
            IFunctionCompilerMetadata metadata = ConfigurationLocator.FindCompilerMetadata(functionAppConfigurationAssembly);

            return(metadata);
        }
Example #9
0
        public RuntimeInstance(Assembly functionAppConfigurationAssembly,
                               Action <IServiceCollection, ICommandRegistry> beforeServiceProviderBuild,
                               IServiceCollection serviceCollection)
        {
            ServiceCollection    = serviceCollection ?? new ServiceCollection();
            BuiltServiceProvider = new Lazy <IServiceProvider>(() => ServiceCollection.BuildServiceProvider());

            // Find the configuration implementation and service collection
            IFunctionAppConfiguration configuration = LocateConfiguration(functionAppConfigurationAssembly);

            CommandingDependencyResolverAdapter adapter = new CommandingDependencyResolverAdapter(
                (fromType, toInstance) => ServiceCollection.AddSingleton(fromType, toInstance),
                (fromType, toType) => ServiceCollection.AddTransient(fromType, toType),
                resolveType => ServiceProvider.GetService(resolveType)
                );

            ICommandRegistry commandRegistry;

            // ReSharper disable once SuspiciousTypeConversion.Global - externally provided
            if (configuration != null && configuration is ICommandingConfigurator commandingConfigurator)
            {
                commandRegistry = commandingConfigurator.AddCommanding(adapter);
            }
            else
            {
                CommandingRuntime commandingRuntime = new CommandingRuntime();
                commandRegistry = commandingRuntime.AddCommanding(adapter);
            }

            // Register internal implementations
            RegisterInternalImplementations();

            FunctionHostBuilder       builder = null;
            IFunctionCompilerMetadata functionCompilerMetadata = null;

            if (configuration != null)
            {
                // Invoke the builder process
                builder = CreateBuilderFromConfiguration(commandRegistry, configuration);
                FunctionBuilder functionBuilder = (FunctionBuilder)builder.FunctionBuilder;
                FunctionDefinitions = builder.FunctionDefinitions;

                SetupAuthorization(builder, functionBuilder);
            }
            else
            {
                functionCompilerMetadata = LocateFunctionCompilerMetadata(functionAppConfigurationAssembly);
                FunctionDefinitions      = functionCompilerMetadata.FunctionDefinitions;
            }

            RegisterCoreDependencies(FunctionDefinitions);

            RegisterTimerCommandFactories(FunctionDefinitions);

            RegisterHttpDependencies(FunctionDefinitions);

            RegisterCosmosDependencies(FunctionDefinitions);

            CreatePluginFunctions(functionCompilerMetadata?.ClaimsMappings, FunctionDefinitions);

            //beforeServiceProviderBuild?.Invoke(ServiceCollection, commandRegistry);
            //ServiceProvider = containerProvider.CreateServiceProvider(ServiceCollection);
            //afterServiceProviderBuild?.Invoke(ServiceProvider, commandRegistry);

            //builder?.ServiceProviderCreatedAction?.Invoke(ServiceProvider);
        }