Giter Club home page Giter Club logo

dartsasshost's Introduction

Dart Sass Host for .NET NuGet version Download count

Dart Sass Host logo

.NET wrapper around the Dart Sass with the ability to support a virtual file system. Unlike other .NET wrappers around the Dart Sass (e.g. Citizen17.DartSass and AspNetCore.SassCompiler), this library is not based on the Dart runtime, but on the version for JavaScript.

Installation

This library can be installed through NuGet - https://nuget.org/packages/DartSassHost. Since the original library is written in JavaScript, you will need a JS engine to run it. As a JS engine is used the JavaScript Engine Switcher library. For correct working, you need to install one of the following NuGet packages:

After installing the packages, you will need to register the default JS engine.

Usage

When we create an instance of the SassCompiler class by using the constructor without parameters:

var sassCompiler = new SassCompiler();

Then we always use a JS engine registered by default. In fact, a constructor without parameters is equivalent to the following code:

var sassCompiler = new SassCompiler(JsEngineSwitcher.Current.CreateDefaultEngine);

This approach is great for web applications, but in some cases the usage of JS engine registration at global level will be redundant. It is for such cases that the possibility of passing of the JS engine factory to the constructor is provided:

var sassCompiler = new SassCompiler(new ChakraCoreJsEngineFactory());

You can also use a delegate that creates an instance of the JS engine:

var sassCompiler = new SassCompiler(() => new ChakraCoreJsEngine());

The main feature of this library is ability to support a virtual file system. You can pass an file manager through constructor of the SassCompiler class:

var sassCompiler = new SassCompiler(CustomFileManager());

Any public class, that implements an IFileManager interface, can be used as a file manager. A good example of implementing a custom file manager, which provides access to the virtual file system, is the VirtualFileManager class from the BundleTransformer.SassAndScss package.

It should also be noted, that this library does not write the result of compilation to disk. Compile and CompileFile methods of the SassCompiler class return the result of compilation in the form of an instance of the CompilationResult class. Consider in detail properties of the CompilationResult class:

Property name Data type Description
CompiledContent String CSS code.
IncludedFilePaths IList<string> List of included files.
SourceMap String Source map.
Warnings IList<ProblemInfo> List of the warnings.

Consider a simple example of usage of the Compile method:

using System;

using DartSassHost;
using DartSassHost.Helpers;
using JavaScriptEngineSwitcher.ChakraCore;

namespace DartSassHost.Example.ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            const string inputContent = @"$font-stack: Helvetica, sans-serif;
$primary-color: #333;

body {
  font: 100% $font-stack;
  color: $primary-color;
}";

            var options = new CompilationOptions { SourceMap = true };

            try
            {
                using (var sassCompiler = new SassCompiler(new ChakraCoreJsEngineFactory(), options))
                {
                    CompilationResult result = sassCompiler.Compile(inputContent, "input.scss",
                        "output.css", "output.css.map", options);

                    Console.WriteLine("Compiled content:{1}{1}{0}{1}", result.CompiledContent,
                        Environment.NewLine);
                    Console.WriteLine("Source map:{1}{1}{0}{1}", result.SourceMap, Environment.NewLine);
                    Console.WriteLine("Included file paths: {0}",
                        string.Join(", ", result.IncludedFilePaths));
                }
            }
            catch (SassCompilerLoadException e)
            {
                Console.WriteLine("During loading of Sass compiler an error occurred. See details:");
                Console.WriteLine();
                Console.WriteLine(SassErrorHelpers.GenerateErrorDetails(e));
            }
            catch (SassCompilationException e)
            {
                Console.WriteLine("During compilation of SCSS code an error occurred. See details:");
                Console.WriteLine();
                Console.WriteLine(SassErrorHelpers.GenerateErrorDetails(e));
            }
            catch (SassException e)
            {
                Console.WriteLine("During working of Sass compiler an unknown error occurred. See details:");
                Console.WriteLine();
                Console.WriteLine(SassErrorHelpers.GenerateErrorDetails(e));
            }
        }
    }
}

First we create an instance of the SassCompiler class, in the constructor of which we pass the JS engine factory and compilation options. Let's consider in detail properties of the CompilationOptions class:

Property name Data type Default value Description
Charset Boolean true Flag for whether to emit a @charset or BOM for CSS with non-ASCII characters.
IncludePaths IList<string> Empty list List of paths that library can look in to attempt to resolve @import declarations.
IndentType IndentType enumeration Space Indent type. Can take the following values:
  • Space - space character
  • Tab - tab character
IndentWidth Int32 2 Number of spaces or tabs to be used for indentation.
InlineSourceMap Boolean false Flag for whether to embed sourceMappingUrl as data uri.
LineFeedType LineFeedType enumeration Lf Line feed type. Can take the following values:
  • Cr - Macintosh (CR)
  • CrLf - Windows (CR LF)
  • Lf - Unix (LF)
  • LfCr
OmitSourceMapUrl Boolean false Flag for whether to disable sourceMappingUrl in css output.
OutputStyle OutputStyle enumeration Expanded Output style for the generated css code. Can take the following values:
  • Expanded
  • Compressed
QuietDependencies Boolean false Flag for whether to silence compiler warnings from stylesheets loaded by using the IncludePaths property.
SourceMap Boolean false Flag for whether to enable source map generation.
SourceMapIncludeContents Boolean false Flag for whether to include contents in maps.
SourceMapRootPath String Empty string Value will be emitted as sourceRoot in the source map information.
WarningLevel WarningLevel enumeration Default Warning level. Can take the following values:
  • Quiet - warnings are not displayed
  • Default - displayed only 5 instances of the same deprecation warning per compilation
  • Verbose - displayed all deprecation warnings

Then we call the Compile method with the following parameters:

  1. content - text content written on Sass/SCSS.
  2. inputPath - path to input Sass/SCSS file. Needed for generation of source map.
  3. outputPath (optional) - path to output CSS file. Needed for generation of source map. If path to output file is not specified, but specified a path to input file, then value of this parameter is obtained by replacing extension in the input file path by .css extension.
  4. sourceMapPath (optional) - path to source map file. If path to source map file is not specified, but specified a path to output file, then value of this parameter is obtained by replacing extension in the output file path by .css.map extension.

Then output result of compilation to the console. In addition, we provide handling of the following exception types: SassCompilerLoadException, SassCompilationException and SassException. In the Dart Sass Host, exceptions have the following hierarchy:

  • SassException
    • SassCompilerLoadException
    • SassCompilationException

Using of the CompileFile method quite a bit different from using of the Compile method:

using System;
using System.IO;

using DartSassHost;
using DartSassHost.Helpers;
using JavaScriptEngineSwitcher.ChakraCore;

namespace DartSassHost.Example.ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            const string basePath = "/Projects/TestSass";
            string inputFilePath = Path.Combine(basePath, "style.scss");
            string outputFilePath = Path.Combine(basePath, "style.css");
            string sourceMapFilePath = Path.Combine(basePath, "style.css.map");

            var options = new CompilationOptions { SourceMap = true };

            try
            {
                using (var sassCompiler = new SassCompiler(new ChakraCoreJsEngineFactory(), options))
                {
                    CompilationResult result = sassCompiler.CompileFile(inputFilePath, outputFilePath,
                        sourceMapFilePath, options);

                    Console.WriteLine("Compiled content:{1}{1}{0}{1}", result.CompiledContent,
                        Environment.NewLine);
                    Console.WriteLine("Source map:{1}{1}{0}{1}", result.SourceMap, Environment.NewLine);
                    Console.WriteLine("Included file paths: {0}",
                        string.Join(", ", result.IncludedFilePaths));
                }
            }
            catch (SassCompilerLoadException e)
            {
                Console.WriteLine("During loading of Sass compiler an error occurred. See details:");
                Console.WriteLine();
                Console.WriteLine(SassErrorHelpers.GenerateErrorDetails(e));
            }
            catch (SassCompilationException e)
            {
                Console.WriteLine("During compilation of SCSS code an error occurred. See details:");
                Console.WriteLine();
                Console.WriteLine(SassErrorHelpers.GenerateErrorDetails(e));
            }
            catch (SassException e)
            {
                Console.WriteLine("During working of Sass compiler an unknown error occurred. See details:");
                Console.WriteLine();
                Console.WriteLine(SassErrorHelpers.GenerateErrorDetails(e));
            }
        }
    }
}

In this case, the inputPath parameter is used instead of the content parameter. Moreover, value of the inputPath parameter now should contain the path to real file.

Who's Using Dart Sass Host for .NET

If you use the Dart Sass Host for .NET in some project, please send me a message so I can include it in this list:

dartsasshost's People

Contributors

lahma avatar taritsyn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

dartsasshost's Issues

Exitcode 139 in Linux

Hello,

I'm using this library to compile some Sass to CSS inside an F# script.
My code looks somewhat like:

#r "nuget: JavaScriptEngineSwitcher.ChakraCore.Native.win-x64"
#r "nuget: JavaScriptEngineSwitcher.ChakraCore.Native.linux-x64"
#r "nuget: JavaScriptEngineSwitcher.ChakraCore.Native.osx-x64"
#r "nuget: JavaScriptEngineSwitcher.ChakraCore, 3.19.0"
#r "nuget: DartSassHost, 1.0.0-preview8"

open System
open System.IO
open DartSassHost
open DartSassHost.Helpers
open JavaScriptEngineSwitcher.ChakraCore
open FSharp.Control.Reactive

let sassCompiler = new SassCompiler (new ChakraCoreJsEngineFactory ())
let (</>) a b = Path.Combine (a, b)
let inputFileToolpage = __SOURCE_DIRECTORY__ </> "online-tool.sass"
let inputFileTemplate = __SOURCE_DIRECTORY__ </> "template.sass"
let inputFolder = __SOURCE_DIRECTORY__
let outputToolPage = __SOURCE_DIRECTORY__ </> ".." </> ".tool" </> "online-tool.css"
let outputTemplate = __SOURCE_DIRECTORY__ </> "../assets/" </> "template.css"

let compileSass () =
    try
        let homepage =
            sassCompiler.CompileFile (inputFileToolpage, ?outputPath = Some outputToolPage)

        let template =
            sassCompiler.CompileFile (inputFileTemplate, ?outputPath = Some outputTemplate)

        File.WriteAllText (outputToolPage, homepage.CompiledContent)
        printfn "Compiled %s at %A" outputToolPage DateTime.Now

        File.WriteAllText (outputTemplate, template.CompiledContent)
        printfn "Compiled %s at %A" outputTemplate DateTime.Now

    with
    | :? SassCompilerLoadException as sclex ->
        printfn
            "During loading of Sass compiler an error occurred. See details:\n%s"
            (SassErrorHelpers.GenerateErrorDetails sclex)
    | :? SassCompilationException as sce ->
        printfn
            "During compilation of SCSS code an error occurred. See details:\n%s"
            (SassErrorHelpers.GenerateErrorDetails sce)
    | :? SassException as e ->
        printfn
            "During working of Sass compiler an unknown error occurred. See details:\n%s"
            (SassErrorHelpers.GenerateErrorDetails e)
    | ex -> printfn "Unexpected exception during Sass compilation: %A" ex

compileSass ()

This all works fine but when executing the script on Linux, I always exit with code 139.
I was able to isolate it to sassCompiler.CompileFile.
The moment I remove that line, I get exit code 0.
In every case, my Sass is compiled to CSS and I can save it to disk.

I'm just a bit annoyed with that exit code in my CI system.
It does not occur on Windows, is there anything I should take into account when running on Linux?

V8JsEngine support for .net 4.8?

Hi, not sure if this is the right place for this.

We recently upgraded all our packages to target .net 4.8 and started getting this error message:

image (5)

Can anyone point me in the right direction here?

Use sass-embedded instead of dart-sass.js

For a while now, there is a dart-sass-embedded that is, for the lack of a better word, faster, when compared to dart-sass.js. (I realize that at the start of the project, native dart binaries were not available and dart-sass.js was used for that reason.)

There is a node integration example that's actually the sass-embedded npm package. It should give an idea how the recommended way, using embedded sass protocol, should work... it node environment that is.

Virtual Filesystem does not work with V8 Engine

In a .Net Framework 4.8 project I added the following 3 NuGet packages:

  1. DartSassHost (1.0.0-preview8)
  2. JavaScriptEngineSwitcher.V8 (3.20.2)
  3. Microsoft.ClearScript.V8.Native.win-x64 (7.3.2)

I configured the Javascript engine switcher in a static function:

IJsEngineSwitcher engineSwitcher = JsEngineSwitcher.Current;
var factory = new V8JsEngineFactory();
engineSwitcher.EngineFactories.Add(factory);
engineSwitcher.DefaultEngineName = factory.EngineName;

Then I attempted to compile a stylesheet using the following code:

var options = new CompilationOptions { SourceMap = false, OutputStyle = OutputStyle.Compressed };
var virtualFileReader = new CustomVirtualFileManager("/");
var compiler = new SassCompiler(virtualFileReader, options);
var initialContent = "@import \"subdirectory/filename.scss\"; ...";
var result = compiler.Compile(initialContent, "/main.scss");

Which resulted in an error: Message: During Compilation of Sass code by using the Sass compiler a JavaScript error has occurred: TypeError: e.GetCurrentDirectory is not a function

Switching from V8JsEngineFactory to ChakraCoreJsEngineFactory with no other changes caused the stylesheet to compile successfully.

Since I can still use this library with the Chakra Core JS Engine this is not a showstopper issue for me, but I thought that this bug should be documented somewhere so that you have an opportunity to fix it and also to help other people who might encounter the same issue to know that there is a workaround.

Performance

I did a quick performance test on LibSassHost (c++) vs DartSassHost (js):

CSS output size: 43kb - here the time is a little over double and as one would expect.
LibSass: 0.3s
DartSass: 0.7s

CSS output size: 131kb - here it's over 10 time as slow although the output size is only 3 times as big.
LibSass: 1.6s
DartSass: 17.2s

I suspect that the big one is so much slower because of more calls to file manager. I tried with DisableGlobalMembers = true and DisableDynamicBinding = true but no difference.

This is not an issue post as such as the problem can be Dart or V8JsEngine via ClearScript.V8 - but maybe you have a suggestion for a tweak? Else just close and thank you for your wonderful contributions! :)

Bug

Creating a new SassCompiler using the 7.3.5 version of the V8 Engine switcher results in an exception when attempting to use the compiler (or even view it's properties in the debugger).

The problem appears to be present in both .net6 and .net7 on the MacOS. The application closes due to a hard fault (no exception thrown, force closes the debugger as well). The console output states only

Fatal error in , line 0
Check failed: 12 == (*__error()).

FailureMessage Object: 0x7ff7baf9f590

The problem is reproducible by running the webcompiler here: https://github.com/excubo-ag/WebCompiler as is, compiling any .sass file.

@Import extensionless file throws a System.UriFormatException

Attempting to import a partial file that does not have an extension causes an error to be thrown by the DartSassHost code which is NOT handled with a SassException. At first I thought this might be a Dart Sass issue, but now it appears to be a DartSassHost bug:

Using a virtual filesystem that allows files without extensions and file structure like this:

  • /bootstrap5/scss/bootstrap.scss
    • @import "mixins/banner";
  • /bootstrap5/scss/mixins/_banner
    • ... contents of this file do not matter for this issue ...

Attempting to compile bootstrap.scss results in the following error message:

System.UriFormatException: Invalid URI: The format of the URI could not be determined.
   at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
   at DartSassHost.Helpers.PathHelpers.MakeRelativePath(String relativeTo, String path)
   at DartSassHost.Helpers.PathHelpers.PrettifyPath(String currentDirectory, String path)
   at DartSassHost.JsonConverters.CompilationResultConverter.ReadStackFrame(Utf8JsonReader& reader, String currentDirectory)
   at DartSassHost.JsonConverters.CompilationResultConverter.ReadStackFrames(Utf8JsonReader& reader, String currentDirectory)
   at DartSassHost.JsonConverters.CompilationResultConverter.ReadError(Utf8JsonReader& reader)
   at DartSassHost.JsonConverters.CompilationResultConverter.ReadFirstError(Utf8JsonReader& reader)
   at DartSassHost.JsonConverters.CompilationResultConverter.ReadResult(Utf8JsonReader& reader)
   at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
   at System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)
   at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan`1 utf8Json, JsonTypeInfo jsonTypeInfo, Nullable`1 actualByteCount)
   at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan`1 json, JsonTypeInfo jsonTypeInfo)
   at System.Text.Json.JsonSerializer.Deserialize[TValue](String json, JsonSerializerOptions options)
   at DartSassHost.SassCompiler.InnerCompile(String content, Boolean indentedSyntax, String inputPath, String outputPath, String sourceMapPath, CompilationOptions options)
   at DartSassHost.SassCompiler.Compile(String content, String inputPath, String outputPath, String sourceMapPath, CompilationOptions options)
   at ... 

Aside from the fact that in most system having files without extensions is generally not a good idea (let's just say I don't have any control over that), this code seems to be supported by Dart Sass and can be compiled successfully using other tools (including the LibSassHost library).

Progress?

Hi,

I was wondering if you managed to make any progress on this project or if you abandoned work on this?
LibSassHost is used in https://github.com/johan-v-r/LibSassBuilder and if possible I would like to upgrade that project to use dart sass.

Regards,
Jelle Hissink

Unable to use DartSassHost in local dotnet tool

DartSassHost crashed silently when trying to use it as part of the local dotnet tool.

Steps to reproduce:

  1. Clone the sample project - https://github.com/sergeyzwezdin/dotnet-tool-DartSassHost/tree/master/dartsasshost-compiler
  2. Open cloned project folder, build.
  3. dotnet pack dartsasshost-compiler.csproj, save the path where is a package created, for example:

Successfully created package '/Users/sergeyzwezdin/Temp/dotnet-tool-DartSassHost/dartsasshost-compiler/bin/Debug/dartsasshost-compiler.1.0.0.nupkg'.

In this example we need /Users/sergeyzwezdin/Temp/dotnet-tool-DartSassHost/dartsasshost-compiler/bin/Debug/

  1. Create a new directory somewhere else, the next steps should be run from there:
  2. dotnet new tool-manifest
  3. dotnet tool install dartsasshost-compiler --version 1.0.0 --add-source=/Users/sergeyzwezdin/Temp/dotnet-tool-DartSassHost/dartsasshost-compiler/bin/Debug/ < replace path here
  4. Put some test.scss file into the directory
  5. dotnet tool run dartsasshost-compiler test.scss

Normally, this should return compiled code like this:
2022-01-09 at 23 08 03

But if we use it as a local dotnet tool it will fail silently and nothing is displayed:
2022-01-09 at 23 08 49

Also, it is interesting that it works okay if we install the tool globally. 🤔

JS Files of Dart Sass.

Hi!

it is not really an issue, it is just a question and a question is too simple:

Your project contains compiled files of dart sass. How did you compile dart sass into js file or where do you get this files from?

SassCompiler messes with tests (and my head)

Hi @Taritsyn,

I'm currently trying to integrate DartSassHost into https://github.com/excubo-ag/WebCompiler/. I have one test failure on linux systems, which completely baffles me. I've reduced it now to this tiny case:

  • test.csproj
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <IsPackable>false</IsPackable>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="DartSassHost" Version="1.0.0-preview3" />
    <PackageReference Include="JavaScriptEngineSwitcher.ChakraCore" Version="3.9.1" />
    <PackageReference Include="JavaScriptEngineSwitcher.ChakraCore.Native.linux-x64" Version="3.9.1" />
    <PackageReference Include="JavaScriptEngineSwitcher.ChakraCore.Native.win-x64" Version="3.9.1" />
    <PackageReference Include="NUnit" Version="3.13.2" />
    <PackageReference Include="NUnit3TestAdapter" Version="4.0.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0-release-20210626-04" />
  </ItemGroup>
</Project>
  • test.cs
using DartSassHost;
using NUnit.Framework;
using JavaScriptEngineSwitcher.ChakraCore;
using System.IO;

namespace Namespace
{
    public class Class
    {
        [Test]
        public void Method()
        {
            File.WriteAllText("test.scss", "");
            var result = new DartSassHost.SassCompiler(new ChakraCoreJsEngineFactory())
                .CompileFile("test.scss");
            Assert.AreNotEqual("hello", "hello");
        }
    }
}

As you can see, this simply compiles an empty scss file (so nothing should go wrong with that, same happens when the file isn't empty). It then continues to check whether "hello" is not equal to "hello", which on Windows systems produces the expected output

Failed Method [70 ms]
Error Message:
   Expected: not equal to "hello"
But was:  "hello"

Stack Trace:
  at Namespace.Class.Method() in /src/test.cs:line 26

However, on linux, this happens:

The active test run was aborted. Reason: Test host process crashed

Test Run Aborted with error System.Exception: One or more errors occurred.
 ---> System.Exception: Unable to read beyond the end of the stream.
   at System.IO.BinaryReader.Read7BitEncodedInt() in System.Private.CoreLib.dll:token 0x60056bc+0x0
   at System.IO.BinaryReader.ReadString() in System.Private.CoreLib.dll:token 0x60056b2+0x6
   at Microsoft.VisualStudio.TestPlatform.CommunicationUtilities.LengthPrefixCommunicationChannel.NotifyDataAvailable() in Microsoft.TestPlatform.CommunicationUtilities.dll:token 0x6000026+0x8
   at Microsoft.VisualStudio.TestPlatform.CommunicationUtilities.TcpClientExtensions.MessageLoopAsync(TcpClient client, ICommunicationChannel channel, Action`1 errorHandler, CancellationToken cancellationToken) in Microsoft.TestPlatform.CommunicationUtilities.dll:token 0x6000064+0xa0
   --- End of inner exception stack trace ---.

Getting things to this stage, I would have thought this has nothing to do with DartSassHost. However, if you remove the compilation step, the behavior is as expected (i.e. test failure, rather than crash).

using DartSassHost;
using NUnit.Framework;
using JavaScriptEngineSwitcher.ChakraCore;
using System.IO;

namespace Namespace
{
    public class Class
    {
        [Test]
        public void Method()
        {
            File.WriteAllText("test.scss", "");
            //var result = new DartSassHost.SassCompiler(new ChakraCoreJsEngineFactory())
            //    .CompileFile("test.scss");
            Assert.AreNotEqual("hello", "hello");
        }
    }
}

Do you have any idea what's going on here?

Best regards,
Stefan

Non-preview / prod ready release

Hi Taritsyn,

Are you planning a non-preview release of this library at some point in time?

DartSassBuilder has a dependency on your package's v1.0.0-preview7 and was wondering when we could look at a full release

Thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.