Git Product home page Git Product logo

vim-prettier's Introduction

vim-prettier

A vim plugin wrapper for prettier, pre-configured with custom default prettier settings.


NOTE: If you want to fallback to older version of prettier/vim-prettier please add this to your .vimrc:

Plug 'prettier/vim-prettier', {
  \ 'do': 'yarn install --frozen-lockfile --production',
  \ 'branch': 'release/0.x'
  \ }

By default it will auto format javascript, typescript, less, scss, css, json, graphql and markdown files if they have/support the "@format" pragma annotation in the header of the file.

vim-prettier

INSTALL

To install with vim 8+ plugins, simply clone to your ~/.vim/pack/plugins/start directory, and add packloadall to your .vimrc (if you haven't already).

mkdir -p ~/.vim/pack/plugins/start
git clone https://github.com/prettier/vim-prettier ~/.vim/pack/plugins/start/vim-prettier

.vimrc:

packloadall

Install with vim-plug, assumes node and yarn|npm installed globally.

" post install (yarn install | npm install) then load plugin only for editing supported files
Plug 'prettier/vim-prettier', {
  \ 'do': 'yarn install --frozen-lockfile --production',
  \ 'for': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'graphql', 'markdown', 'vue', 'svelte', 'yaml', 'html'] }

or simply enable for all formats by:

" post install (yarn install | npm install) then load plugin only for editing supported files
Plug 'prettier/vim-prettier', { 'do': 'yarn install --frozen-lockfile --production' }

For those using vim-pathogen, you can run the following in a terminal:

cd ~/.vim/bundle
git clone https://github.com/prettier/vim-prettier

If using dein, add the following to your dein config:

call dein#add('prettier/vim-prettier', {'build': 'npm install'})

If using other vim plugin managers or doing manual setup make sure to have prettier installed globally or go to your vim-prettier directory and either do npm install or yarn install --frozen-lockfile

Prettier Executable resolution

When installed via vim-plug, a default prettier executable is installed inside vim-prettier.

vim-prettier executable resolution:

  1. Look for user defined prettier cli path from vim configuration file
  2. Traverse parents and search for Prettier installation inside node_modules
  3. Look for a global prettier installation
  4. Use locally installed vim-prettier prettier executable

Prettier Stylelint

To use an alternative command, like prettier-stylelint, set this at the buffer level, e.g.:

au FileType css,scss let b:prettier_exec_cmd = "prettier-stylelint"

vim-prettier will look for the executable in the same places it looks for prettier, and will fall back to prettier if it can't find b:prettier_exec_cmd

USAGE

Prettier by default will run on auto save but can also be manually triggered by:

<Leader>p

or

:Prettier

If your are on vim 8+ you can also trigger async formatting by:

:PrettierAsync

You can send to prettier your entire buffer but ensure that it formats only your selection.

note: differs from :PrettierFragment by sending the entire buffer to prettier, allowing identation level to be preserved, but it requires the whole file to be valid.

:PrettierPartial

You can send to prettier your current selection as a fragment of same type as the file being edited.

note: differs from :PrettierPartial by sending only the current selection to prettier, this allows for faster formatting but wont preserve indentation.

:PrettierFragment

You can check what is the vim-prettier plugin version by:

:PrettierVersion

You can send commands to the resolved prettier cli by:

:PrettierCli <q-args>

You can check what is the resolved prettier cli path by:

:PrettierCliPath

You can check what is the resolved prettier cli version by:

:PrettierCliVersion

Configuration

Change the mapping to run from the default of <Leader>p

nmap <Leader>py <Plug>(Prettier)

Enable auto formatting of files that have "@format" or "@prettier" tag

let g:prettier#autoformat = 1

Allow auto formatting for files without "@format" or "@prettier" tag

let g:prettier#autoformat_require_pragma = 0

NOTE The previous two options can be used together for autoformatting files on save without @format or @prettier tags

let g:prettier#autoformat = 1
let g:prettier#autoformat_require_pragma = 0

Toggle the g:prettier#autoformat setting based on whether a config file can be found in the current directory or any parent directory. Note that this will override the g:prettier#autoformat setting!

let g:prettier#autoformat_config_present = 1

A list containing all config file names to search for when using the g:prettier#autoformat_config_present option.

let g:prettier#autoformat_config_files = [...]

Set the prettier CLI executable path

let g:prettier#exec_cmd_path = "~/path/to/cli/prettier"

The command :Prettier by default is synchronous but can also be forced async

let g:prettier#exec_cmd_async = 1

By default parsing errors will open the quickfix but can also be disabled

let g:prettier#quickfix_enabled = 0

By default selection formatting will be running :PrettierFragment but we can set :PrettierPartial as the default selection formatting by:

let g:prettier#partial_format=1

By default we auto focus on the quickfix when there are errors but can also be disabled

let g:prettier#quickfix_auto_focus = 0

To run vim-prettier not only before saving, but also after changing text or leaving insert mode:

" when running at every change you may want to disable quickfix
let g:prettier#quickfix_enabled = 0

autocmd TextChanged,InsertLeave *.js,*.jsx,*.mjs,*.ts,*.tsx,*.css,*.less,*.scss,*.json,*.graphql,*.md,*.vue,*.svelte,*.yaml,*.html PrettierAsync

Overwrite default prettier configuration

Note: vim-prettier default settings differ from prettier intentionally. However they can be configured by:

" Max line length that prettier will wrap on: a number or 'auto' (use
" textwidth).
" default: 'auto'
let g:prettier#config#print_width = 'auto'

" number of spaces per indentation level: a number or 'auto' (use
" softtabstop)
" default: 'auto'
let g:prettier#config#tab_width = 'auto'

" use tabs instead of spaces: true, false, or auto (use the expandtab setting).
" default: 'auto'
let g:prettier#config#use_tabs = 'auto'

" flow|babylon|typescript|css|less|scss|json|graphql|markdown or empty string
" (let prettier choose).
" default: ''
let g:prettier#config#parser = ''

" cli-override|file-override|prefer-file
" default: 'file-override'
let g:prettier#config#config_precedence = 'file-override'

" always|never|preserve
" default: 'preserve'
let g:prettier#config#prose_wrap = 'preserve'

" css|strict|ignore
" default: 'css'
let g:prettier#config#html_whitespace_sensitivity = 'css'

" false|true
" default: 'false'
let g:prettier#config#require_pragma = 'false'

" Define the flavor of line endings
" lf|crlf|cr|all
" defaut: 'lf'
let g:prettier#config#end_of_line = get(g:, 'prettier#config#end_of_line', 'lf')

REQUIREMENT(S)

If the prettier executable can't be found by Vim, no code formatting will happen

vim-prettier's People

Contributors

aaronarinder avatar andreiglingeanu avatar atomdmac avatar bracki avatar casprwang avatar chemzqm avatar coolreader18 avatar dependabot[bot] avatar docwhat avatar hrkw00 avatar jason0x43 avatar jsit avatar linucc avatar mitermayer avatar mitermayer2023 avatar nhynes avatar nicoder avatar niftylettuce avatar nthurow avatar onra avatar oskarrough avatar premithk avatar rivertam avatar rodrigolive avatar roginfarrer avatar samhowie avatar sharils avatar shulhan avatar victorspt avatar vutran 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  avatar  avatar  avatar  avatar  avatar  avatar

vim-prettier's Issues

"failed to parse buffer", but prettier from console works well

In this file

import React from 'react'
import { Route, IndexRoute } from 'react-router/es'
import Root from './modules/Root'
import Page from './modules/Page'

function errorLoading(err) {
  console.error('Dynamic page loading failed', err)
}

function loadRoute(cb) {
  return module => cb(null, module.default)
}

/*
 * @param {Redux Store}
 */
export default () =>
  <Route component={Page}>
    <Route path="/" component={Root}>
      <Route
        path="/info(/:category)"
        getComponent={(location, cb) => {
          import(
            /* webpackChunkName : "info" */
            './modules/info/containers/Layout')
            .then(loadRoute(cb))
            .catch(errorLoading)
        }}
      />
    </Route>
  </Route>

Problem is in comment /* webpackChunkName : "info" */. From console.it works.

Neovim support for job/channel to allow async formatting

We currently support vim8 async formatting by using its jobs API. However neovim job/channel API is not the same as vim8.

In order to provide a better experience for neovim users we should also support neovim job/channel API.

:Prettier causes :Ggrep to lose history

Thanks for awesome plugin. Can you take a look at this?

without :Prettier this should to through the matches list of 'abc'

(in vim)

:Ggrep 'abc'
:cnext
:cnext
:cnext

with :Prretier

:Ggrep 'abc'
:Prettier
:cnext -----> Cause E42: No Errors
:cnext

Image:
image

GIF:
prettier

Incorrect resolving of prettier config

Prettier uses following logic for resolving config:

The configuration file will be resolved starting from the location of the file being formatted, and searching up the file tree until a config file is (or isn't) found.

Plugin should resolve config of each file using command prettier --find-config-path ./my/file.js

This causes issues when I use following project structure:

|- node_modules/
|  |- prettier/
|- packageA/
|  |- src/
|  |  |- index.js
|  |- prettier.config.js
|- packageB/
|  |- src/
|  |  |- index.js
|  |- prettier.config.js

Plugin doesn't use configs from corresponding directories and formats both files packageA/src/index.js and packageB/src/index.js with default config.

Unable to disable 'single-quote'

Prettier 1.5.3 does not accept --single-quote false as a way to using double quotes. This means that g:prettier#config#single_quote = 'false' doesn't work. I have to use this, which is icky: g:prettier#config#single_quote = '--no-single-quote'.

no semicolon not working

Plug 'prettier/vim-prettier', { 
  \ 'do': 'npm install', 
  \ 'for': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'graphql'] }

let g:prettier#autoformat = 0
autocmd BufWritePre *.js,*.json,*.css,*.scss,*.less,*.graphql Prettier
let g:prettier#config#semi = 'false'
let g:prettier#config#trailing_comma = 'none'

Hi,
I've been using this config for some times and now in a fresh install it's printing semicolons. Did I missed something or something changed?

No references to getting help or support

vim-prettier 0.2.3

I have installed and using it now, thank you for the plugin.

doc\prettier.txt makes no mention on how to ask for help or support on the plugin.
No website given or email address supplied.

The only way I found this website was opening the changelog.md.

Most plugin authors put headers at the top of each of the files with something like this:

" vim-prettier.vim - A vim plugin wrapper for prettier 
" ---------------------------------------------------------------
" Version:       0.2.3
" Author:    Whatever <you.want at gmail dot com>
" Last Modified: 2017 Aug 13
" Created:       2017-05-24
" Homepage:      http://www.vim.org/scripts/script.php?script_id=5572
" Contributors:  Blah...
"                Blah
"
" Help:         :h vim-prettier.txt

This helps people find support as well as when I prune files from my plugins directory (if the filename wasn't obvious) I know which plugin it was for.

And of course doc\vim-prettier.txt should have similar information or a section for getting help / support / kudos and so on.

Slow

0.8s is really slow for me. Is this normal?

tmux_new_-s___basename___pwd____tmux_

The file only has 3 lines:

image

Running in command line mode take 0.39s:
tmux_new_-s___basename___pwd____tmux_

So I guess there is not much we can do?

prettier add extra comma at the last parameter of function

vim version:

Vim 8.0 (MS-Windows 64-bit GUI version with OLE support)

vimrc

Plug 'mitermayer/vim-prettier', {
            \ 'do': 'yarn install',
            \ 'for': ['javascript', 'typescript', 'css', 'less', 'scss'] }

" Disable auto formatting of files that have @format tag
let g:prettier#autoformat = 0

" max line lengh that prettier will wrap on
let g:prettier#config#print_width = 80

" number of spaces per indentation level
let g:prettier#config#tab_width = 4

" use tabs over spaces
let g:prettier#config#use_tabs = 'false'

" print semicolons
let g:prettier#config#semi = 'true'

" single quotes over double quotes
let g:prettier#config#single_quote = 'true'

nnoremap <silent><c-f> :Prettier<CR>

Probrem

origin code

function aLongLongLongFunction(barbarbar, foofoofoo, boobooboo, barbarbar, balabalabala) {
    console.log('lalalala');
}

after prettier

function aLongLongLongFunction(
    barbarbar,
    foofoofoo,
    boobooboo,
    barbarbar,
    balabalabala,  // add an extra comma here
) {
    console.log('lalalala');
}

Ignoring unknown option --loglevel, --no-editorconfig and --config-precedence

Hi,

I've just setup again my vim/prettier/eslint setup and I noticed that when I use prettier with this plugin it adds (at least) 3 now unknown options to the prettier cli. I'm unsure if those options are just deprecated or replaced upstream as I didn't found anything in the changelogs. But it seems to work to just drop those options.

Heres what I did:

  • Installed prettier in node-6.9.5 locally with package.json (npm install)
  • Opened a random js-file with some minor formatting issues
  • Format with <leader>p (or by calling the Commands directly, I tried both actually)
  • File now contains
Ignored unknown option: --config-precedence
Ignored unknown option: --no-editorconfig
Ignored unknown option: --loglevel

at the top.

Inform minimum supported vim version

At the moment vim-prettier has been developed with vim8+ in mind. We should however be more clear about it on our README and make sure we can identify what is our minimum supported vim version.

We should also investigate what is required to guarantee backwards support with older vim versions.

Partial formatting support

We should allow partial formatting upon visual selection. It should also work on both Async and Sync modes.

Fallback plugins not working

In

function! s:Get_Exec(...) abort`
   let l:rootDir = a:0 > 0 ? a:1 : 0 
   let l:exec = 0
 
   if rootDir

should check for directory since vim string comparison is always 0, intead it should be:

function! s:Get_Exec(...) abort`
   let l:rootDir = a:0 > 0 ? a:1 : 0 
   let l:exec = 0
 
   if isdirectory(rootDir)

Confused by file type overrides

Thanks for writing the plugin. Keen to start using it but I've just had a very confusing 30 mins whilst I tried to figure out why vim-prettier seemed to be ignoring my prettier project config file.

I feel that the README indicates that prettier defaults to 'prefer-file'. But in order to get that behaviour when using typescript I have to delete these lines:

let b:prettier_ft_default_args = {
\ 'parser': 'typescript',
\ 'configPrecedence': 'cli-override',
\ }

Though I've used vim for a long time, I'm one of those that has never really learnt even the basics of vim script so I'm not sure how to override that setting myself.

Hope this is a reasonable concern to raise. I'm sure I could work around it if I knew more about vim but it seems confusing behaviour to start with. Maybe I'm missing something basic. It wouldn't be the first time I've missed something in the docs.

Thanks for the project though :)

Include changelog

We should start including a CHANGELOG file in order to better track release updates

How do I enable trailing commas?

I would like to enable trailing commas. Instead of the formatter changing my code from:

  Promise.all([
    sendToAlphaBroker(firstHalfOfByteChunks, file),
    sendToBetaBroker(lastHalfOfByteChunks, file),
  ]).then(() => {
    console.log("Upload complete!");
  });

to

  Promise.all([
    sendToAlphaBroker(firstHalfOfByteChunks, file),
    sendToBetaBroker(lastHalfOfByteChunks, file)
  ]).then(() => {
    console.log("Upload complete!");
  });

I added this line: let g:prettier#config#trailing_comma = 'all' to my vimrc file but it doesn't seem to be working?

SyntaxError: Unexpected token

vim-prettier 0.2.3

I have the following JSON:

{
  "URL": { "demoVisualization_comment": "Additional parameters are included: ?tempUnit=F&edgeHost=<ip_or_host_name_of_this_machine>", "securityCertificate": "downloads/test.zip" }
}

If I simply run :Prettier, I get this correct output:

{
  "URL": {
    "demoVisualization_comment":
      "Additional parameters are included: ?tempUnit=F&edgeHost=<ip_or_host_name_of_this_machine>",
    "securityCertificate": "downloads/test.zip"
  }
}

But, if I visually select just this line:

  "URL": { "demoVisualization_comment": "Additional parameters are included: ?tempUnit=F&edgeHost=<ip_or_host_name_of_this_machine>", "securityCertificate": "downloads/test.zip" }

And run: :'<,'>Prettier, I get an error:

demoConfig.json|1 col 8| SyntaxError: Unexpected token

Prettier version:

$ npm i -g prettier
[email protected] C:\...\npm\node_modules\prettier

$ node --version
v4.2.1

Note, it is a bit inconsistent.
If I had more lines, sometimes it formats them correctly. I was pruning my JSON lines to try to find a small reproducible example.

Overwrites Buffer1 with contents of Buffer2

Probably from a race condition where saving then immediately switching to a different buffer, the buffer switched to is overwritten with the contents from the previous buffer.

Ignored unknown option: --config-precedence

I get this error one every save

This is the configuration in my vimrc file:

let g:prettier#config#print_width = 120
let g:prettier#config#bracket_spacing = 'false'
let g:prettier#quickfix_enabled = 1
let g:prettier#autoformat = 0
autocmd BufWritePre .js,.jsx,.mjs,.ts,.tsx,.css,.less,.scss,.json,.graphql Prettier

should support filetype detection when none is available

We should provide some basic filetype detection but also keeping compatible with other plugins.

This for example would enable to correctly identify graphql, typescript, less, scss etc.. without having to rely on the filetype being implemented by other plugins.

we should be able to leverage from vim did_filetype() function that will allow us to conditionally set a filetype if no other plugin has done so.

PrettierAsync does not work on Windows

I've just installed the package and whilst calling :Prettier works fine, :PrettierAsync appears to do absolutely nothing.

As far as I can tell, this is caused by the fact that Vim's job_start function is attempting to call the prettier executable directly, which causes the job to fail immediately (job_status returns 'fail') without ever calling the error callback. The correctly working :Prettier goes via a system() call which executes the command via the shell rather than a direct call.

If I prepend 'cmd.exe /C' to the command passed to job_start, it works just fine.

I will put in a fix and create a pull request when I get the chance but I can't guarantee it will be pretty.

Trailing comma is causing issues with IE10/11

The default setting:

" none|es5|all
g:prettier#config#trailing_comma = 'all'

is causing IE 10 and 11 to trigger an error on JS files.
Perhaps this settings should be set to "none" by default?

`--parser` with value `postcss` is deprecated

This line is being prepended to my *.css files when formatting with vim-prettier:

--parser with value postcss is deprecated. Prettier now treats it as: --parser=css.

I am using prettier version 1.7.1.

Upgrade to support prettier 1.6

Will keep this as a holding issue to keep track to upgrading to prettier 1.6

  • bump vim-prettier plugin dependencie to 1.6
  • add support for prettier custom config
  • merge PR when 1.7.0 is released

Question. Why differ from prettier?

HI! Thanks so much for all your work on prettier and vim-prettier. It was exactly what I was looking for after having used gofmt.

I'm super curious - on the readme, you say that you differ from Prettier intentionally. Would love to better understand the reasoning as I'm currently trying to configure it to act the same as Prettier. Thanks!

plugins should reference global variable

To prevent a script from being loaded and reloaded and reloaded, Vim files add (*.vim) typically add the following to the top of them:

if exists('g:loaded_vim_prettier') || &cp
    finish
endif
let g:loaded_vim_prettier = 0.2.3

That way they get loaded once and only once. Once the functions and initialization is complete, there is no need to re-source this file.

Single quote option not working

The option to use single quote is not working.

I have the following in my vimrc:

let g:prettier#config#single_quote = 'true'

Current using Prettier version is 1.9.1.

Autoformat "all" files by default.

Hi guys, first of all thank you for your time and effort, I really appreciate it :)

Is it possible to auto format files, on save, without the need to add the "@Format" tag?

Json parser should not include comma at the end

By allowing the extra comma to be auto added will create an invalid json file

This is an invalid json:

{
   "foo": "bar",
}

should be:

{
   "foo": "bar"
}

We should make sure that json parsing settings make sure to not include auto adding comma settings

Detect package.json configuration?

Can this detect configuration for prettier in package.json?

  // ...
  "xo": {
    "extends": "prettier",
    "plugins": ["babel", "prettier"],
    "rules": {
      "prettier/prettier": [ // <---------- HERE
        "error",
        {
          "singleQuote": true,
          "bracketSpacing": true,
          "trailingComma": "none"
        }
      ],
      "max-len": ["error", {"code": 80, "ignoreUrls": true}]
    },

Add support for prettier 1.8

We should add support for prettier 1.8

  • Bump internal plugin dependency
  • Add support for markdown formatting
  • Update readme and docs

Prettier: failed to parse buffer. Prettier fails on css files.

Hello there!
For unknown reason prettier cannot style css files (there is no any problem with javascript by the way).
Example of css file:

/* @format */

body {
        dislay:none ;
        opacity:   .75;
}

My environment:

  • Ubuntu 16.04 x64
  • :PrettierCli nothing
  • :PrettierCliPath prettier
  • :PrettierCliVersion 1.8.0
  • :PrettierVersion 0.2.4
  • :version
NVIM v0.2.0                                                                                                                                                                                  
Build type: RelWithDebInfo                                                                                                                                                                   
Compilation: /usr/bin/x86_64-linux-gnu-gcc -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -DDISABLE_LOG -Wdate-time -D_FORTIFY_SOURCE
=2 -Wconversion -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -O2 -g -DDISABLE_LOG -Wall -Wextra -pedantic -Wno-unused-parameter -Wstrict-prototypes -std=gnu99 -Wvla -fstack-protector-strong -fdiag
nostics-color=auto -DINCLUDE_GENERATED_DECLARATIONS -D_GNU_SOURCE -I/build/neovim-LpFVCC/neovim-0.2.0/build/config -I/build/neovim-LpFVCC/neovim-0.2.0/src -I/usr/include -I/usr/include -I/u
sr/include -I/usr/include -I/usr/include -I/usr/include -I/usr/include -I/build/neovim-LpFVCC/neovim-0.2.0/build/src/nvim/auto -I/build/neovim-LpFVCC/neovim-0.2.0/build/include             
Compiled by [email protected]                                                                                                                                      
                                                                                                                                                                                             
Optional features included (+) or not (-): +acl   +iconv    +jemalloc +tui                                                                                                                   
For differences from Vim, see :help vim-differences                                                                                                                                          
                                                                                                                                                                                             
   system vimrc file: "$VIM/sysinit.vim"                                                                                                                                                     
  fall-back for $VIM: "/usr/share/nvim"   

Allow configuration to set lookup path for `prettier` cli on `.vimrc`

We should allow the user to be able to specify the prettier cli bin path on their .vimrc file

This would solve problems like the following:

Is there a way to override and specify a specific path for prettier to vim-prettier? (I cannot update the version of prettier in a project i'm working on)

Should not overwrite buffer when prettier fails to parse file

At the moment if we have an invalid file like this we are still overwriting the buffer with the prettier error output.

// @format
const foo x= (a, b) => {};

becomes

stdin: SyntaxError: Unexpected identifier (2:10)
  1 | // @format
> 2 | const foo x= (a, b) => {};
    |           ^
  3 | 

Expected behaviour:

Not overwrite buffer and display an error message

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.