Coder Social home page Coder Social logo

hfmt's Introduction

hfmt

Hackage license Build Status

hfmt is a tool for formatting Haskell programs. Currently it is simply a gofmt style wrapper of the excellent tools hlint, hindent, and stylish-haskell.

Installation

with stack

$ stack install hfmt

with cabal

$ cabal install hfmt

Usage

Check all Haskell source under the current directory:

hfmt

Overwrite files with formatting suggestions:

hfmt -w

Help text

λ hfmt --help
hfmt - format Haskell programs

Usage: hfmt [-d|--print-diffs] [FILE]
  Reformats Haskell source files by applying HLint, hindent, and
  stylish-haskell.

Available options:
  -h,--help                Show this help text
  -d,--print-diffs         If a file's formatting is different, print a diff.
  -s,--print-sources       If a file's formatting is different, print its
                          source.
  -l,--print-paths         If a file's formatting is different, print its path.
  -w,--write-sources       If a file's formatting is different, overwrite it.
  FILE                     Explicit paths to process.
                            - A single '-' will process standard input.
                            - Files will be processed directly.
                            - Directories will be recursively searched for source files to process.
                            - .cabal files will be parsed and all specified source directories and files processed.
                            - If no paths are given, the current directory will be searched for .cabal files to process, if none are found the current directory will be recursively searched for source files to process.

Exit Codes:
  0 = No error
  1 = Encountered I/O or other operational error
  2 = Failed to parse a source code file
  3 = Source code was parsed but cannot be formatted properly
  4 = Formatted code differs from existing source (--print-diffs only)

hfmt's People

Contributors

andybalaam avatar camerondiver avatar considerate avatar danstiner avatar ynishi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  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  avatar  avatar  avatar

hfmt's Issues

Allow per-project customisation of hlint suggestions & hindent styles?

Hello there!

I like the idea behind hfmt, and perhaps this ticket doesn't make any sense as the purpose of such formatting tools is to be opinionated (otherwise you destroy its purpose), but nevertheless I guess it's worth asking. At the moment the tool doesn't allow any hlint customisation due to this:

(fixities, classify, hints) <- findSettings (readSettingsFile Nothing) Nothing

Nor any tweaking of the hindent style:

autoSettings = return (Settings gibiansky Nothing)

It might make sense though to have a certain degree of freedom.

Do you think such freedom is beyond the scope of hfmt (cc @Filib) ?

Thanks!

Alfredo

stack install hfmt fails on Windows with latest stack (stylish-haskell must match ==0.9.*)

Installing on fresh stack setup, I get following error:

stack install hfmt
Writing implicit global project config file to: C:\sr\global-project\stack.yaml
Note: You can change the snapshot via the resolver field there.
Using latest snapshot resolver: lts-11.14
Downloaded lts-11.14 build plan.

Error: While constructing the build plan, the following exceptions were encountered:

In the dependencies for hfmt-0.2.2:
    stylish-haskell must match ==0.9.*, but the stack configuration has no specified version
                    (latest matching version is 0.9.2.0)
needed since hfmt is a build target.

Some different approaches to resolving this:

  * Consider trying 'stack solver', which uses the cabal-install solver to attempt to find some
    working build configuration. This can be convenient when dealing with many complicated
    constraint errors, but results may be unpredictable.

  * Recommended action: try adding the following to your extra-deps
    in C:\sr\global-project\stack.yaml:

stylish-haskell-0.9.2.0@sha256:c43a964348b144c9dbe82391b27a9010a53405a8edf3db80abde0ca1d7117911

Plan construction failed.

To me the error message is weird, isn't 0.9.* matching with 0.9.2.0?

Take Cabal default-extensions into account

I just received this error message from hfmt:

$ hfmt lib/Category.hs
"Error reformatting lib/Category.hs: Error in stylish-haskell: Language.Haskell.Stylish.Parse.parseModule: could not parse lib/Category.hs: ParseFailed (SrcLoc \"<unknown>.hs\" 19 27) \"DataKinds language extension is not enabled. Please add {-# LANGUAGE DataKinds #-} pragma at the top of your module.\""

I have a .cabal file in my project that lists a large number of extensions

  default-extensions: ApplicativeDo BangPatterns BinaryLiterals ConstraintKinds DataKinds DefaultSignatures DeriveFoldable DeriveFunctor DeriveGeneric DeriveLift DeriveTraversable DerivingStrategies EmptyCase ExistentialQuantification FlexibleContexts FlexibleInstances FunctionalDependencies GADTs GeneralizedNewtypeDeriving InstanceSigs KindSignatures LambdaCase MultiParamTypeClasses MultiWayIf NamedFieldPuns OverloadedLists OverloadedStrings ParallelListComp PatternSynonyms RankNTypes ScopedTypeVariables StandaloneDeriving TupleSections TypeApplications TypeFamilies TypeFamilyDependencies TypeOperators TypeSynonymInstances UnicodeSyntax AllowAmbiguousTypes MonadComprehensions PackageImports PolyKinds TypeInType

It would be convenient if hfmt was taking these into account.

hfmt chokes on stdin

Trying to integrate this with neoformat but :Neoformat hfmt was returning formatters hfmt failed to run so I looked up the args it passes and thought I'd try via CLI:

❯ cat src/<source file>.hs | hfmt -
hfmt: Prelude.undefined
CallStack (from HasCallStack):
  error, called at libraries/base/GHC/Err.hs:79:14 in base:GHC.Err
  undefined, called at app/Actions.hs:23:25 in main:Actions

Which makes sense given Actions.hs:23.

and also given:

❯ hfmt -s src/<source file>.hs
hfmt: Prelude.undefined
CallStack (from HasCallStack):
  error, called at libraries/base/GHC/Err.hs:79:14 in base:GHC.Err
  undefined, called at app/Actions.hs:23:25 in main:Actions

Is this feature currently unsupported / experimental (printing sources)? Seems to messing up stdin processing.

Exit code semantics

Two different exit code semantics are needed:

  1. When run in a context like neoformat, non-zero exit should mean the format tool failed to run (crashed, etc)
  2. In a CI pipeline, non-zero exit should mean there are changes to apply, or the tool failed to run.

Tools like rustfmt support both of these modes, defaulting to 1, but using CI semantics if a flag like --write-mode=diff is passed.

Currently this tool always uses CI-type exit codes.

This will be a breaking change.

Can't install with Stack

I'm sorry if this is not the right place to bring this up, but wasn't sure where to turn. You mention in the readme that installation is just running stack install hfmt. I did so, and this is what happened. I'm very new to Haskell, so I'm unsure how to resolve this.

λ stack install hfmt                                                                                                                                                                [~] [14:43]

Error: While constructing the build plan, the following exceptions were encountered:

In the dependencies for hfmt-0.2.1:
    haskell-src-exts-1.20.2 from stack configuration does not match <1.20  (latest matching version is 1.19.1)
    stylish-haskell must match ==0.8.*, but the stack configuration has no specified version  (latest matching version is 0.8.1.0)
needed since hfmt is a build target.

Some different approaches to resolving this:

  * Consider trying 'stack solver', which uses the cabal-install solver to attempt to find some working build configuration. This can be convenient when dealing with many complicated
    constraint errors, but results may be unpredictable.

  * Recommended action: try adding the following to your extra-deps in /home/ahstro/.stack/global-project/stack.yaml:

- haskell-src-exts-1.19.1
- stylish-haskell-0.8.1.0

Plan construction failed.

Initial Update

Hi 👊

This is my first visit to this fine repo, but it seems you have been working hard to keep all dependencies updated so far.

Once you have closed this issue, I'll create separate pull requests for every update as soon as I find one.

That's it for now!

Happy merging! 🤖

hfmt misformats haddock comments in the export list

Haddock uses inline comments inside the export list for separating sections.

Hfmt misformats them into something that haddock chokes on.

Example:

module Test
  ( -- * Heading
    foo
  ) where

foo :: Int
foo = 0

becomes:

module Test
    -- * Heading
  ( foo
  ) where

foo :: Int
foo = 0

Load config from source path

Currently we load config for each formatted exactly once, using the working directory the program was launched with. This obviously will not work in all cases, for several of the formatters, if they are run through their exe will try to pick up config recursively from the directory of the source file on up to any parent.

So in short we need to re-load config for each directory that contains source to format.

stack-fmt exe

By creating a stack-fmt executable, it will be possible to quickly run stack fmt and to see any formatting errors for the entire project, even if you are not currently in the project root directory. Cabal does not seem to support pluggable commands of this form.

Stack install hfmt fails on latest everything [Linux, v0.2.2]

Just trying to get hfmt up and running but this happens when I do stack install hfmt:

--  While building custom Setup.hs for package hfmt-0.2.2 using:
      /home/g/.local/share/stack/setup-exe-cache/x86_64-linux-tinfo6/Cabal-simple_mPHDZzAJ_2.2.0.1_ghc-8.4.3 --builddir=.stack-work/dist/x86_64-linux-tinfo6/Cabal-2.2.0.1 build --ghc-options " -ddump-hi -ddump-to-file -fdiagnostics-color=always"
    Process exited with code: ExitFailure 1
    Logs have been written to: /home/g/.local/share/stack/global-project/.stack-work/logs/hfmt-0.2.2.log

    Configuring hfmt-0.2.2...
    Preprocessing library for hfmt-0.2.2..
    Building library for hfmt-0.2.2..
    [1 of 9] Compiling Language.Haskell.Format.Types ( src/Language/Haskell/Format/Types.hs, .stack-work/dist/x86_64-linux-tinfo6/Cabal-2.2.0.1/build/Language/Haskell/Format/Types.o )
    
    /tmp/stack-c1d9b225cc3db20c/hfmt-0.2.2/src/Language/Haskell/Format/Types.hs:29:10: error:
         No instance for (Semigroup Reformatted)
            arising from the superclasses of an instance declaration
         In the instance declaration for Monoid Reformatted
       |
    29 | instance Monoid Reformatted where
       |          ^^^^^^^^^^^^^^^^^^
    
    /tmp/stack-c1d9b225cc3db20c/hfmt-0.2.2/src/Language/Haskell/Format/Types.hs:38:10: error:
         No instance for (Semigroup Formatter)
            arising from the superclasses of an instance declaration
         In the instance declaration for Monoid Formatter
       |
    38 | instance Monoid Formatter where
       |          ^^^^^^^^^^^^^^^^
    
    /tmp/stack-c1d9b225cc3db20c/hfmt-0.2.2/src/Language/Haskell/Format/Types.hs:46:30: error:
         No instance for (Semigroup Reformatted)
            arising from a use of ‘<>’
         In the first argument of (<$>), namely (r <>)
          In the expression: (r <>) <$> formatter (reformattedSource r)
          In an equation for asReformatter’:
              asReformatter formatter r
                = (r <>) <$> formatter (reformattedSource r)
       |
    46 | asReformatter formatter r = (r <>) <$> formatter (reformattedSource r)
       |                              ^^^^

Hfmt is the first package I've tried to install on a brand new install of stack

Can't build hfmt-0.1.0

Hey there, wanted to try out hfmt on an Ubuntu 16.04 box today using stack install but ran into this:

❯ stack install hfmt
<...snip dep installs...>
hfmt-0.1.0: configure
hfmt-0.1.0: build

--  While building package hfmt-0.1.0 using:
      /home/rjs/.stack/setup-exe-cache/x86_64-linux/Cabal-simple_mPHDZzAJ_1.24.2.0_ghc-8.0.2 --builddir=.stack-work/dist/x86_64-linux/Cabal-1.24.2.0 build --ghc-options " -ddump-hi -ddump-to-file"
    Process exited with code: ExitFailure 1
    Logs have been written to: /home/rjs/bin/stickybeak/.stack-work/logs/hfmt-0.1.0.log

    Configuring hfmt-0.1.0...
    Building hfmt-0.1.0...
    Preprocessing library hfmt-0.1.0...
    [1 of 9] Compiling Path.Find        ( src/Path/Find.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.2.0/build/Path/Find.o )
    
    /tmp/stack8815/hfmt-0.1.0/src/Path/Find.hs:9:1: warning: [-Wunused-imports]
        The import of ‘Control.Exception’ is redundant
          except perhaps to import instances from ‘Control.Exception’
        To import instances alone, use: import Control.Exception()
    
    /tmp/stack8815/hfmt-0.1.0/src/Path/Find.hs:10:1: warning: [-Wunused-imports]
        The import of ‘Control.Monad’ is redundant
          except perhaps to import instances from ‘Control.Monad’
        To import instances alone, use: import Control.Monad()
    
    /tmp/stack8815/hfmt-0.1.0/src/Path/Find.hs:16:1: warning: [-Wunused-imports]
        The import of ‘System.IO.Error’ is redundant
          except perhaps to import instances from ‘System.IO.Error’
        To import instances alone, use: import System.IO.Error()
    
    /tmp/stack8815/hfmt-0.1.0/src/Path/Find.hs:34:1: warning: [-Wunused-top-binds]
        Defined but not used: ‘findDirUp’
    [2 of 9] Compiling Language.Haskell.Source.Enumerator ( src/Language/Haskell/Source/Enumerator.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.2.0/build/Language/Haskell/Source/Enumerator.o )
    
    /tmp/stack8815/hfmt-0.1.0/src/Language/Haskell/Source/Enumerator.hs:6:1: warning: [-Wunused-imports]
        The import of ‘Control.Applicative’ is redundant
          except perhaps to import instances from ‘Control.Applicative’
        To import instances alone, use: import Control.Applicative()
    [3 of 9] Compiling Language.Haskell.Format.Definitions ( src/Language/Haskell/Format/Definitions.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.2.0/build/Language/Haskell/Format/Definitions.o )
    
    /tmp/stack8815/hfmt-0.1.0/src/Language/Haskell/Format/Definitions.hs:8:1: warning: [-Wunused-imports]
        The import of ‘Control.Applicative’ is redundant
          except perhaps to import instances from ‘Control.Applicative’
        To import instances alone, use: import Control.Applicative()
    [4 of 9] Compiling Language.Haskell.Format.Internal ( src/Language/Haskell/Format/Internal.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.2.0/build/Language/Haskell/Format/Internal.o )
    
    /tmp/stack8815/hfmt-0.1.0/src/Language/Haskell/Format/Internal.hs:8:1: warning: [-Wunused-imports]
        The import of ‘Control.Applicative’ is redundant
          except perhaps to import instances from ‘Control.Applicative’
        To import instances alone, use: import Control.Applicative()
    [5 of 9] Compiling Language.Haskell.Format.HIndent ( src/Language/Haskell/Format/HIndent.hs, .stack-work/dist/x86_64-linux/Cabal-1.24.2.0/build/Language/Haskell/Format/HIndent.o )
    
    /tmp/stack8815/hfmt-0.1.0/src/Language/Haskell/Format/HIndent.hs:61:23: error:
        • Couldn't match expected type ‘Data.ByteString.Internal.ByteString
                                        -> Either String Data.ByteString.Builder.Builder’
                      with actual type ‘Either String Data.ByteString.Builder.Builder’
        • The function ‘reformat’ is applied to four arguments,
          but its type ‘Config
                        -> Maybe [Extension]
                        -> Data.ByteString.Internal.ByteString
                        -> Either String Data.ByteString.Builder.Builder’
          has only three
          In the second argument of ‘(<$>)’, namely
            ‘reformat config extensions Nothing sourceText’
          In the expression:
            toHaskellSource <$> reformat config extensions Nothing sourceText
    
    /tmp/stack8815/hfmt-0.1.0/src/Language/Haskell/Format/HIndent.hs:61:50: error:
        • Couldn't match expected type ‘Data.ByteString.Internal.ByteString’
                      with actual type ‘Maybe a0’
        • In the third argument of ‘reformat’, namely ‘Nothing’
          In the second argument of ‘(<$>)’, namely
            ‘reformat config extensions Nothing sourceText’
          In the expression:
            toHaskellSource <$> reformat config extensions Nothing sourceText

Anything I might be doing wrong?

hfmt misformats the `*` operator when qualified and parenthesized

hfmt transforms,for example (P.*) into (P .*) which is wrong

Example:

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE PackageImports    #-}

module Hack
  ( mul
  ) where

import qualified "base" Prelude as P

mul :: P.Num a => a -> a -> a
mul = (P.*)

The (P.*) gets transformed into (P .*) and the code doesn't compile

Incremental formatting?

Maybe we could have incremental formatting? I.e. when run for a directory, reformatting only the files with updated times (since last formatting)?

Here’s an example of how to do that with a plain old Makefile:

https://github.com/michalrus/kornel/blob/5c99123afcbb04b555570093c0d5fad0cf7edf23/Makefile#L33-L41

So for each %.hs file, it touches an empty dist/autoformat/%.hs_autoformat. And reformats only these files for which %.hs has time fresher than dist/autoformat/%.hs_autoformat.

Something like that would be very cool. ♥

Print suggestions even when overwriting sources

It is not very obvious when using the --write-sources option when there are additional errors hiding as suggestions that were not automatically applied. They should probably be printed out.

stack update to lts-14.6 and ghc 8.6.5

I built via stack today, and failed(It may be no problem to build other environment, like in docker container.).

  • environment
    • Debian 9.4
    • stack 2.1.3
    • installed ghc 8.6.5

I tried to update stack.yaml and success without change app source(just reformat to pass test).
How about update?

change

  • update stack.yaml
    • update resolver to lts-14.6
    • update hindent version
    • add stylish-haskell version
  • hfmt source(because stack test failed)

diff

https://github.com/danstiner/hfmt/compare/master...ynishi:support_ghc_8.6.5?expand=1

check

  • stack build, test, install succeeded.
  • hfmt -w . command worked.
  • but no completely check all features.

Basic readme

Hey sorry for sending an issue rather than a PR, but some people on Twitter said they wish there was a readme that shows briefly how hfmt works. Thought I'd pass it along.

Support newer GHC versions?

Hello. Currently, hfmt supports GHC 8.0.2, 8.2.2, 8.4.4, and 8.6.3. However, these are too old. How about supporting 8.10.7, 9.2.2, and 9.4.1? HIndent supports them, and stylish-haskell and hlint should support them too.

stack install hfmt fails on OSX

stack install hfmt
hfmt-0.2.3.1: configure
hfmt-0.2.3.1: build

--  While building package hfmt-0.2.3.1 using:
      /Users/levkowalski/.stack/setup-exe-cache/x86_64-osx/Cabal-simple_mPHDZzAJ_2.4.0.1_ghc-8.6.3 --builddir=.stack-work/dist/x86_64-osx/Cabal-2.4.0.1 build --ghc-options " -ddump-hi -ddump-to-file -fdiagnostics-color=always"
    Process exited with code: ExitFailure 1
    Logs have been written to: /Users/levkowalski/.stack/global-project/.stack-work/logs/hfmt-0.2.3.1.log

    Configuring hfmt-0.2.3.1...
    Preprocessing library for hfmt-0.2.3.1..
    Building library for hfmt-0.2.3.1..
    [1 of 9] Compiling Language.Haskell.Format.Types ( src/Language/Haskell/Format/Types.hs, .stack-work/dist/x86_64-osx/Cabal-2.4.0.1/build/Language/Haskell/Format/Types.o )
    [2 of 9] Compiling Language.Haskell.Format.Internal ( src/Language/Haskell/Format/Internal.hs, .stack-work/dist/x86_64-osx/Cabal-2.4.0.1/build/Language/Haskell/Format/Internal.o )
    [3 of 9] Compiling Language.Haskell.Format.Stylish ( src/Language/Haskell/Format/Stylish.hs, .stack-work/dist/x86_64-osx/Cabal-2.4.0.1/build/Language/Haskell/Format/Stylish.o )
    [4 of 9] Compiling Language.Haskell.Format.HLint ( src/Language/Haskell/Format/HLint.hs, .stack-work/dist/x86_64-osx/Cabal-2.4.0.1/build/Language/Haskell/Format/HLint.o )
    [5 of 9] Compiling Language.Haskell.Source.Enumerator ( src/Language/Haskell/Source/Enumerator.hs, .stack-work/dist/x86_64-osx/Cabal-2.4.0.1/build/Language/Haskell/Source/Enumerator.o )

    /private/var/folders/tz/66szk1893l3bs6xp_s5jypxw0000gn/T/stack30942/hfmt-0.2.3.1/src/Language/Haskell/Source/Enumerator.hs:7:1: error:
        Could not find module ‘Conduit’
        Use -v to see a list of the files searched for.
      |
    7 | import           Conduit
      | ^^^^^^^^^^^^^^^^^^^^^^^^

install is failing on OSX 10.13.6

with

stack --version
Version 1.9.3, Git revision 40cf7b37526b86d1676da82167ea8758a854953b (6211 commits) x86_64 hpack-0.31.1
ghci --version
The Glorious Glasgow Haskell Compilation System, version 8.6.3

Anybody have a hint on how I can fix this ?

hfmt.EXE: app\Main.hs:(71,1)-(73,41): Non-exhaustive patterns in function sourceChangedOrHasSuggestions

I'm getting error from HFMT.exe

<interactive>: 29: 20: Parse error: group hfmt.EXE: app\Main.hs:(71,1)-(73,41): Non-exhaustive patterns in function sourceChangedOrHasSuggestions

import Data.List
import Data.Ord

-- | Freq sorting
-- >>> sortByFrequency "amanaplanacanalpanama"
-- "cllmmppnnnnaaaaaaaaaa"
--
-- >>> sortByFrequency ""
-- ""
-- 
sortByFrequency :: Ord a => [a] -> [a]
sortByFrequency xs = 
    let 
        sortedElems = sort xs
        groupped = group sortedElems
        lengthComparsion = comparing (\a -> length a)
        sortedByLength = sortBy lengthComparsion groupped
        joinedStrings = concat sortedByLength
    in
        joinedStrings

Cant parse template haskell

file src

module Lib where

import           Data.Aeson.TH as Aeson
import           Protolude

data Freeplay = Freeplay
  { freeplay :: !Bool
  , operator :: !Text
  , token    :: !Text
  , site     :: !Text
  }

data AuthRequest = AuthRequest
  { cmd        :: !Text
  , gameId     :: !Text
  , launchVars :: Freeplay
  }

$(Aeson.deriveJSON Aeson.defaultOptions ''Freeplay)
$(Aeson.deriveJSON Aeson.defaultOptions ''AuthRequest)
 ~/projects/hask-test   master  hfmt -w src/Lib.hs
Error reformatting src/Lib.hs: Language.Haskell.Stylish.Parse.parseModule: could not parse <unknown>: ParseFailed (SrcLoc "<unknown>.hs" 19 1) "Parse error: $"
hfmt: app/Main.hs:(71,1)-(73,41): Non-exhaustive patterns in function sourceChangedOrHasSuggestions

though project compiled fine

Configuration files aren't installed with `cabal copy` (and I'm guessing `cabal install` too)

After packaging hfmt with the help of cabal copy I have a package with the following files:

hfmt /usr/
hfmt /usr/bin/
hfmt /usr/bin/hfmt
hfmt /usr/share/
hfmt /usr/share/doc/
hfmt /usr/share/doc/hfmt/
hfmt /usr/share/doc/hfmt/LICENSE

Unfortunately that isn't all files needed to actually run hfmt:

$ hfmt app/Main.hs 
hfmt: user error (Failed to find requested hint files:
  /usr/bin/data/hlint.yaml
)

I'm not sure this usage is prioritised, but it would be nice if it were easier to package hfmt.

Do not use `sourceList`

It loads all sources into memory leading to multi-gig memory usage on large projects like pandoc

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.