Giter VIP home page Giter VIP logo

indium's Introduction

Indium

MELPA Emacs Build Status Documentation Status Liberapay Gitter logo

A JavaScript development environment for Emacs.

Indium connects to a browser tab or nodejs process and provides many features for JavaScript development, including:

  • a REPL (with auto completion) & object inspection;
  • an inspector, with history and navigation;
  • a scratch buffer (M-x indium-scratch);
  • JavaScript evaluation in JS buffers with indium-interaction-mode;
  • a stepping Debugger, similar to edebug, or cider.

Documentation

Installation instruction and other documentation can be found on readthedocs.

WARNING: Indium 2.0 now uses a client/server architecture, see installation instuctions.

Screenshots

The stepping debugger

Debugger

The REPL with company-mode

REPL

The REPL showing clickable output

REPL

The inspector

Inspector

Missing features

Indium is young, here's a list of missing/wanted features

  • Code evaluation using C-x C-e from project JS buffers
  • Adding breakpoints (to remove the need for debugger statements)
  • Network inspector (could get inspiration from restclient.el)
  • DOM inspector
  • Start processes (chromium, node, grunt, gulp, etc.) from Emacs and attach a indium connection to it.

Backends

There is currently support for Chrom[e|ium] & nodejs. The firefox backend is in the TODO list.

indium's People

Contributors

allforabit avatar arthurgleckler avatar damiencassou avatar dependabot[bot] avatar diasbruno avatar felipeochoa avatar jojojames avatar juergenhoetzel avatar mallt avatar marsam avatar mattiasb avatar miangraham avatar nateeag avatar nicolaspetton avatar sandinmyjoints avatar syohex avatar tarsius avatar tatrix avatar timmarinin avatar tmurph avatar torgeir avatar ybonnemay avatar zerabba 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

indium's Issues

Emacs stopping without a reason

Sometimes Emacs stops on a line. The websocket buffer says it's because of a breakpoint but I killed all breakpoints (with C-c b k) and I don't see any anymore.

Firefox support

I'm currently trying to implement the Firefox backend. However, given the major differences between the Firefox remote debugging protocol and the Chrome one, I think it could be nice to include a todo list here.

  • Implement the Firefox Remote Debugger Protocol Backend
    • Implement the protocol API (we might look at this).
    • Implement a function to query tabs information
    • Since Firefox doesn't have a per tab protocol should we use only one process for all tabs? Also each times we make a new connection, Firefox display a prompt to accept remote debugging.
    • Implement the evaluation function
    • Implement the completion function
    • Implement the debugger functions
      - [ ] Implement the breakpoints functions
      • Implement the resume function
      • Implement the step-into function
      • Implement the step-out function
      • Implement the step-over function
      • Implement the continue function
          - [ ] Implement pausing on exceptions and get them
    • Implement the property inspector
    • Sync the console logs

That's all for now.

Indium should propose existing workspaces when it can't find one

Sometimes I do M-x indium-connect-to-chrome from a directory outside of the JS project. This is annoying because the debugger won't find my local files. It would be great if indium-connect-to-chrome could ask for a known workspace to bind to if it can't find any where indium-connect-to-chrome is started. That could for example be implemented with a defcustom remembering workspaces.

Improve console printing

Currently if I log multiple things like this:

console.log("this", "is", "sparta");

What I get is:

"this"
"is"
"sparta"
undefined

It would be useful to merge short output into one line separated by comma.

Another thing which is extremely useful is a file:line of the message source. Currently there is no way to distinguish between

console.log("one", "two")

and

console.log("one");
console.log("two"):
```.

Preview booleans are always rendered as false

If I enter [{"one": true}] into the JS repl, then inspect the resulting array, the buffer starts with:

Array[1]

  0: Object { one: false }

If I enter [true] then the result is printed with preview as:

Array[1] [ false ]

In both cases, inspecting the value itself renders the boolean correctly. I have tracked this to indium-webkit--description where the case for true is never matched. If I change the case matched for to the string "true" then both cases reported above are correct.

Incidentally I tried entering {"key":true} at the repl to test that directly rather than embedding it in an array, but got:

SyntaxError: Unexpected token : {  }

WS error: make client process failed: Connection refused

When trying to evaluate the following command (from Getting up and Running):

M-x indium-connect-to-nodejs RET 127.0.0.1 RET PORT RET PATH

I get the following error:

websocket-open: make client process failed: Connection refused, :name, websocket to ws://localhost:9229//c6face84-df0e-4af2-90b1-c3ce0b54b4fd, :buffer, nil, :host, localhost, :service, 9229, :nowait, nil

This is on:

  • Emacs 25.1
  • MacOS 10.12.4
  • node 7.2.1

any ideas what's happening? project looks great btw...want to get it working so I can convert my team from Atom...

Indium keybindings affect other modes like Org-mode

(use-package indium
  :ensure t
  :init
  (dolist (hook '(js-mode-hook
                  js2-mode-hook
                  js3-mode-hook
                  ))
    (add-hook hook #'indium-interaction-mode))
  :config
  (setq indium-chrome-executable "google-chrome-unstable")
  )

I enabled Indium like upper. And found that [C-x C-e] is bind to indium-eval-last-node.

Not able to get up and running

I tried following the documentation to get Indium running, but get stuck here:

"Start a process with M-x indium-run-node."

That command doesn't seem to exist.

Any ideas?

Enhance inspector

Currently simple object like

let foo = {bar: "Hello baz!"};
foo; // C-x C-e

is printed like

  __defineGetter__: function {  }
  __defineSetter__: function {  }
  __lookupGetter__: function {  }
  __lookupSetter__: function {  }
  __proto__: function {  }
  bar: "Hello baz!"
  constructor: function {  }
  hasOwnProperty: function {  }
  isPrototypeOf: function {  }
  propertyIsEnumerable: function {  }
  toLocaleString: function {  }
  toString: function {  }
  valueOf: function {  }

It would be awesome if default noisy methods could be hidden or at least moved down.

Opening filenames in REPL inside Emacs

Some error messages in the REPL contain JS file names:

Error: TypeError: Cannot read property 'forEach' of undefined… {  }
From http://localhost:7002/Client/js/core/widgets/panelGroupWidget.js

I would like to be able to find this file within Emacs.

No idea why Chromium is waiting for Emacs

Sometimes, Chromium waits for Emacs and Emacs shows a debugger at a particular line but there is no clue why. Maybe it's an invisible breakpoint, maybe it's an error in the code. Would it be possible to be more explicit?

WS Error!

Hi.
when I try jade-connect-to-chrome I get

WS Error! on-open (void-function seq-map-indexed)

I'm using emacs 25.1.1 on Manjaro (Arch based) Linux. Any idea? Thanks

Websockets error

Hi, first off - thank you very much for this great package :)

After upgrading recently, I get these error messages when I try to connect to a running chrome instance:

WS Error! on-open (void-function seq-map-indexed)
WS Error! on-message (void-function seq-map-indexed) [4 times]

It used to work before, and I don't have devtools open.

I'm on Windows 8.1 using Emacs 25.1.

Websocket error when opening a second REPL buffer

How to reproduce:

  1. open a jade connection on a chrome tab
  2. duplicate the tab on chrome
  3. close the first one but keep the REPL buffer open
  4. open a jade connection to the chrome tab
WS Error! on-open (wrong-type-argument stringp nil)
WS Error! on-message (wrong-type-argument integer-or-marker-p nil)
(setq websocket-debug t)
(setq websocket-callback-debug-on-error t)

screenshot from 2017-03-06 15-04-25

indium repl doesn't work

Running M-x indium-run-node RET node results in

exec-path-from-shell-printf: Non-zero exit code from shell E:/eoksni-dir/portable/emacs/emacs-25.2-x86_64/libexec/emacs/25.2/x86_64-w64-mingw32/cmdproxy.exe invoked with args ("-l" "-i" "-c" "c:/Program Files (x86)/Gow/bin/printf.exe ’__RESULT\\000%s\\000%s\\000__RESULT’ \"${PATH-3ee3c256aae424afd6f79e5709ff36c2}\" \"${MANPATH-3ee3c256aae424afd6f79e5709ff36c2}\"").  Output was:
"’c:/Program’ is not recognized as an internal or external command,
operable program or batch file.

The function to drop this error was indium--setup-exec-path and it seems to be optional (by the way, to me it seems like a terrible idea to manipulate global exec-path without warning or interacting with user in any way - if I understand correctly what this function does) so I executed (setq indium-exec-path-setup t) by myself to skip this function, then node process is started fine and I am even given the repl buffer:
image
But when I press RET, nothing happens. I looked up that RET is bound to indium-repl-return, so I M-x'ed it with same result - nothing happens at all, no errors in *Messages*.

I don't know if it is relevant, but I start indium-run-node with this file:

/**
 * adsfasdfasdfasfd
 * @param {*asdfasf} input 
 */
function qwer(input) {
    const aaa = "asdf";
    let bbb = "vcvzx";
    for (let i = 0; i < aaa.length; ++i) {
        let mmm = 10;
        let bbb = 111111;
    }
}
qwer()

By the way, I also tried M-x indium-scratch RET 5+5 C-x C-e also with no success, just nothing happens without any error messages.

Win 10, emacs 25.2.1, started it with emacs -Q, installed indium like so:

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/"))
(package-initialize)

M-x package-refresh-contents
M-x package-install RET indium

breakpoints not hit

indium   : 20170504.117
gnu emacs: 25.1.1
chrome   : 58.0.3029.96 (64-bit)

App uses Oracle Jet 3.0.0 which uses require.js and knockout.

The top index file has

<script data-main="ui/js/main" src="jet-v3.0.0/js/libs/require/require.js"></script>

I start up chrome via:

open -n "/Applications/Google Chrome.app" --args --user-data-dir=/tmp/hcChromeDebugUserDataDir/  --remote-debugging-port=9222 http://localhost:8080/ui/

I then do indium-connect-to-chrome

It asks for Host/Port/Tab

I reload the page and it hits a breakpoint that I did not set. Chrome says Paused in Emacs debugger

Emacs shows the code it is stopped at in a buffer named *JS Debugger*

I press s and see:

* returnFromLogin <http://localhost:8080/ui/ui/js/utils.js>
  Closure <http://localhost:8080/ui/ui/js/main.js>

Everything seems to work at this breakpoint (e.g., locals, following links, etc).

PROBLEM:

If I visit either of those files (or any other javascript file in the project) and explicitly set a breakpoint, the app never stops at the breakpoint.

NOTE: when I use chrome's more tools / developer tools - breakpoints work as expected.

Is OS Windows not supported?

I experience a lot of weird behavior on Windows - can't even press RET in the repl buffer. So should I make a detailed bug report or Windows is simply not supported so I shouldn't bother?

WS Error! on-open (void-function seq-map-indexed)

I get this when I run jade-connect-to-chrome. Using chromium.

GNU Emacs 25.1.1 (x86_64-apple-darwin13.4.0, NS appkit-1265.21 Version 10.9.5 (Build 13F1911)) of 2016-09-20

Also, when I do (require 'jade) I get:

(file-error "Cannot open load file" "No such file or directory" "seq-25")

Ideas?

Sourcemap support

Hi. Please take a look at https://github.com/TatriX/kite-mini.el
I've added some basic sourcemap support for similiar to jade kite-mini project.
It's actually very primitive but I hope you can find it usefull because currently most of the projects use some kind of transformers like babel or typescript.

So to make it work I'm using the following:

(defun kite-mini-update-custom ()
  (interactive)
  (let ((default-directory "~/my-projects/"))
    (shell-command "npm run build" "*kite-mini-compilation*"))
  (kite-mini-call-rpc
   "Debugger.setScriptSource"
   (let ((script (--find (string-suffix-p "my-project/dist/application.js" (plist-get it :url))
                         kite-mini-rpc-scripts)))
     (plist-put script :source-map (cons 'lazy-source-map "~/www/my-project/dist/application.js.map"))
     (list :scriptId (plist-get script :id)
           :scriptSource (kite-mini--get-string-from-file "~/www/my-project/dist/application.js")))
   (lambda (result)
     (kite-mini-send-eval
      "window.dispatchEvent(new CustomEvent('change', {detail: {filename: 'application.js'}}))"
      (lambda (result) (message "Kite update done"))))))

Then in the buffer with kite-mini-mode I can use C-c C-k to compile the project and update it on the fly and still get sourcemaps, so I can see actual code lines in the repl buffer.

Infinite Loop Protection

I accidentally evaluated the buffer in indium-scratch, which had an infinite loop as written. The REPL was stuck printing returned values.

After quitting indium -- not sure if this was the right course of action -- I saw a bunch of errors scrolling through the minibuffer, too quickly to read.

Then Emacs froze.

Again, not sure if there is a better command to run, or if this is really a node.js issue, but it would be nice if there were some way to stop evaluation of the loop.

test failure on Travis Linux: "No buffer named *JS REPL*"

I was trying to update a Homebrew formula for Indium, and when Travis runs buttercup -l test/test-helper.el -L . on a "Precise" Linux worker I see these test failures:

========================================
Repl output should display a prompt
error: (error "No buffer named *JS REPL*")
========================================
Repl output should display a welcome message
error: (error "No buffer named *JS REPL*")
========================================
Repl output should be able to clear all output
error: (error "No buffer named *JS REPL*")
========================================
Repl output should be able eval and print results
error: (error "No buffer named *JS REPL*")
========================================
Repl output should be able to inspect objects
error: (error "No buffer named *JS REPL*")
Ran 90 specs, 5 failed, in 28.7 seconds.

Full logs: https://travis-ci.org/dunn/homebrew-emacs/jobs/241658581#L1308

Node is installed, and the tests pass on the macOS worker. Any idea what might be going on? Thanks!

Add hook for set-script-source

It's useful to run some code on the emacs/js side when script was updated.
For example I want to:

(indium-eval "window.dispatchEvent(new Event('patch'))")

in the hook and then listen to it in the js app to rerende the page.

Issues with update to Version: 20170719.643

Here's the output

Leaving directory ‘c:/Users/Julian/.emacs.d/elpa/indium-20170719.643’

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-backend.el at Thu Jul 20 00:54:25 2017
Entering directory ‘c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/’

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-breakpoint.el at Thu Jul 20 00:54:25 2017
indium-breakpoint.el:33:1:Error: Cannot open load file: No such file or directory, sourcemap

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-chrome.el at Thu Jul 20 00:54:25 2017
indium-chrome.el:36:1:Error: Cannot open load file: No such file or directory, sourcemap

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-debugger-frames.el at Thu Jul 20 00:54:25 2017
indium-debugger-frames.el:27:1:Error: Cannot open load file: No such file or directory, sourcemap

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-debugger-litable.el at Thu Jul 20 00:54:25 2017

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-debugger-locals.el at Thu Jul 20 00:54:26 2017

In end of data:
indium-debugger-locals.el:108:1:Warning: the following functions are not known to be defined:
    indium-debugger-get-current-scopes,
    indium-debugger-get-scopes-properties

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-debugger.el at Thu Jul 20 00:54:26 2017
indium-debugger.el:34:1:Error: Cannot open load file: No such file or directory, sourcemap

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-faces.el at Thu Jul 20 00:54:26 2017

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-inspector.el at Thu Jul 20 00:54:26 2017

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-interaction.el at Thu Jul 20 00:54:26 2017
indium-interaction.el:37:1:Error: Cannot open load file: No such file or directory, sourcemap

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-nodejs.el at Thu Jul 20 00:54:26 2017
indium-nodejs.el:45:1:Error: Cannot open load file: No such file or directory, sourcemap

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-render.el at Thu Jul 20 00:54:26 2017

In end of data:
indium-render.el:201:1:Warning: the function ‘seq-map-indexed’ is not known to
    be defined.

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-repl.el at Thu Jul 20 00:54:26 2017

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-scratch.el at Thu Jul 20 00:54:26 2017
indium-scratch.el:27:1:Error: Cannot open load file: No such file or directory, sourcemap

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-script.el at Thu Jul 20 00:54:26 2017
indium-script.el:32:1:Error: Cannot open load file: No such file or directory, sourcemap

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-structs.el at Thu Jul 20 00:54:26 2017

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-webkit.el at Thu Jul 20 00:54:27 2017
indium-webkit.el:40:1:Error: Cannot open load file: No such file or directory, sourcemap

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium-workspace.el at Thu Jul 20 00:54:27 2017

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/indium.el at Thu Jul 20 00:54:27 2017
indium.el:51:1:Error: Cannot open load file: No such file or directory, sourcemap

Compiling file c:/Users/Julian/.emacs.d/elpa/indium-20170719.643/run-lint.el at Thu Jul 20 00:54:27 2017

jade-connect-to-chrome not available

Hello,

I followed your instructions until the point

M-x jade-connect-to-chrome

But the command isn't available. What could be wrong?

I use Emacs 25.1 with prelude installed.

Name has trademark issues

In case you weren't aware, there's a trademark issue here. See pugjs/pug/issues/2184 for more information...probably a wise idea to rename the project.

TL;DR: Jade was forced to switch to Pug. You'll face the same issues.

Emacs sometimes freezes while opening a connection

It already happened a few times that Emacs freezes for around 10 seconds consuming 100% CPU after I politely asked M-x indium-connect-to-chrome. After the delay, the REPL gets refreshed and everything is back to normal.

Cannot inspect :json-false

While in the debugger, I typed C-x M-i on a boolean variable.

Exception in websocket callback! (wrong-type-argument stringp :json-false)

Wrong type argument: arrayp, nil

Sometimes, while debugging, I'm not able to inspect (C-c M-i or C-x C-e) objects. I always get Wrong type argument: arrayp, nil. Debugging Jade code reveals that jade-interaction-node-before-point calls js2-node-parent which return nil.

The "locals" view only show a part of objects without telling its incomplete

When displaying the locals (l), I see

session: Object { settings: Object, redirectToPeriod: function, getPeriod: function, setPeriod: function, onPeriodChange: function }

But session contains other keys beyond these. I would like to get a ... at the end to show more keys are present but can't be displayed.

While in debugger, I can't see the value of objects

  1. Add a breakpoint
  2. Make sure to hit it
  3. The debugger prints a message in the echo area
  4. Move the cursor to a expression and press C-x C-e
  5. You won't see the result in the echo area as the debugger keeps printing there

Can only perform operation while paused.

M-x indium-run-chrome
connect to a tab.
add throw "test" to a code.
On entering debugger press SPC.
After that indium will give me Can only perform operation while paused. on most of the requests.

If I choose "continue" everyting is fine though.

WS Error when trying to connect to nodejs process

I get the following error when I try to connect to a nodejs process

WS Error! on-close (wrong-type-argument stringp nil)
error in process filter: websocket-outer-filter: Invalid HTTP header sent
error in process filter: Invalid HTTP header sent

This is what I got in *backtrace* when I enabled toggle-debug-on-error

Debugger entered--Lisp error: (websocket-invalid-header . "Invalid HTTP status line")
  signal(websocket-invalid-header "Invalid HTTP status line")
  websocket-outer-filter([cl-struct-websocket closed nil #[257 "\301\203��\301 \210\302�\300\"\207" ["ws://127.0.0.1:9229/node" nil jade-webkit--handle-ws-open] 4 "\n\n(fn WS)"] jade-webkit--handle-ws-message jade-webkit--handle-ws-closed jade-webkit--handle-ws-error nil nil nil "ws://127.0.0.1:9229/node" nil nil #<process websocket to ws://127.0.0.1:9229/node> nil "yfSHlJgu85t/P7Pku3qBnVAV5X4=" nil] "HTTP/1.0 400 Bad Request
\nContent-Type: text/html; charset=UTF-8
\n
\nWebSockets request was expected
\n")
  #[(process output) "\303�\304\"�\305	\n\")\207" [process websocket output process-get :websocket websocket-outer-filter] 3](#<process websocket to ws://127.0.0.1:9229/node> "HTTP/1.0 400 Bad Request
\nContent-Type: text/html; charset=UTF-8
\n
\nWebSockets request was expected
\n")

I'm running emacs master build on macOS Sierra.

Disconnecting kills buffers with active interaction mode

If I enable jade-interaction-mode in a buffer and then eval an expression, that buffer will be killed upon calling jade-quit. This is unexpected and undesirable. If no expressions are eval'd they are not killed.

I think it would be best to leave all jade buffers open, but disable jade-interaction-mode for source buffers and mark the other buffers as read-only.

Using version 20161210.804 from melpa.

Bad option: --listen

I installed node-nightly, but even after that I can not see any listen option. I tried --inspect and --debug but it runs the program straight away and when I try to connect from emacs to that port it gives me failure..

sandric@sandric-mac ~> node-nightly -v
v7.0.0-nightly2016082451f96dfcfc
sandric@sandric-mac ~> node -v
v5.1.0
sandric@sandric-mac ~> node-nightly --listen test.js
/usr/local/lib/node_modules/node-nightly/node-nightly/bin/node: bad option: --listen

Not clear if I should close current connection when opening a new one

When opening a connection, Indium will often ask:

Close the current Indium connection? (y or n)

There is no clue what will happen if I answer No to this question. I propose this instead:

This requires closing the current connection. Are you sure? (y or n)

I can fix that if you agree on the problem and proposed solution.

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.