public void PrioritizedModuleLoaderExaminesAllModuleLoaders()
        {
            var script = @"
        import goodnightMoon from 'goodnight_moon';
        export default goodnightMoon;
        ";

            var inMemoryModuleLoader = new InMemoryModuleLoader();

            inMemoryModuleLoader.RegisterModule(new HelloWorldModule());

            var inMemoryModuleLoader1 = new InMemoryModuleLoader();

            inMemoryModuleLoader1.RegisterModule(new GoodnightMoonModule());

            var aggregateModuleLoader = new PrioritizedAggregateModuleLoader();

            aggregateModuleLoader.RegisterModuleLoader(inMemoryModuleLoader1, priority: 100);
            aggregateModuleLoader.RegisterModuleLoader(inMemoryModuleLoader, priority: 1);

            var baristaRuntime = GetRuntimeFactory(aggregateModuleLoader);

            using (var rt = baristaRuntime.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    var result = ctx.EvaluateModule(script);

                    Assert.Equal("Goodnight, moon.", result.ToString());
                }
            }
        }
Ejemplo n.º 2
0
        public void JsAggregateModuleLoaderPrefixesMustBeSpecified()
        {
            var inMemoryModuleLoader1 = new InMemoryModuleLoader();

            inMemoryModuleLoader1.RegisterModule(new HelloWorldModule());

            var inMemoryModuleLoader2 = new InMemoryModuleLoader();

            inMemoryModuleLoader2.RegisterModule(new GoodnightMoonModule());

            var aggregateModuleLoader = new PrefixedAggregateModuleLoader();

            Assert.Throws <ArgumentNullException>(() =>
            {
                aggregateModuleLoader.RegisterModuleLoader("", inMemoryModuleLoader1);
            });

            Assert.Throws <ArgumentNullException>(() =>
            {
                aggregateModuleLoader.RegisterModuleLoader(null, inMemoryModuleLoader2);
            });

            Assert.Throws <ArgumentNullException>(() =>
            {
                aggregateModuleLoader.RegisterModuleLoader("foobar", null);
            });
        }
        public void PrioritizedModuleLoaderUsesHigherPriorityModuleLoadersOverLowerPriority()
        {
            var script = @"
        import helloworld from 'hello_world';
        export default helloworld;
        ";

            var inMemoryModuleLoader = new InMemoryModuleLoader();

            inMemoryModuleLoader.RegisterModule(new HelloWorldModule());

            var inMemoryModuleLoader1 = new InMemoryModuleLoader();

            inMemoryModuleLoader1.RegisterModule(new AnotherHelloWorldModule());

            var aggregateModuleLoader = new PrioritizedAggregateModuleLoader();

            aggregateModuleLoader.RegisterModuleLoader(inMemoryModuleLoader1, priority: 100);
            aggregateModuleLoader.RegisterModuleLoader(inMemoryModuleLoader, priority: 1);

            var baristaRuntime = GetRuntimeFactory(aggregateModuleLoader);

            using (var rt = baristaRuntime.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    var result = ctx.EvaluateModule(script);

                    Assert.Equal("Hello, World!", result.ToString());
                }
            }
        }
Ejemplo n.º 4
0
        public void JsAggregateModuleLoaderReturnsFallbackModules()
        {
            var script = @"
        import helloworld from 'hello_world';
        export default helloworld;
        ";

            var inMemoryModuleLoader  = new InMemoryModuleLoader();
            var aggregateModuleLoader = new PrefixedAggregateModuleLoader
            {
                FallbackModuleLoader = inMemoryModuleLoader
            };

            inMemoryModuleLoader.RegisterModule(new HelloWorldModule());


            var baristaRuntime = GetRuntimeFactory(aggregateModuleLoader);

            using (var rt = baristaRuntime.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    var result = ctx.EvaluateModule(script);

                    Assert.Equal("Hello, World!", result.ToString());
                }
            }
        }
Ejemplo n.º 5
0
        public void JsAggregateModuleLoaderThrowsWhenWhitespacePrefixesAreUsed()
        {
            var script = @"
        import helloworld from '       !hello_world';
        export default helloworld;
        ";

            var inMemoryModuleLoader1 = new InMemoryModuleLoader();

            inMemoryModuleLoader1.RegisterModule(new HelloWorldModule());

            var aggregateModuleLoader = new PrefixedAggregateModuleLoader();

            Assert.Throws <ArgumentNullException>(() =>
            {
                aggregateModuleLoader.RegisterModuleLoader("       ", inMemoryModuleLoader1);
            });

            var baristaRuntime = GetRuntimeFactory(aggregateModuleLoader);

            using (var rt = baristaRuntime.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    Assert.Throws <JsScriptException>(() =>
                    {
                        var result = ctx.EvaluateModule(script);
                    });
                }
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Register BaristaCore services with the specified ServiceCollection.
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public static IServiceCollection AddBaristaCore(this IServiceCollection services, IBaristaModuleLoader moduleLoader = null)
        {
            if (moduleLoader == null)
            {
                moduleLoader = new InMemoryModuleLoader();
            }

            services.AddSingleton <IJavaScriptEngineFactory, ChakraCoreFactory>();
            services.AddSingleton((provider) =>
            {
                var jsEngineFactory = provider.GetRequiredService <IJavaScriptEngineFactory>();
                return(jsEngineFactory.CreateJavaScriptEngine());
            });
            services.AddSingleton(moduleLoader);
            services.AddSingleton <IBaristaValueFactoryBuilder, BaristaValueFactoryBuilder>();
            services.AddSingleton <IBaristaRuntimeFactory, BaristaRuntimeFactory>();

            //Conversion strategies must be transient, as they create objects tied to the context.
            services.AddTransient <IBaristaConversionStrategy, BaristaConversionStrategy>();
            services.AddTransient <IBaristaTypeConversionStrategy, BaristaTypeConversionStrategy>();

            services.AddTransient <IBaristaContextFactory, BaristaContextFactory>();
            services.AddTransient <IBaristaModuleRecordFactory, BaristaModuleRecordFactory>();
            services.AddTransient <IPromiseTaskQueue, PromiseTaskQueue>();

            return(services);
        }
Ejemplo n.º 7
0
        public static IBaristaModuleLoader Invoke(BrewOrder brewOrder, HttpRequest req)
        {
            //Set up the module loader for the request.
            var moduleLoader = new PrioritizedAggregateModuleLoader();

            //Register all the modules within the BaristaLabs.BaristaCore.Extensions assembly.
            moduleLoader.RegisterModuleLoader(new AssemblyModuleLoader(typeof(TypeScriptTranspiler).Assembly), 1);

            //Register modules needing context.
            var currentContextModule = new BaristaContextModule(req);

            var contextModuleLoader = new InMemoryModuleLoader();

            contextModuleLoader.RegisterModule(currentContextModule);

            moduleLoader.RegisterModuleLoader(contextModuleLoader, 2);

            //Register the web resource module loader rooted at the target path.
            if (Uri.TryCreate(new Uri(brewOrder.BaseUrl, UriKind.Absolute), brewOrder.Path, out Uri targetUri))
            {
                var targetPath = targetUri.GetLeftPart(UriPartial.Authority) + String.Join("", targetUri.Segments.Take(targetUri.Segments.Length - 1));
                var webResourceModuleLoader = new WebResourceModuleLoader(targetPath);
                moduleLoader.RegisterModuleLoader(webResourceModuleLoader, 100);
            }

            return(moduleLoader);
        }
Ejemplo n.º 8
0
        public TypeScriptTranspiler()
        {
            var myMemoryModuleLoader = new InMemoryModuleLoader();

            myMemoryModuleLoader.RegisterModule(new TypeScriptModule());

            var serviceCollection = new ServiceCollection();

            serviceCollection.AddBaristaCore(moduleLoader: myMemoryModuleLoader);

            m_provider       = serviceCollection.BuildServiceProvider();
            m_runtimeFactory = m_provider.GetRequiredService <IBaristaRuntimeFactory>();
        }
Ejemplo n.º 9
0
        public IBaristaRuntimeFactory GetRuntimeFactory()
        {
            var myMemoryModuleLoader = new InMemoryModuleLoader();

            myMemoryModuleLoader.RegisterModule(new LodashModule());

            var serviceCollection = new ServiceCollection();

            serviceCollection.AddBaristaCore(moduleLoader: myMemoryModuleLoader);

            var provider = serviceCollection.BuildServiceProvider();

            return(provider.GetRequiredService <IBaristaRuntimeFactory>());
        }
Ejemplo n.º 10
0
        public void JsAggregateModuleLoaderCanRemoveLoader()
        {
            var inMemoryModuleLoader1 = new InMemoryModuleLoader();

            inMemoryModuleLoader1.RegisterModule(new HelloWorldModule());

            var inMemoryModuleLoader2 = new InMemoryModuleLoader();

            inMemoryModuleLoader2.RegisterModule(new GoodnightMoonModule());

            var aggregateModuleLoader = new PrefixedAggregateModuleLoader();

            Assert.False(aggregateModuleLoader.HasModuleLoader("foo"));
            aggregateModuleLoader.RegisterModuleLoader("foo", inMemoryModuleLoader1);
            Assert.True(aggregateModuleLoader.HasModuleLoader("foo"));
            aggregateModuleLoader.RemoveModuleLoader("foo");
            Assert.False(aggregateModuleLoader.HasModuleLoader("foo"));
        }
Ejemplo n.º 11
0
        public void JsAggregateModuleLoaderPrefixesMustBeUnique()
        {
            var inMemoryModuleLoader1 = new InMemoryModuleLoader();

            inMemoryModuleLoader1.RegisterModule(new HelloWorldModule());

            var inMemoryModuleLoader2 = new InMemoryModuleLoader();

            inMemoryModuleLoader2.RegisterModule(new GoodnightMoonModule());

            var aggregateModuleLoader = new PrefixedAggregateModuleLoader();

            aggregateModuleLoader.RegisterModuleLoader("daytime", inMemoryModuleLoader1);
            Assert.Throws <ArgumentException>(() =>
            {
                aggregateModuleLoader.RegisterModuleLoader("daytime", inMemoryModuleLoader2);
            });
        }
        public void JsInMemoryModuleLoaderThrowsOnInvalidArguments()
        {
            var inMemoryModuleLoader = new InMemoryModuleLoader();

            Assert.Throws <ArgumentNullException>(() =>
            {
                inMemoryModuleLoader.RegisterModule(null);
            });

            Assert.Throws <InvalidOperationException>(() =>
            {
                inMemoryModuleLoader.RegisterModule(new PhantomModule());
            });

            inMemoryModuleLoader.RegisterModule(new HelloWorldModule());
            Assert.Throws <InvalidOperationException>(() =>
            {
                inMemoryModuleLoader.RegisterModule(new HelloWorldModule());
            });
        }
Ejemplo n.º 13
0
        public void JsAggregateModuleLoaderPrefixedModules()
        {
            var script = @"
        import helloworld from 'daytime!hello_world';
        export default helloworld;
        ";

            var script2 = @"
        import helloworld from 'nighttime!goodnight_moon';
        export default helloworld;
        ";

            var inMemoryModuleLoader1 = new InMemoryModuleLoader();

            inMemoryModuleLoader1.RegisterModule(new HelloWorldModule());

            var inMemoryModuleLoader2 = new InMemoryModuleLoader();

            inMemoryModuleLoader2.RegisterModule(new GoodnightMoonModule());

            var aggregateModuleLoader = new PrefixedAggregateModuleLoader();

            aggregateModuleLoader.RegisterModuleLoader("daytime", inMemoryModuleLoader1);
            aggregateModuleLoader.RegisterModuleLoader("nighttime", inMemoryModuleLoader2);

            var baristaRuntime = GetRuntimeFactory(aggregateModuleLoader);

            using (var rt = baristaRuntime.CreateRuntime())
            {
                using (var ctx = rt.CreateContext())
                {
                    var result = ctx.EvaluateModule(script);

                    Assert.Equal("Hello, World!", result.ToString());

                    result = ctx.EvaluateModule(script2);

                    Assert.Equal("Goodnight, moon.", result.ToString());
                }
            }
        }