// based on CreateRequestDelegate() https://github.com/aspnet/AspNetCore/blob/master/src/Middleware/StaticFiles/src/StaticFilesEndpointRouteBuilderExtensions.cs#L194
        private static RequestDelegate CreateProxyRequestDelegate(
            IEndpointRouteBuilder endpoints,
            SpaOptions options,
            string npmScript,
            int port = 8080,
            ScriptRunnerType runner = ScriptRunnerType.Npm,
            string regex = VueCliMiddleware.DefaultRegex)
        {
            if (endpoints == null) { throw new ArgumentNullException(nameof(endpoints)); }
            if (options == null) { throw new ArgumentNullException(nameof(options)); }
            if (npmScript == null) { throw new ArgumentNullException(nameof(npmScript)); }

            var app = endpoints.CreateApplicationBuilder();
            app.Use(next => context =>
            {
                // Set endpoint to null so the SPA middleware will handle the request.
                context.SetEndpoint(null);
                return next(context);
            });

            app.UseSpa(opt =>
            {
                if (options != null)
                {
                    opt.Options.DefaultPage = options.DefaultPage;
                    opt.Options.DefaultPageStaticFileOptions = options.DefaultPageStaticFileOptions;
                    opt.Options.SourcePath = options.SourcePath;
                    opt.Options.StartupTimeout = options.StartupTimeout;
                }
                opt.UseVueCli(npmScript, port, runner, regex);
            });

            return app.Build();
        }
Example #2
0
 public DefaultSpaBuilder(IApplicationBuilder application, Assembly assembly, SeedSpaOptions server, SpaOptions options)
 {
     _application = application;
     _server      = server;
     _options     = options;
     _assembly    = assembly;
 }
        private static (SpaOptions opts, IOptions <SpaOptions> options) SetupOptions()
        {
            var opts    = new SpaOptions();
            var options = Substitute.For <IOptions <SpaOptions> >();

            options.Value.Returns(opts);
            return(opts, options);
        }
Example #4
0
            public DefaultSpaBuilder(IApplicationBuilder applicationBuilder, SpaOptions options)
            {
                ApplicationBuilder = applicationBuilder
                                     ?? throw new ArgumentNullException(nameof(applicationBuilder));

                Options = options
                          ?? throw new ArgumentNullException(nameof(options));
            }
Example #5
0
 /// <summary>
 /// Constructs a new instance of <see cref="SpaOptions"/>.
 /// </summary>
 /// <param name="copyFromOptions">An instance of <see cref="SpaOptions"/> from which values should be copied.</param>
 internal SpaOptions(SpaOptions copyFromOptions)
 {
     _defaultPage                 = copyFromOptions.DefaultPage;
     _packageManagerCommand       = copyFromOptions.PackageManagerCommand;
     DefaultPageStaticFileOptions = copyFromOptions.DefaultPageStaticFileOptions;
     SourcePath    = copyFromOptions.SourcePath;
     DevServerPort = copyFromOptions.DevServerPort;
 }
 public AccountService(UserManager <TIdentity> userManager,
                       UrlEncoder urlEncoder,
                       SpaOptions spaOptions,
                       ILogger <AccountService <TIdentity> > logger)
 {
     _userManager = userManager;
     _urlEncoder  = urlEncoder;
     _spaOptions  = spaOptions;
     _logger      = logger;
 }
 public static IEndpointConventionBuilder MapToVueCliProxy(
     this IEndpointRouteBuilder endpoints,
     SpaOptions options,
     string npmScript        = "serve",
     int port                = 8080,
     ScriptRunnerType runner = ScriptRunnerType.Npm,
     string regex            = VueCliMiddleware.DefaultRegex)
 {
     return(endpoints.MapFallback("{*path}", CreateProxyRequestDelegate(endpoints, options, npmScript, port, runner, regex)));
 }
 public static IEndpointConventionBuilder MapToVueCliProxy(
     this IEndpointRouteBuilder endpoints,
     string pattern,
     SpaOptions options,
     string npmScript,
     int port = 8080,
     ScriptRunnerType runner = ScriptRunnerType.Npm,
     string regex = VueCliMiddleware.DefaultRegex)
 {
     if (pattern == null) { throw new ArgumentNullException(nameof(pattern)); }
     return endpoints.MapFallback(pattern, CreateProxyRequestDelegate(endpoints, options, npmScript, port, runner, regex));
 }
Example #9
0
            public DefaultSpaBuilder(IApplicationBuilder applicationBuilder, SpaOptions options)
            {
                // spa.Options.SourcePath = "ClientApp";
                ApplicationBuilder = applicationBuilder
                                     ?? throw new ArgumentNullException(nameof(applicationBuilder));

                /* if (env.IsDevelopment())
                 * {
                 *   spa.UseReactDevelopmentServer(npmScript: "start");
                 * }*/
                Options = options ?? throw new ArgumentNullException(nameof(options));
            }
 public SessionHandleService(IHttpContextAccessor httpContext,
                             HttpClient httpClient,
                             SchemeOwnerIdentityProviderOptions idpOptions,
                             SpaOptions spaOptions,
                             PartyDetailsOptions partyDetailsOptions)
 {
     _httpContext         = httpContext;
     _httpClient          = httpClient;
     _idpOptions          = idpOptions;
     _spaOptions          = spaOptions;
     _partyDetailsOptions = partyDetailsOptions;
 }
 public IdentityService(UserManager <AspNetUser> userManager,
                        ITenantUsersRepository usersRepository,
                        ITenantUserBuilder tenantUserBuilder,
                        IEmailClient emailClient,
                        EmailTemplatesData templateData,
                        ITemplateService templateService,
                        SpaOptions spaOptions,
                        ILogger <IIdentityService> logger)
     : base(usersRepository, userManager, logger, templateData, templateService, emailClient, spaOptions)
 {
     _tenantUserBuilder = tenantUserBuilder;
 }
        private static RequestDelegate CreateProxyRequestDelegate(
            IEndpointRouteBuilder endpoints,
            SpaOptions options,
            string npmScript        = "serve",
            int port                = 8080,
            ScriptRunnerType runner = ScriptRunnerType.Npm,
            string regex            = SpaCliMiddleware.DefaultRegex,
            bool forceKill          = false,
            bool useProxy           = true)
        {
            // based on CreateRequestDelegate() https://github.com/aspnet/AspNetCore/blob/master/src/Middleware/StaticFiles/src/StaticFilesEndpointRouteBuilderExtensions.cs#L194

            if (endpoints == null)
            {
                throw new ArgumentNullException(nameof(endpoints));
            }
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (npmScript == null)
            {
                throw new ArgumentNullException(nameof(npmScript));
            }

            var app = endpoints.CreateApplicationBuilder();

            app.Use(next => context =>
            {
                // Set endpoint to null so the SPA middleware will handle the request.
                context.SetEndpoint(null);
                return(next(context));
            });

            app.UseSpa(opt =>
            {
                if (options != null)
                {
                    opt.Options.DefaultPage = options.DefaultPage;
                    opt.Options.DefaultPageStaticFileOptions = options.DefaultPageStaticFileOptions;
                    opt.Options.SourcePath     = options.SourcePath;
                    opt.Options.StartupTimeout = options.StartupTimeout;
                }

                if (!string.IsNullOrWhiteSpace(npmScript))
                {
                    opt.UseSpaCli(npmScript, port, runner, regex, forceKill, useProxy);
                }
            });

            return(app.Build());
        }
Example #13
0
        private static void UseSpaWithoutIndexHtml(IApplicationBuilder app, Action <ISpaBuilder> configuration)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            // Use the options configured in DI (or blank if none was configured). We have to clone it
            // otherwise if you have multiple UseSpa calls, their configurations would interfere with one another.
            var optionsProvider = app.ApplicationServices.GetService <IOptions <SpaOptions> >();
            var options         = new SpaOptions();

            var spaBuilder = new DefaultSpaBuilder(app, options);

            configuration.Invoke(spaBuilder);
        }
Example #14
0
 public IdentityServiceBase(ITenantUsersRepository usersRepository,
                            UserManager <AspNetUser> userManager,
                            ILogger logger,
                            EmailTemplatesData templateData,
                            ITemplateService templateService,
                            IEmailClient emailClient,
                            SpaOptions spaOptions)
 {
     _usersRepository = usersRepository;
     _userManager     = userManager;
     _logger          = logger;
     _templateData    = templateData;
     _templateService = templateService;
     _emailClient     = emailClient;
     _spaOptions      = spaOptions;
 }
Example #15
0
        public WebRootAssetsResolver(IWebHostEnvironment env, IOptions <SpaOptions> options)
        {
            var files = env.WebRootFileProvider.GetDirectoryContents("/");

            string[] EnumerateFiles(string extension) => files.Where(_ => _.Name.EndsWith(extension)).Select(file => $"/{file.Name}").ToArray();

            var assetsList = new List <string>();

            assetsList.AddRange(EnumerateFiles(".css"));
            if (options.Value.IncludeScripts)
            {
                assetsList.AddRange(EnumerateFiles(".js"));
            }

            _assets  = assetsList.ToArray();
            _options = options.Value;
        }
 public static IEndpointConventionBuilder MapToSpaCliProxy(
     this IEndpointRouteBuilder endpoints,
     string pattern,
     SpaOptions options,
     string npmScript        = "serve",
     int port                = 8080,
     ScriptRunnerType runner = ScriptRunnerType.Npm,
     string regex            = SpaCliMiddleware.DefaultRegex,
     bool forceKill          = false,
     bool useProxy           = true)
 {
     if (pattern == null)
     {
         throw new ArgumentNullException(nameof(pattern));
     }
     return(endpoints.MapFallback(pattern, CreateProxyRequestDelegate(endpoints, options, npmScript, port, runner, regex, forceKill, useProxy)));
 }
        public static void UsePreactDevelopmentServer(
            this ISpaBuilder builder, string script)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            SpaOptions options = builder.Options;

            if (string.IsNullOrEmpty(options.SourcePath))
            {
                throw new InvalidOperationException($"To use {nameof(UsePreactDevelopmentServer)}, you must supply a non-empty value for the {nameof(SpaOptions.SourcePath)} property of {nameof(SpaOptions)} when calling {nameof(SpaApplicationBuilderExtensions.UseSpa)}.");
            }

            if (string.IsNullOrEmpty(script))
            {
                throw new InvalidOperationException(
                          $"You must specify a valid npm script name to start the development server");
            }

            PreactDevelopmentServerMiddleware.Attach(builder, script);
        }
        public async void RendererDefaultTest()
        {
            // arrange
            var nodeJsService     = Substitute.For <INodeJSService>();
            var opts              = new SpaOptions();
            var options           = Substitute.For <IOptions <SpaOptions> >();
            var telemetryProvider = Substitute.For <ITelemetryProvider>();
            var assetsResolver    = Substitute.For <IAssetsResolver>();
            var requestFeature    = Substitute.For <IHttpRequestFeature>();
            var context           = new DefaultHttpContext();

            // configure dependencies
            assetsResolver.ResolveAssets(context).Returns(new string[] { "asset" });
            telemetryProvider.GetCodeSnippet().Returns("snippet");
            options.Value.Returns(opts);

            // configure path
            requestFeature.RawTarget.Returns("/?params");

            context.Features.Set(requestFeature);
            context.Request.Scheme = "http";
            context.Request.Host   = new HostString("localhost:3000");

            var renderer = new JeringServerRenderer(nodeJsService, options, telemetryProvider, assetsResolver);

            const string expected = "<html></html>";
            var          json     = JsonSerializer.Serialize(new { html = expected });
            var          doc      = JsonDocument.Parse(json);

            nodeJsService.InvokeFromFileAsync <JsonElement>(opts.SsrScriptPath, "default", Arg.Any <object[]>())
            .Returns(Task.FromResult(doc.RootElement));

            // act
            var actual = await renderer.RenderHtmlPageAsync(context);

            // assert
            Assert.Equal(expected, actual);
        }
 public SpaRuntimeConfig(SpaOptions options)
 {
     AuthorityUrl = options.AuthorityUrl;
     ProductsUrl  = options.ProductsUrl;
 }