public NodeInvocationService(
            INodeJSService nodeJsService,
            ReactConfiguration configuration,
            IEmbeddedResourcesService embeddedResourcesService,
            IOptions <NodeJSProcessOptions> nodeJsProcessOptions,
            IServiceScopeFactory serviceScopeFactory)
        {
            _nodeJsService            = nodeJsService;
            _embeddedResourcesService = embeddedResourcesService;

            using (IServiceScope scope = serviceScopeFactory.CreateScope())
            {
                IServiceProvider serviceProvider = scope.ServiceProvider;

                IHostingEnvironment hostingEnvironment = serviceProvider.GetService <IHostingEnvironment>();

                var requireFiles = configuration.ScriptFilesWithoutTransform
                                   .Select(relativePath =>
                {
                    if (relativePath.StartsWith(nodeJsProcessOptions.Value.ProjectPath))
                    {
                        return(relativePath);
                    }

                    relativePath = relativePath.TrimStart('~').TrimStart('/');

                    return(Path.GetFullPath(Path.Combine(hostingEnvironment?.WebRootPath ?? nodeJsProcessOptions.Value.ProjectPath, relativePath)));
                });

                //TODO: do this in configure
                nodeJsProcessOptions.Value.EnvironmentVariables.Add("NODEREACT_REQUIREFILES", string.Join(',', requireFiles));
            }
        }
        public static IServiceCollection AddNodeReact(this IServiceCollection services, Action <ReactConfiguration> configuration = null)
        {
            var config = new ReactConfiguration();

            configuration?.Invoke(config);

            services.AddSingleton(config);

            services.AddSingleton <IComponentNameInvalidator, ComponentNameInvalidator>();
            services.AddSingleton <IReactIdGenerator, ReactIdGenerator>();
            services.AddSingleton <INodeInvocationService, NodeInvocationService>();


            services.AddNodeJS();
            services.Configure <NodeJSProcessOptions>(options =>
            {
                config.ConfigureNodeJSProcessOptions?.Invoke(options);

                options.EnvironmentVariables.Add("NODEREACT_MINWORKERS", config.StartEngines.ToString());
                options.EnvironmentVariables.Add("NODEREACT_MAXWORKERS", config.MaxEngines.ToString());
                options.EnvironmentVariables.Add("NODEREACT_MAXUSAGESPERFWORKER", config.MaxUsagesPerEngine.ToString());
            });
            services.Configure <OutOfProcessNodeJSServiceOptions>(options => config.ConfigureOutOfProcessNodeJSServiceOptions?.Invoke(options));

            services.Replace(new ServiceDescriptor(
                                 typeof(IJsonService),
                                 typeof(CustomJsonService),
                                 ServiceLifetime.Singleton));

            services.AddScoped <IReactScopedContext, ReactScopedContext>();

            services.AddTransient <ReactComponent>();
            services.AddTransient <ReactRouterComponent>();

            return(services);
        }