Git Product home page Git Product logo

express-pouchdb's Introduction

PouchDB – The Database that Syncs!

Build Status Coverage Status Greenkeeper badge npm version jsDelivr Hits

PouchDB is an open-source JavaScript database inspired by Apache CouchDB that is designed to run well within the browser.

PouchDB was created to help web developers build applications that work as well offline as they do online.

Using PouchDB

To get started using PouchDB, check out the web site and API documentation.

Getting Help

The PouchDB community is active in #pouchdb on the CouchDB Slack, in the Google Groups mailing list, and on StackOverflow. Or you can mastodon @pouchdb!

If you think you've found a bug in PouchDB, please write a reproducible test case and file a Github issue.

Prerelease builds

If you like to live on the bleeding edge, you can build PouchDB from source using these steps:

git clone https://github.com/pouchdb/pouchdb.git
cd pouchdb
npm install

After running these steps, the browser build can be found in packages/node_modules/pouchdb/dist/pouchdb.js.

Changelog

PouchDB follows semantic versioning. To see a changelog with all PouchDB releases, check out the Github releases page.

For a concise list of breaking changes, there's the wiki list of breaking changes.

Keep in mind that PouchDB is auto-migrating, so a database created in 1.0.0 will still work if you open it in 4.0.0+. Any release containing a migration is clearly marked in the release notes.

Contributing

We're always looking for new contributors! If you'd like to try your hand at writing code, writing documentation, designing the website, writing a blog post, or answering questions on StackOverflow, then we'd love to have your input.

If you have a pull request that you'd like to submit, please read the contributing guide for info on style, commit message format, and other (slightly!) nitpicky things like that. PouchDB is heavily tested, so you'll also want to check out the testing guide.

express-pouchdb's People

Contributors

adamshih avatar calvinmetcalf avatar christophwitzko avatar daleharvey avatar garrensmith avatar gr2m avatar greenkeeperio-bot avatar janl avatar jerem avatar klaustrainer avatar madarche avatar marten-de-vries avatar mohlsen avatar mroeder avatar mshick avatar nick-thompson avatar nickcolley avatar nolanlawson avatar peterdavehello avatar robotlovesyou avatar rozek avatar rudasn avatar ryanramage avatar tahmmee avatar theotx avatar tyler-johnson avatar yaronyg 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

express-pouchdb's Issues

api.changes response format

daleharvey/pouchdb#685

Dale brings up the good point that this is a pouchdb-server problem... should fix that.

Error format is wrong

When testing against PouchDB Server, the tests fail on "destroy a pouch." Looking through, I see the point at which PouchDB Server starts to behave differently from CouchDB is when reporting an error.

Couch says:

{"error":"not_found","reason":"missing"}

PouchDB Server says:

{
  "status": 404,
  "name": "not_found",
  "message": "missing",
  "error": true
}

Investigate using dscape/nano's test suite

For a while I was trying to migrate the couchdb test suite out of couchdb and into a usable fashion for testing the REST interface now provided by express-pouchdb. Looks like nano already has a test suite exactly for that purpose.

Update Fauxton

Or use a submodule or something, so we can always get the freshest Fauxton. Also a custom skinning of the UI would be neat.

Fix _all_dbs

This can be done with created and destroyed events. No need for fs or anything manual.

hey here's an error

Tired of seeing this in the console output. Also it doesn't seem to mean anything, because the test suite passes regardless. We should just silence it.

Difficulties syncing ...

Hi Nick,

I tried very hard syncing and succeeded. But why?
Put and allDocs worked fine locally and remotely.

But syncing did not work except

  • with irisCouch (instead of express-pouchdb) or
  • with pouchdb_nightly.min.js I found in the examples todo!

Using express-pouchdb it does NOT work with the the official pouchdb_nightly.js nor the ones I build and checked out via git. (And I worked myself back until Oktober)

Whats the matter?

It always complained about
http://localhost:7000/db/test2/_local/e20107b2e1836b64b0becf475b220c19
or
http://localhost:7000/db/test1/_local/01efcdbf2162a37b033c29b21846444a?_nonce=oEakUqdqiN81JfrK
not beeing found (or similar)

(markdown has eaten the underscore in front of locale in the above links)

Add the "port" to location header

Not sure about the importance of this issue but it would be good for a client that uses the location header.
There are 2 invocations of res.location(loc) in index.js.

Just add this

    var loc = req.protocol
      + '://'
      + ((req.host === '127.0.0.1') ? '' : req.subdomains.join('.') + '.')
      + req.host
      + ':' + req.socket.localPort  // <-- added line
      //           ...

No attachment support for design documents

Currently, when detecting a design document the handler for attachments directly skips through. But, design docs are able to have attachments. And what's more, they are often used: in CouchApps, which I'm currently trying to use as practical tests for the new show/list/update/rewrite/validate stuff.

Test in Travis

Most of the action seems to happen in this module, so it's scary that we don't have Travis.

Continuous replication from CouchDB -> PouchDB server doesn't work

Seems to be because of this:

POST /todos/_revs_diff 200 1.483 ms - 2
POST /todos/_revs_diff 200 1.832 ms - 2
POST /todos/_revs_diff 200 2.794 ms - 2
POST /todos/_revs_diff 200 3.227 ms - 2
POST /todos/_revs_diff 200 2.880 ms - 2
POST /todos/_ensure_full_commit 404 0.601 ms - 39

Upgrade Express dependency

Seems like Express 3.4.8 is out, and I use "3.x" in my project to grab the latest compatible version, but your library is specifically pinned to 3.3.5.

Given that Semver specifies 3.x releases shouldn't break compatibility, might you consider making your dependency a bit more flexible?

Thanks.

npm package is broken

I suspect the metadata is just wrong:

oliver@astro ~/Documents/code/darts $ npm install
npm http GET https://registry.npmjs.org/express-pouchdb/0.1.1
npm http 200 https://registry.npmjs.org/express-pouchdb/0.1.1
npm http GET https://registry.npmjs.org/express-pouchdb/-/express-pouchdb-0.1.1.tgz
npm http 404 https://registry.npmjs.org/express-pouchdb/-/express-pouchdb-0.1.1.tgz
npm ERR! fetch failed https://registry.npmjs.org/express-pouchdb/-/express-pouchdb-0.1.1.tgz
npm ERR! Error: 404 Not Found
npm ERR! at WriteStream. (/usr/lib/node_modules/npm/lib/utils/fetch.js:57:12)
npm ERR! at WriteStream.EventEmitter.emit (events.js:117:20)
npm ERR! at fs.js:1596:14
npm ERR! at /usr/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:103:5
npm ERR! at Object.oncomplete (fs.js:107:15)
npm ERR! If you need help, you may report this log at:
npm ERR! http://github.com/isaacs/npm/issues
npm ERR! or email it to:
npm ERR! [email protected]

npm ERR! System Linux 3.10-2-amd64
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /home/oliver/Documents/code/darts
npm ERR! node -v v0.10.17
npm ERR! npm -v 1.3.8
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /home/oliver/Documents/code/darts/npm-debug.log
npm ERR! not ok code 0

TypeError: cannot call method 'end' of undefined

Saw this while testing against the PouchDB test suite, not sure what it means:

TypeError: Cannot call method 'end' of undefined
    at ReadStream._cleanup (/Users/nolan/workspace/pouchdb/node_modules/levelup/lib/read-stream.js:106:18)
    at ReadStream.destroy (/Users/nolan/workspace/pouchdb/node_modules/levelup/lib/read-stream.js:113:8)
    at Object.cancel (/Users/nolan/workspace/pouchdb/lib/adapters/leveldb.js:847:22)
    at Changes.<anonymous> (/Users/nolan/workspace/pouchdb/lib/changes.js:184:18)
    at Changes.cancel (/Users/nolan/workspace/pouchdb/node_modules/argsarray/index.js:16:18)
    at PouchDB.onDestroy (/Users/nolan/workspace/pouchdb/lib/changes.js:39:10)
    at PouchDB.g (events.js:180:16)
    at PouchDB.EventEmitter.emit (events.js:117:20)
    at EventEmitter.destructionListener (/Users/nolan/workspace/pouchdb/lib/constructor.js:129:16)
    at EventEmitter.emit (events.js:117:20)

TypeError: cannot read property 'id' of undefined

Again, can only be repro'ed in Node, using npm run test against PouchDB-server.

GET /test_repl/ 200 1ms - 65b
GET /test_repl/_local/_pouch_dependentDbs 404 1ms - 49b

/Users/nolan/workspace/pouchdb/lib/adapters/leveldb.js:791
        if (opts.cancelled || opts.done || utils.isLocalId(metadata.id)) {
                                                                   ^
TypeError: Cannot read property 'id' of undefined
    at /Users/nolan/workspace/pouchdb/lib/adapters/leveldb.js:791:68
    at dispatchError (/Users/nolan/workspace/pouchdb/node_modules/levelup/lib/util.js:131:7)
    at LevelUP.get (/Users/nolan/workspace/pouchdb/node_modules/levelup/lib/levelup.js:177:12)
    at SubDB.SDB.get (/Users/nolan/workspace/pouchdb/node_modules/level-sublevel/sub.js:73:14)
    at Transform.changeListener [as _transform] (/Users/nolan/workspace/pouchdb/lib/adapters/leveldb.js:790:23)
    at Transform._read (/Users/nolan/workspace/pouchdb/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js:184:10)
    at Transform._write (/Users/nolan/workspace/pouchdb/node_modules/through2/node_modules/readable-stream/lib/_stream_transform.js:172:12)
    at doWrite (/Users/nolan/workspace/pouchdb/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:238:10)
    at writeOrBuffer (/Users/nolan/workspace/pouchdb/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:228:5)
    at Transform.Writable.write (/Users/nolan/workspace/pouchdb/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:195:11)
    at write (/Users/nolan/workspace/pouchdb/node_modules/levelup/node_modules/readable-stream/lib/_stream_readable.js:605:24)
    at flow (/Users/nolan/workspace/pouchdb/node_modules/levelup/node_modules/readable-stream/lib/_stream_readable.js:614:7)
    at ReadStream.pipeOnReadable (/Users/nolan/workspace/pouchdb/node_modules/levelup/node_modules/readable-stream/lib/_stream_readable.js:646:5)

Node output:

  1) test.replication.js-http-local test-cancel-pull-replication:
     Uncaught Error: {"status":400,"name":"bad_request"}
      at Promise$_settlePromiseFromHandler [as _settlePromiseFromHandler] (/Users/nolan/workspace/pouchdb/node_modules/bluebird/js/main/promise.js:733:58)
      at Promise$_settlePromiseAt [as _settlePromiseAt] (/Users/nolan/workspace/pouchdb/node_modules/bluebird/js/main/promise.js:896:14)
      at Async$_consumeFunctionBuffer [as _consumeFunctionBuffer] (/Users/nolan/workspace/pouchdb/node_modules/bluebird/js/main/async.js:64:12)
      at Async$consumeFunctionBuffer (/Users/nolan/workspace/pouchdb/node_modules/bluebird/js/main/async.js:37:14)
      at Promise$_Scheduler (/Users/nolan/workspace/pouchdb/node_modules/bluebird/js/main/schedule.js:40:58)
      at process._tickDomainCallback (node.js:463:13)

pouchdb has no method 'uuid'

Good morning!

I have a strange problem: I just set-up a pouchdb server (using a fresh npm install express-pouchdb) and tried to test it.

Fauxton comes up properly - but whenever I try to create a new UUID (by adding a new document through Fauxton, or by accessing /_uuids directly) I get the following error:

TypeError: Object function PouchDB(name, opts, callback) {
  ... (source excluded)
} has no method 'uuid'
    at app.post.source (/Users/andreas/Rozek/PouchDB_Server/node_modules/express-pouchdb/index.js:66:43)
    at callbacks (/Users/andreas/Rozek/PouchDB_Server/node_modules/express/lib/router/index.js:164:37)
    at param (/Users/andreas/Rozek/PouchDB_Server/node_modules/express/lib/router/index.js:138:11)
    at pass (/Users/andreas/Rozek/PouchDB_Server/node_modules/express/lib/router/index.js:145:5)
    at Router._dispatch (/Users/andreas/Rozek/PouchDB_Server/node_modules/express/lib/router/index.js:173:5)
    at Object.router (/Users/andreas/Rozek/PouchDB_Server/node_modules/express/lib/router/index.js:33:10)
    at next (/Users/andreas/Rozek/PouchDB_Server/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at IncomingMessage.<anonymous> (/Users/andreas/Rozek/PouchDB_Server/node_modules/express-pouchdb/index.js:40:7)
    at IncomingMessage.EventEmitter.emit (events.js:92:17)
    at _stream_readable.js:920:16

I must be missing something fundamental - but I don't have a clue right now, what might be wrong.

Does anybody out there have any idea?

Thanks in advance for any help!

Kind regards,

Andreas Rozek

longpoll replication

long poll replication (aka default pouchdb replication) just returns, this hoses local-npm

attachment handling seems broken

Hello!

While experimenting with pouchdb-server (and, thus, with express-pouchdb as well) I ran across problems with attachments. F.e., adding an attachment to a document like

curl --request PUT --data 'Test' http://:15984/TestDB/TestDoc_missing/Attachment

turned out to create a document "TestDoc_missing/Attachment" (which then had to be deleted using the id "TestDoc_missing%2FAttachment").

I've already modified my local copy of express-couchdb/index.js (and it seems to work fine now, i.e., better than before) - but before damaging any other people's source code by just checking my changes in, I'd like to send them to somebody else for a review.

Any volunteers?

Kind regards,

Andreas Rozek

attachments replicate error

We have a brand-new error:

  1) test.attachments.js- local:http Multiple attachments replicate:
     SyntaxError: writeCheckpoint completed with error
      at Object.parse (native)
      at onSuccess (/Users/nolanlawson/workspace/pouchdb-server/node_modules/pouchdb/lib/deps/ajax.js:46:20)
      at Request._callback (/Users/nolanlawson/workspace/pouchdb-server/node_modules/pouchdb/lib/deps/ajax.js:158:7)
      at Request.self.callback (/Users/nolanlawson/workspace/pouchdb-server/node_modules/pouchdb/node_modules/request/request.js:123:22)
      at Request.EventEmitter.emit (events.js:98:17)
      at Request.<anonymous> (/Users/nolanlawson/workspace/pouchdb-server/node_modules/pouchdb/node_modules/request/request.js:877:14)
      at Request.EventEmitter.emit (events.js:117:20)
      at IncomingMessage.<anonymous> (/Users/nolanlawson/workspace/pouchdb-server/node_modules/pouchdb/node_modules/request/request.js:828:12)
      at IncomingMessage.EventEmitter.emit (events.js:117:20)
      at _stream_readable.js:919:16
      at process._tickCallback (node.js:419:13)

Conflict with express.bodyParser()

As discussed in pouchdb/pouchdb-server#18 (comment) there is a conflict with express.bodyParser().
Since I fear that it could only be solved within bodyParser (or maybe pouchdb (client)) I would suggest to leave a remark in the Readme.md.

Since the result is not an error but only a timeout, it would be quite impossible for a user to find this conflict and it might well be that he turns away because it "is not working".

_design doc endpoints buggy

From the mailing list:

pouchdb-server -p 15984 -l tiny

and then I tried to push to pouch:

couchapp push . http://127.0.0.1:15984/myblogdb

The result:
2013-10-22 11:22:19 [INFO] Visit your CouchApp here:
http://127.0.0.1:15984/myblogdb/_design/sofa/_list/index/recent-posts?descending=true&limit=10

So it looks like I was able to push the Sofa application. However, when I visit
http://127.0.0.1:15984/myblogdb/_design/sofa/_list/index/recent-posts?descending=true&limit=10
I receive:
{
"status": 404,
"error": "not_found",
"reason": "missing"
}

The database itself exists:

http://127.0.0.1:15984/myblogdb ->

{
"db_name": "myblogdb",
"doc_count": 1,
"update_seq": 1
}

And I even get result visiting
http://127.0.0.1:15984/myblogdb/_design/sofa
but for http://127.0.0.1:15984/myblogdb/_design/sofa/_list
I receive
{
"status": 404,
"error": "not_found",
"reason": "missing"
}

Using Couchdb, the Sofa application works perfectly. Are lists work differently on Couchdb and Pouchdb?
I'm going to dig deeper.

Stop depending on pouchdb master

This is a bad idea, since things change in PouchDB all the time, and so this module risks getting bitrotted. Hence things like _all_dbs, _uuids breaking for people who install this plugin. It should peg to a particular version.

DB - Files cluttering root

All DB-Files are now in my root Folder. Having several DBs clutters the root folder even more...

Is there an option to put db-Files into a specific folder?

Refactor

index.js is becoming a little unwieldy because it's not very well organized. Seems like it'd be much cleaner to split the routes out into separate files. I'm thinking a routes/ directory with three files: server.js, database.js and document.js where the routes are divided into their respective categories. Then we can have a nice clean looking definition of routes:

app.get('/_all_dbs', routes.server.allDbs);
app.put('/:db', routes.database.create);

This will 1) make for easier maintenance and 2) make it easier to understand and reason about route priority and ordering. For example, I'm considering moving all of the very specific routes to the beginning of the file, but it's hard to look at the file and reason about whether or not that would be safe.

Some blocking issues: closure variables. Mostly this is the fact that I have to keep a dbs store for creation/deletion logic (the performance benefits of caching references here is marginal, and the code would be much cleaner without it). We can't get around this though unless pouchdb supports erroring if the database already exists (PUTting a database twice). Leveldb supports this, but pouch doesn't yet.

Server -> Client continuous replication error

Working on implementing the pouchdb getting started TODOS tutorial using express-pouchdb in a self-contained express app:
https://github.com/nick-thompson/express-pouchdb/tree/todo-example/examples/todos

Changes don't update automatically between two windows. I had one running in Chrome v28.0 and another running in a separate Chrome v28.0 Incognito window. Changes didn't update automatically and changes from the Incognito window never propagated to the other window (didn't write to the server).

Maybe there's some bug about pouchdb in incognito chrome? Gotta look into it...

err object sent back with error codes contains wrong information

res.send(409, err)
where err is
{ status: 409, name: 'conflict', message: 'Document update conflict', error: true }
results in the following received data
{ message: undefined, name: true, status: 409 }

Maybe there's something I've overlooked about Express, but maybe we should parse err objects from Pouch, and put the proper information into error and reason fields before sending them back as a response.

Stub out _log, _stats

This will make the UI look less broken, since I haven't figured out yet how to disable the sidebar links.

uuids should be more random

Currently you can save a doc in Fauxton and then when you try to create a new doc, it has the same id, so you get a conflict. I didn't realize this, but apparently CouchDB just regenerates brand-new ids each time, so there's no reason to always give the same one every time.

Docs with {} as attachments

When running local-npm I would occasionally see docs get put into the local fullfatdb with _attachments: {}. I put in a workaround, but for now I have no idea if the bug is in express-pouchdb, pouchdb, or npm-fullfat-registry because I haven't been able to repro it consistently.

_all_dbs inconsistant. Can we remove the prefix 'leveldb:' ?

$ curl -X PUT http://localhost:15984/mydb
{
  "ok": true
}

$ curl -X GET http://localhost:15984/_all_dbs 
[
  "leveldb://mydb"
]

$ curl -X GET http://localhost:15984/leveldb:mydb
{
  "status": 404,
  "error": "not_found",
  "reason": "no_db_file"
}

$ curl -X GET http://localhost:15984/mydb
{
  "db_name": "mydb",
  "doc_count": 0,
  "update_seq": 0
}

As you can see, consumers of the _all_dbs api cant just use the name of the db as per couch. Would it be ok if the _all_dbs endpoint removed the 'leveldb:' prefix from each name?

Implement _uuids

http://localhost:2020/_uuids?count=10&_nonce=yQyOMZCovtjsCfR5 returns a 500, which is breaking the "add a pouch" test in the PouchDB test suite.

Stub out _config

This will save us headaches when we remove the CORS proxy for our unit tests, plus it looks nicer in the new Fauxton when you tab over to 'config'.

Bidirectional replication leads to endless loop

Hello again!

Yesterday, I tried to set up a bidirectional replication between two pouchdb-server instances - and failed miserably.

Right now, it seems as if the latest _bulk_docs request does not clear the _revs_diff record of the transferred document.

To illustrate the problem (I modified the pouchdb-server source to log the incoming _bulk_docs and outgoing _revs_diff data):

diffs = { TestDoc_notEmpty: { missing: [ '4-235fe32e92f54c3a99ebafc8d59309c7' ] } }
POST /TestDB2/_revs_diff 200 97 - - ms
bulk_docs = { docs: 
   [ { value: 3.14,
       _id: 'TestDoc_notEmpty',
       _rev: '4-235fe32e92f54c3a99ebafc8d59309c7',
       _revisions: [Object] } ],
  new_edits: false }
POST /TestDB2/_bulk_docs 201 105 - 2 ms
diffs = { TestDoc_notEmpty: { missing: [ '4-235fe32e92f54c3a99ebafc8d59309c7' ] } }
POST /TestDB2/_revs_diff 200 97 - 1 ms

What really surprises me: BOTH servers report the same revision info for that document:

{
  "value": "a",
  "_id": "TestDoc_notEmpty",
  "_rev": "6-92fcfa9a2d469fb4774a2294466b6887",
  "_revs_info": [
    {
      "rev": "6-92fcfa9a2d469fb4774a2294466b6887",
      "status": "available"
    },
    {
      "rev": "5-ad20186915290b1c09e05cb60e2bd9da",
      "status": "available"
    },
    {
      "rev": "4-d981ff2ebd16358e00aa975c8d3e8457",
      "status": "available"
    },
    {
      "rev": "3-ee94e30712c4cde59c3bc1716a4d2ccd",
      "status": "missing"
    },
    {
      "rev": "2-57e14da7b8ecb851d59398b25f3ff91c",
      "status": "missing"
    },
    {
      "rev": "1-964e98fd50f1f9d7aa4d5ebdfd6208cd",
      "status": "missing"
    }
  ]
}

and, as you can see, the missing revision does not appear in these lists!

Does anybody out there have any ideas?

Thanks in advance for your effort!

Kind regards,

Andreas Rozek

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.