Code Monkey home page Code Monkey logo

renamer.nvim's People

Contributors

axieax avatar bmulholland avatar filipdutescu avatar mastergordon 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

renamer.nvim's Issues

[Bug] Cursor defaults to beginning of line instead of end

Describe the bug

Maybe this is intended behavior, if it is, there should be an option to switch it. When I trigger the plugin, the default cursor position is at the beginning of the line, I'd expect it to be at the end.

To reproduce

Steps to reproduce the behavior:

  1. Call require('renamer').rename() on something

Expected behavior

The cursor position defaults to the end of the prompt in the popup.

Environment

  • Renamer: v1.0.0
  • Neovim: v0.5.1
  • OS: MacOS 12.0.1, Apple M1 chip

Screenshots

Actual

CleanShot-2021-11-11-at-06 59 01

Expected

CleanShot-2021-11-11-at-06 59 17

[Feature] Add rename locations to quickfix list.

Describe the issue

It would be great to add all of the locations of the rename to the quickfix list in order to make writing the changes easier.

Proposal

After renaming, add the locations of the renamed words to the quickfix list.

Alternatives

Additional context

[Bug] Paddings introduces a lot of unintended bugs.

Describe the bug

Using padding can introduce a lot of bugs with popup rendering, anywhere in the screen, as there is no validation on it.

To reproduce

Steps to reproduce the behavior:

  1. Setup renamer with a very large padding
  2. Call rename()
  3. See error

Expected behavior

Padding should be taken into consideration when drawing the popup.

Environment

  • Renamer: v0.3.1
  • Neovim: v0.5.1
  • OS: ArchLinux

Screenshots

Additional context

[Bug] `<c-c>` inserts `i` after clearing the line.

Describe the bug

<c-c> inserts i after clearing the line.

To reproduce

Steps to reproduce the behavior:

  1. Open a file with text
  2. Setup renamer
  3. Call renamer.rename()
  4. Press <c-c>

Expected behavior

The line is cleared and no text is added to it.

Environment

  • Renamer: v0.2.0
  • Neovim: v0.5.0
  • OS: ArchLinux

Screenshots

Additional context

[Bug] offset_encoding error when renaming

Describe the bug

Error when trying to rename a variable.

To reproduce

Install latest neovim and renamer, try to rename a variable.

Expected behavior

Variable should be renamed.

Environment

  • Renamer: 4.0.1
  • Neovim: v0.7.0-dev+907-g96aa7dd097
  • OS: Arch Linux, kernel 5.16.1

Error output

apply_workspace_edit must be called with valid offset encoding                                                                                                                       
Error executing vim.schedule lua callback: /usr/share/nvim/runtime/lua/vim/lsp/util.lua:366: offset_encoding: expected string, got nil                                               
stack traceback:                                                                                                                                                                     
        [C]: in function 'error'                                                                                                                                                     
        vim/shared.lua: in function 'validate'                                                                                                                                       
        /usr/share/nvim/runtime/lua/vim/lsp/util.lua:366: in function 'apply_text_edits'                                                                                             
        /usr/share/nvim/runtime/lua/vim/lsp/util.lua:778: in function 'apply_workspace_edit'                                                                                         
        ...site/pack/packer/start/renamer.nvim/lua/renamer/init.lua:486: in function '_apply_workspace_edit'                                                                         
        ...site/pack/packer/start/renamer.nvim/lua/renamer/init.lua:392: in function 'handler'                                                                                       
        /usr/share/nvim/runtime/lua/vim/lsp.lua:1025: in function ''                                                                                                                 
        vim.lua: in function <vim.lua:0>                                                                                                                                             
Press ENTER or type command to continue

[Bug] Prevent empty word submission

Describe the bug

You can use an empty string as the new name, which should not be allowed.

To reproduce

Steps to reproduce the behavior:

  1. Setup renamer
  2. Call renamer.rename()
  3. Submit an empty string as the new name

Expected behavior

An error should be issued and no renaming should take place (but the popup should close).

Environment

  • Renamer: v0.3.0
  • Neovim: v0.5.1
  • OS: ArchLinux

Screenshots

Additional context

[Bug] Changes is nil on any rename.

Describe the bug

I get an error saying that changes is nil everytime I rename something. The renaming itself looks like it's working correctly though.

To reproduce

Steps to reproduce the behavior:

  1. Rename a symbol

Expected behavior

The symbol is renamed and no errors occur.

Environment

  • Renamer: v3.0.3
  • Neovim: v0.6.0
  • OS: Pop! OS 21.10

Screenshots

image

Additional context

Just installed it and run its setup function providing only the title. Then I am calling the rename function through a mapping.

[Bug] Horizontal padding is interpreted as literal text

Describe the bug

First of all, thank you for making this amazing plugin!

The bug in question: horizontal padding can be removed with backspace and is interpreted as a part of the new variable name.

To reproduce

Set padding = { left = 3 } (or any number greater than 0) in require('renamer').setup and try renaming something with require('renamer').rename() in eg. a python script:

screenshot_453807

The padding can be removed by simply pressing backspace a bunch:

screenshot_138697

and if, instead of removing, I simply confirm with <CR> padding is interpreted as part of the new name (notice the 3 spaces in front of content causing an indentation error):

screenshot_182590

Expected behavior

The padding should be non-interactive and should not be treated like user input.

Environment

  • Renamer: 4.0.1
  • Neovim: 0.6.1
  • OS: Arch Linux

[Bug] Most keymaps break returning to the initial mode when `rename` was called.

Describe the bug

Besides <c-a> and <c-i>, all keymaps make the initial buffer stay in insert mode, regardless of the mode in which renamer.rename() was called in.

To reproduce

Steps to reproduce the behavior:

  1. Setup renamer
  2. Call renamer.rename() while in normal mode
  3. Press any keymap except <c-a> and <c-i> (i.e. <c-e>)
  4. Either close or submit the changes
  5. The initial buffer stays in insert mode, instead of normal

Expected behavior

The initial buffer should be in normal mode, same as before calling renamer.rename().

Environment

  • Renamer: v0.2.0
  • Neovim: v0.5.0 and v0.5.1
  • OS: ArchLinux

Screenshots

Additional context

[Bug] Bad popup rendering when renaming on first or second line

Describe the bug

This doesn't happen every time, and it seems to depend on the code.

  1. Try a code like this with sumneko_lua
local func = require("func")
return func.sum(1, 2)
  1. Rename func with cursor on first line
  2. You'll see the popup is cropped
    p1
  3. Rename func with cursor on second line
  4. You'll see popup title is substituted by popup content
    p2

Note: what you see above first line is barbar.nvim

Environment

  • Renamer: 814ddbb
  • Neovim: v0.6.0
  • OS: GNU/Linux

[Feature] Add better GitHub Release name

Describe the issue

Currently, only the tag name is put in the title of the GitHub Release.

Proposal

Add the project name to the title.

Alternatives

Additional context

[Feature] Add mappings for easier movement.

Describe the issue

There is no way to select the buffer contents or to move easier and faster than 1 letter at a time.

Proposal

Define key mappings to have better movement inside the renamer.nvim popup buffer and window.

Alternatives

Start with the <cword> selected. This might still be a good idea, but key mappings are more important, in my opinion.

Additional context

[Bug] a ( in front of every varable/function

Describe the bug

When I activate rename the popup with the variable/function name is always prefixed with " )" (see screenshot)

config:

                use {
                        'filipdutescu/renamer.nvim',
                        branch = 'master',
                        requires = { {'nvim-lua/plenary.nvim'} },
                        config = function()
                                require("renamer").setup()
                        end
                }

To reproduce

leader - rn

Expected behavior

Variable/function without being prefixed

Environment

  • Renamer: latest master
  • Neovim: 0.5.1-2
  • OS: Arch

Screenshots

2021-11-09_073314_674286659

[Bug] Error when using <cmd>lua require("renamer").rename()<cr>

Describe the bug

When I try to use this command I get an error, it won't let me change the name of a function.

To reproduce

Use version 0.7.0 of neovim, try to use that command and then, at least for me, it gives error.

Expected behavior

It is expected to perform the rename action after pressing enter.

Environment

  • Renamer: [I don't know how to know the version, but yesterday I updated the plugins.]
  • Neovim: [v0.7.0]
  • OS: [Fedora Linux], version: [5.17.6-300.fc36.x86_64]

Screenshots

image
image

[Feature]: make rename popup width customizable

Describe the issue

Hi, first of all thanks for this plugin
I think that popup looks small, I'd like it to be wider

Proposal

Is it possible to increase popup width? Maybe making it configurable by adding an option in setup()

[Bug] From `normal` mode, exiting `renamer.rename()` puts cursor one character back.

Describe the bug

Exiting renamer.rename() (by submission or cancellation), after being called from normal mode, puts the cursor back 1 character.

To reproduce

Steps to reproduce the behavior:

  1. Setup renamer
  2. Call renamer.rename() from normal mode
  3. Exit the popup by submission (<cr>) or cancellation (<esc>)
  4. Cursor is set 1 character back

Expected behavior

Cursor should remain in the initial position.

Environment

  • Renamer: develop
  • Neovim: v0.5.1
  • OS: ArchLinux

Screenshots

Additional context

[Feature] Add Emmy Lua documentation.

Describe the issue

There should be documentation on the public methods for users to reference in order to use the plugin.

Proposal

Add documentation comments for the "public" methods.

Alternatives

Use only a Neovim doc file. This however is limiting, as one needs to have the plugin installed in Neovim and the editor open to reference it.

Additional context

[Bug] Remove prompt option as it breaks keymaps.

Describe the bug

Prompt-mode seemed like a nice idea to have, but it breaks keymaps and there was no reason to add it besides having a nice prefix.

To reproduce

Steps to reproduce the behavior:

  1. Setup renamer with a prompt prefix (i.e. '> ')
  2. Call renamer.rename()
  3. Submit the rename
  4. See error

Expected behavior

Keymaps work as intended

Environment

  • Renamer: v0.2.1
  • Neovim: v0.5.1
  • OS: ArchLinux

Screenshots

Additional context

[Feature] Add images and videos to demo the project

Describe the issue

There is no way to know how the project works or looks.

Proposal

Add images and videos which showcase the features and general use cases of the project. Add a few in the project README.md.

Alternatives

Additional context

[Feature] Option to prompt renaming through nvim's prompt instead of UI

Describe the issue

Great project, I've been looking this type of plugin for a long time!

I personally would like it if there was a option to prompt the rename through the command input (not sure what its called) instead of a popup. It's just a personal thing, as I'm not a huge fan of having the popup.

Proposal

It would be nice to have something like in the screenshot below
image

[Bug] If the word to be renamed appears twice in the line, there is a chance popup won't show.

Describe the bug

For example, in the line function renamer.rename(opts), if one wants to rename rename, the popup won't show, as it appears once before, in the word renamer.

To reproduce

Steps to reproduce the behavior:

  1. Write the line from the example above
  2. Try to use renamer to rename the rename function name
  3. Popup doesn't show

Expected behavior

The popup should show up without problem.

Environment

  • Renamer: v4.0.0
  • Neovim: v0.6.1
  • OS: ArchLinux

Screenshots

Additional context

[Bug] Error when trying to rename a class (jdtls)

Describe the bug

When I rename a Java public class using renamer error appears and nothing is renamed. It's supposed to rename the class name, filename and references to the class in another files.

The error:

Error executing vim.schedule lua callback: ...l/.config/nvim/plugins/renamer.nvim/lua/renamer/init.lua:385: attempt to index field 'textDocument' (a nil value)
stack traceback:
        ...l/.config/nvim/plugins/renamer.nvim/lua/renamer/init.lua:385: in function 'handler'
        /usr/share/nvim/runtime/lua/vim/lsp.lua:957: in function 'cb'
        vim.lua:285: in function <vim.lua:285>

To reproduce

Steps to reproduce the behavior:

  1. Open a java file
  2. Move cursor to the public class name
  3. Call renamer
  4. Change text
  5. Press enter
  6. See the error

Expected behavior

The class gets renamed, the file gets renamed and references to the class also get renamed

Environment

  • Renamer: latest, 3.0.0+ doesn't work but it works in version 2.0.0
  • Neovim: v0.6.0
  • OS: Arch Linux
  • Plugins: nvim-lspconfig, nvim-jdtls

Screenshots

image

Additional context

I can supply a dummy java project to reproduce this.

How to map `<C-c>` to `<Esc>`

When using <C-c> inside of the renamer window it will execute the default
clear line and I've tried to remapping so as that it will close the
renamer window
like so:

  use {
    "filipdutescu/renamer.nvim",
    branch = "master",
    module = "renamer",
    config = function()
      local mappings_utils = require "renamer.mappings.utils"
      require("renamer").setup {
        mappings = {
          ["<c-e>"] = mappings_utils.set_cursor_to_end,
          ["<c-c>"] = "<Esc>",
          ["<c-u>"] = mappings_utils.clear_line,
        },
      }
    end,
  }

But is not working. So I was wondering what is the correct way

Thanks in advance.

[Bug] Rename prompt will be displayed even if no LSP is attached

Describe the bug

Attempting to rename text with no LSP attached will fail silently after displaying prompt for new name.

To reproduce

Steps to reproduce the behavior:

  1. Open file with no LSP attached.
  2. Run lua require('renamer').rename() on any word.
  3. Notice that nothing happens just like operation would be successful.

Expected behavior

A discreet message should be displayed and no input box should be opened if there is nothing to rename.

Environment

  • Renamer: v3.0.2
  • Neovim: v0.5.1
  • OS: Windows, version: 10

Screenshots

image

Additional context

When LSP is attached the prompt will be shown also for invalid elements, but at least there is a warning displayed afterward.

[Bug] Renamer doesn't work: Error executing lua ... attempt to index local p (a nil value)

Describe the bug

Calling manually & from insert mode results in error, from normal mode it works, but no popup window. Only statusline.

Update: I have just confirmed that the statusline renaming is only due to the keybind being the same for my lsp rename function, and is in fact, not a part of this plugin at all. In any case, this is still broken, even more so than I had thought, but it at least helped figure out a few inconsistencies with this issue.

To reproduce

When I use the shortcut (<F2> in insert) to call lua require("renamer").rename(), or enter it manually, I get an error:

E5108: Error executing lua ...site/pack/packer/start/renamer.nvim/lua/renamer/init.lua:267: attempt to index local 'p' (a nil value)
stack traceback:                                                                                                                                                                                                  
        ...site/pack/packer/start/renamer.nvim/lua/renamer/init.lua:267: in function '_create_default_popup_opts'                                                                                                 
        ...site/pack/packer/start/renamer.nvim/lua/renamer/init.lua:135: in function 'rename'                                                                                                                     
        [string ":lua"]:1: in main chunk

And when I run it from normal mode, it works, but it doesn't use the popup. Instead, it uses the statusline.

Expected behavior:

I would expect it to use the popup window at all times, and also to work instead of giving an error message.

Environment

  • Renamer: [current master]
  • Neovim: [NVIM v0.7.0-dev+761-g0d7a97224]
  • OS: [Linux], Arch

Screenshots

Error from manually calling: https://i.imgur.com/iyZ8NYn.png
Working in statusline: https://i.imgur.com/VSOCdhI.png

[Feature] Add (Neo)vim docs.

Describe the issue

There are no Neovim docs to reference the plugin while inside the editor.

Proposal

Add a doc file for Neovim.

Alternatives

Additional context

[Feature] Allow popup to work as a prompt

Describe the issue

The popup should be able to work as a prompt, having a customizable prompt prefix etc.

Proposal

Implement the prompt behaviour for the popup buffer.

Alternatives

Additional context

[Feature] Add tests `README.md`

Describe the issue

There is no README.md for tests, in order to help contributors and users run tests and describe how to write others.

Proposal

Add a lua/tests/README.md described how to run and write tests. It should also describe the frameworks and dependencies used for tests and how they should be structured.

Alternatives

Additional context

[Bug] When border is toggled off, popup is drawn 1 character away from the word start.

Describe the bug

When border is toggled off, popup is drawn 1 character away from the word start.

To reproduce

Steps to reproduce the behavior:

  1. Setup renamer with border = false
  2. Call rename()
  3. Popup is drawn 1 character away from the word start

Expected behavior

The popup should be aligned with the word start.

Environment

  • Renamer: v0.2.1
  • Neovim: v0.5.1
  • OS: ArchLinux

Screenshots

If applicable, add screenshots to help explain your problem.

Additional context

Add any other context about the problem here.

[Feature] a parameter in the rename function that allows to have NO value in the popup

Describe the issue

There are times that I just want to write a NEW name, and not renaming a part of it, and therefore deleting whole word and inputting a new one is slower.

Proposal

Add a paremeter in the rename function so I can make a dedicated mapping that will open the popup without any value in it, so I can just write the new name fast and easy.

[Feature] Add a handler for textDocument/rename

Describe the issue

I would like to be able to attach a handler to textDocument/rename which I can use to display renamed changes using nvim-notify.

Proposal

It would be nice to be able to pass a custom handler function into the rename function.

Alternatives

I am currently doing my own renamer (not too sure how to get the popup UI - which is why I want to try out this plugin.

Additional context

This is the handler function I am currently using:

This is how I am passing it into textDocument/rename:

[Feature] Ensure popup draws correctly on screen edges

Describe the issue

There is currently no checks on screen edges when drawing the popup.

Proposal

The project should take the edges into account and position the popup in a way that it is not obstructed by them.

Alternatives

Additional context

[Feature] Make references highlighting optional

Describe the issue

There is no way to opt-out of references highlighting.

Proposal

Make references highlighting optional through a new option in setup(), which by default is turned on.

Alternatives

Additional context

[Feature] Remove title if the width is not large enough.

Describe the issue

If the width of Neovim is small enough, there is no way to draw the popup with the title and have it shown properly.

Proposal

Check if the total popup width fits in the Neovim width and hide the title if it doesn't.

Alternatives

Additional context

[Feature] Create a release pipeline

Describe the issue

It is hard to make a release at the moment and to create the release notes and changelog.

Proposal

Create a release pipeline which generates a release with release notes and a CHANGELOG file.

Alternatives

Additional context

[Bug] bad argument #2 to 'format'

Describe the bug

When invoking rename I get

E5108: Error executing lua ...imvu47Wx/usr/share/nvim/runtime/lua/vim/lsp/handlers.lua:458: bad argument #2 to 'format' (number expected, got nil)

To reproduce

Steps to reproduce the behavior:

  1. Start neovim
  2. Open a file (tested with zsh and javascript)
  3. Invoke a keybinding to execute rename or type :lua require('renamer').rename() and hit Enter
  4. Observe bad argument #2 to 'format' (number expected, got nil) error

Expected behavior

The rename dialog shows

Environment

  • Renamer: [v1.0.0]
  • Neovim: v0.5.1
  • OS: [Xubuntu Linux], version: [21.04]

Additional context

Lsp Client: efm

[Feature] Add healthcheck.

Describe the issue

There is no way to check the health of the plugin (if all dependencies are met).

Proposal

Implement the health#renamer#check to expose the :checkhealth <plugin> call.

Alternatives

Additional context

[Bug] If the first row of a file is changed by rename, quickfix list is not properly set.

Describe the bug

If the first row of a file is changed by rename, quickfix list is not properly set.

To reproduce

Steps to reproduce the behavior:

  1. Setup renamer with qf list
  2. Rename a word in the first line of a file
  3. Open quickfix list (:copen)
  4. See error

Expected behavior

The first row should be properly set.

Environment

  • Renamer: develop
  • Neovim: v0.5.0
  • OS: ArchLinux

Screenshots

If applicable, add screenshots to help explain your problem.

Additional context

Add any other context about the problem here.

[Bug] Cancelling `rename()` from `insert` mode puts cursor 1 character ahead.

Describe the bug

Cancelling rename() from insert mode puts cursor 1 character ahead.

To reproduce

Steps to reproduce the behavior:

  1. Setup renamer()
  2. Setup an insert mode keymap for calling renamer.rename()
  3. Call renamer.rename() using the keymap
  4. Cancel the operation
  5. Cursor is one character ahead.

Expected behavior

The cursor should stay in the same position as it was when renamer.rename() was called.

Environment

  • Renamer: v0.2.1
  • Neovim: v0.5.1
  • OS: ArchLinux

Screenshots

Additional context

[Feature] Add `master` build status in `README.md`

Describe the issue

Only the build status for the develop branch is shown in the README.md. Since nightly Neovim releases sometimes fail and cannot be retrieved, there should also be a master build status, to ensure users that the latest version works.

Proposal

Add a badge for the master build workflow status.

Alternatives

Additional context

[Bug] Popup is offset when the same word appears twice in the same line.

Describe the bug

If the word to be renamed appears more than once in the line and is more towards the end of the line, the popup is offset in a weird way.

To reproduce

Steps to reproduce the behavior:

  1. Setup renamer
  2. Write a line where the word to be renamed appears twice (i.e. local maps = require 'maps')
  3. Call rename() on the first occurence
  4. See error

Expected behavior

The popup should be placed below the word under the cursor.

Environment

  • Renamer: v0.2.1
  • Neovim: v0.5.1
  • OS: ArchLinux

Screenshots

renamer_offset_bug

Additional context

The issue is from renamer._get_word_boundaries_in_line(). The logic should be changed.

[Feature] Throw error if the popup cannot be drawn above or below the current line.

Describe the issue

Currently, if the popup has not enough space to be drawn above or below the current line, its creation is undefined behaviour.

Proposal

Throw an error if there is not enough space for the popup to be drawn, letting the user know why renaming failed. In order to make it possible to still rename, default to the basic vim.lsp.buf.rename() functionality, instead of the popup.

Alternatives

Additional context

[Feature] Add title highlighting.

Describe the issue

plenary.nvim's popup has the option to set a custom highlight to the popup title. renamer.nvim however does not provide this customization option.

Proposal

Add a new highlight for the popup title.

Alternatives

Additional context

[Bug] Error when attempting to rename empty space

Describe the bug

Invoking rename method will throw this error when you attempt it on empty space:

E5108: Error executing lua ~\.vim-plug\renamer.nvim/lua/renamer/init.lua:129: attempt to perform arithmetic on local 'word_start' (a nil value)
stack traceback:
	~\.vim-plug\renamer.nvim/lua/renamer/init.lua:129: in function 'rename'
	[string ":lua"]:1: in main chunk

To reproduce

Steps to reproduce the behavior:

  1. Place cursor on space or newline.
  2. Run lua require('renamer').rename().
  3. See error.

Expected behavior

There should be short and less distracting message displayed instead.

Environment

  • Renamer: v3.0.2
  • Neovim: v0.5.1
  • OS: Windows, version: 10

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.