GithubHelp home page GithubHelp logo

ini's Introduction

An INI format parser & serializer.

Note

  • Sections are treated as nested objects.

  • Section-less items are treated as globals.

Usage

Consider an INI file such as the following:

; This comment is being ignored
scope = global

[database]
user = dbuser
password = dbpassword
database = use_this_database

[paths.default]
datadir = /var/lib/data
array[] = first value
array[] = second value
array[] = third value

You can read, modify and write it like so:

import { writeFile , readFile } from 'node:fs/promises'
import { stringify , parse } from 'ini'

//  Read INI file as text

let text = await readFile(`./Original.ini`,{
    encoding : 'utf-8'
})

//  Parse text data to object

const config = parse(text)

//  Modify data object

config.scope = 'local'
config.database.database = 'use_another_database'
config.paths.default.tmpdir = '/tmp'
delete config.paths.default.datadir
config.paths.default.array.push('fourth value')

//  Stringify data object

text = stringify(config,{ 
    section : 'section' 
})

//  Write INI file as text

await writeFile(`./Modified.ini`,text)

The written file will contain the following:

[section]
scope=local
[section.database]
user=dbuser
password=dbpassword
database=use_another_database
[section.paths.default]
tmpdir=/tmp
array[]=first value
array[]=second value
array[]=third value
array[]=fourth value

API

Parse

Attempts to turn the given INI string into a nested data object.

// You can also use `decode`
const object = parse(`<INI Text>`) 

Stringify

Encodes the given data object as an INI formatted string.

// You can also use `encode`
stringify(object,{

    /**
     *  Whether to insert spaces before & after `=`
     * 
     *  Disabled by default to have better 
     *  compatibility with old picky parsers.
     */

    whitespace : false ,

    /**
     *  Whether to align the `=` character for each section.
     *  -> Also enables the `whitespace` option
     */

    align : false ,

    /**
     *  Identifier to use for global items 
     *  and to prepend to all other sections.
     */

    section ,

    /**
     *  Whether to sort all sections & their keys alphabetically.
     */

    sort : false ,

    /**
     *  Whether to insert a newline after each section header.
     * 
     *  The TOSHIBA & FlashAir parser require this format. 
     */

    newline : false ,

    /**
     *  Which platforms line-endings should be used.
     * 
     *  win32 -> CR+LF
     *  other -> LF
     * 
     *  Default is the current platform
     */

    platform ,

    /**
     *  Whether to append `[]` to array keys.
     * 
     *  Some parsers treat duplicate names by themselves as arrays
     */

    bracketedArray : true

})

For backwards compatibility any string passed as the
options parameter is treated as the section option.

stringify(object,'section')

Un / Escape

Turn the given string into a safe to
use key or value in your INI file.

safe(`"unsafe string"`) // -> \"unsafe string\"

Or reverse the process with:

unsafe(`\\"safe string\\"`) // -> "safe string"

ini's People

Contributors

aikar avatar base698 avatar ccampbell avatar cherry avatar commanderroot avatar creskendoll avatar ctavan avatar dependabot[bot] avatar frozencow avatar futpib avatar github-actions[bot] avatar isaacs avatar jhs avatar loice5 avatar lukekarrys avatar marijnh avatar mattijs avatar mimetnet avatar nautigsam avatar phonedroid avatar popomore avatar rquadling avatar shadowtime2000 avatar siddharthvp avatar wraithgar 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ini's Issues

[FEATURE] <title>

What / Why

n/a

When

  • n/a

Where

  • n/a

How

Current Behavior

  • n/a

Expected Behavior

  • n/a

Who

  • n/a

References

  • n/a

[FEATURE] <title>

What / Why

n/a

When

  • n/a

Where

  • n/a

How

Current Behavior

  • n/a

Expected Behavior

  • n/a

Who

  • n/a

References

  • n/a

multiple keys are not parsed

i just realised that ini struggles with input like

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = [email protected]:joyent/node.git
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

(which is taken from a valid gitconfig)

in the ini notation multiple keys with different values are valid, but when ini parses them to JSON they get lost due to the limitations of JSON.

any ideas for a workaround or should i build a custom parser on my own instead?

DRY nested sections?

Do you support some syntax for DRY nested sections, e.g. indentation?

[a]
one = 1
  [b]
  two = 2

yielding:

{ "a": { "one": 1, "b": { "two": 2 } } }

instead of e.g.:

[a]
one = 1
[a.b]
two = 2

[BUG] <title>

What / Why

n/a

When

  • n/a

Where

  • n/a

How

Current Behavior

  • n/a

Steps to Reproduce

  • n/a

Expected Behavior

  • n/a

Who

  • n/a

References

  • n/a

Top-level arrays to not round trip

Given the following object as x:

[
    {
        "id": 2,
        "name": "An ice sculpture",
        "price": 12.50,
        "tags": ["cold", "ice"],
        "dimensions": {
            "length": 7.0,
            "width": 12.0,
            "height": 9.5
        },
        "warehouseLocation": {
            "latitude": -78.75,
            "longitude": 20.4
        }
    },
    {
        "id": 3,
        "name": "A blue mouse",
        "price": 25.50,
        "dimensions": {
            "length": 3.1,
            "width": 1.0,
            "height": 1.0
        },
        "warehouseLocation": {
            "latitude": 54.4,
            "longitude": -32.7
        }
    }
]

The following fails:

for (let y of ini.decode(ini.encode(x))) { console.log(y) }

despite the fact the following works:

for (let y of x) { console.log(y) }

The issue being that decoding results in an object where what was an array index is now a key, rather than create an array.

If this can be fixed, great. If it cannot because of backwards compatibility concerns, it would be nice if ini emitted a warning when encoding something that would not decode to an equivalent object.

REQUEST: add option to preserve comments

I'm using ini to parse a nexus deploy configuration file, and by all means, it works great, but our java developers has the habit of using comments in this configuration file, and ini.parse removes all text after strings with # and ;.

Example

Desired outcome:

# Supports interpolation
# Can reference other values in same section or in special default section
# To reference myValue, you need to write: %(myValue)s

[DEFAULT]
....
syslog.local0.levels=info;error

Actual outcome:

[DEFAULT]
....
syslog.local0.levels=info

I'm using [email protected], [email protected] and [email protected] in a windows 7 environment with git bash

Parsing special characters, ex: # number signs

When parsing values like 6#G222 ini parser ignores all values after #. Values like this are used between multiple languages and needs to be able parse password values.

[db]
user = admin
password = 6#G222@!ds9DlA0492SlL82

Encode + decode of array containing object failed!

I have the following data structure:

{ persons: [{ name: 'Egon' }, { name: 'Janina' }] }

After encoding I got:

persons[]={"name":"Egon"}
persons[]={"name":"Janina"}

And after decoding again I got:

{ persons: [ '{"name":"Egon"}', '{"name":"Janina"}' ] }

Meaning the content of the list entries is kept as string and not converted into objects again.

[BUG] <title>

What / Why

n/a

When

  • n/a

Where

  • n/a

How

Current Behavior

  • n/a

Steps to Reproduce

  • n/a

Expected Behavior

  • n/a

Who

  • n/a

References

  • n/a

Section problem

I've run into a problem with how it parses section elements.

When I have a section like this ini.parse('[foo.bar]'), I get this: { foo: { bar: {} } }. This is documented in the readme, though strangely not part of the INI spec as far as I could see.

My problem is that I actually want to keep the section name intact.

I've tried quoting it ini.parse('["foo.bar"]') and escaping the dot ini.parse('[foo\.bar]'), but no change.

Numeric values

According to

b: { c: { e: '1', j: '2' } } },
seems numeric values are interpreted as strings. Shouldn't they be parsed as numbers?

Running decode against test fixture returns errors

The first one is at the top where I get

TypeError: Object o = p

At the end of the file i get

nocomment = this\; this is not a comment has no method 'split'
at Object.decode (/home/martin/Dropbox/workspace/node_modules/ini/ini.js:61:19)
at repl:1:17
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface.<anonymous> (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:754:14)

Mocha testing framework conflict

When I am trying to run Mocha testing framework I receive the following error :

  > mocha --recursive

C:\nodejs\myproject\node_modules\ini\ini.js:76
    , lines = str.split(/[\r\n]+/g)
                  ^

TypeError: str.split is not a function
    at Object.decode (C:\nodejs\myproject\node_modules\ini\ini.js:76:19) 

I changed this part in the ini.js (around line 76 where the error is mentioned) :

  var out = {}
    , p = out
    , section = null
    , state = "START"
           // section     |key = value
    , re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i
    , lines = str.split(/[\r\n]+/g) //this is where the error occurs
    , section = null 

to this :

 var out = {}
    , p = out
    , section = null
    , state = "START"
           // section     |key = value
    , re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i
    , lines = [] 
    , str = str.toString() 
    , section = null

  if(str.length > 0)
  {
      lines = str.split(/[\r\n]+/g)
  } 

and the conflict gets resolved.

Have you ever used Mocha along with the module? Is it possible to include a fix for this?
You can include mine if you want.

Thank you in advance.

[BUG] \\ becomes \.

config.ini

path= \\server\test\001
let config = ini.parse(fs.readFileSync('./config.ini', 'utf-8'))

 // config.path → "\server\test\001"
 //  There is only one ’\’ at the beginning of the character.
// But there are two correctly. 

Quotes are not stripped from escaped property values when inline comments are present

Ini property values may be quoted to escape special characters and indicate they are strings. However, comments following a quoted property value force the quotes to appear literally in the output.

Test Case

const ini = require('ini');

console.log(ini.decode('a.b = "c"'));
console.log(ini.decode('a.b = "c" ; asdf'));
console.log(ini.decode('a.b = c ; asdf'));

Expected Output

{ 'a.b': 'c' }
{ 'a.b': 'c' }
{ 'a.b': 'c' }
=> undefined

Actual Output

{ 'a.b': 'c' }
{ 'a.b': '"c"' }
{ 'a.b': 'c' }
=> undefined

This issue relates to: #81.

[BUG] Current build is failing

What / Why

I want to upgrade the ini dependency in my project, but the latest ini build is failing

When

When I go to review the latest release of ini before updating the dependency in my project, I noticed that the ini build is failing.
image

Where

https://travis-ci.org/github/npm/ini/builds/748654180

How

image
image
image

Current Behavior

  • n/a

Steps to Reproduce

  • n/a

Expected Behavior

I expect that the ini build is passing before I upgrade the dependency in my project

Who

  • n/a

References

  • n/a

Multiple tests failing in Windows

Trace:

$ npm test

> [email protected] test c:\Documents and Settings\apenneba\Desktop\src\ini
> tap test/*.js

total ............................... 0/1

not ok
npm ERR! Test failed.  See above for more details.
npm ERR! not ok code 0

When I drill down into specific tests, I get:

$ tap test/bar.js
not ok test/bar.js ...................................... 3/5
    Command: "node" "bar.js"
    TAP version 13
    not ok 1 should be equivalent
      ---
        file:   events.js
        line:   92
        column: 17
        stack:
          - getCaller (c:\Documents and Settings\apenneba\Desktop\src\ini\node_modules\tap\node_modules\tap-assert\assert.js:370:17)
          - assert (c:\Documents and Settings\apenneba\Desktop\src\ini\node_modules\tap\node_modules\tap-assert\assert.js:17:16)
          - Function.equivalent (c:\Documents and Settings\apenneba\Desktop\src\ini\node_modules\tap\node_modules\tap-assert\assert.js:174:10)
          - Test._testAssert (c:\Documents and Settings\apenneba\Desktop\src\ini\node_modules\tap\node_modules\tap-test\test.js:86:16)
          - Test.<anonymous> (c:\Documents and Settings\apenneba\Desktop\src\ini\test\bar.js:19:7)
          - Test.EventEmitter.emit (events.js:92:17)
          - Test.emit (c:\Documents and Settings\apenneba\Desktop\src\ini\node_modules\tap\node_modules\tap-test\test.js:102:8)
          - GlobalHarness.Harness.process (c:\Documents and Settings\apenneba\Desktop\src\ini\node_modules\tap\node_modules\tap-harness\harness.js:86:13)
          - process._tickCallback (node.js:415:13)
          - Function.Module.runMain (module.js:499:11)
        found:
          count: 10
        wanted:
          count: 10
        diff:   |
          FOUND:  {"count":"10"}
          WANTED: {"count":10}
                           ^ (at position = 9)
        unique: 0
      ...
    ok 2 should be equivalent
    ok 3 should be equivalent
    not ok 4 should be equivalent
      ---
        file:   events.js
        line:   92
        column: 17
        stack:
          - getCaller (c:\Documents and Settings\apenneba\Desktop\src\ini\node_modules\tap\node_modules\tap-assert\assert.js:370:17)
          - assert (c:\Documents and Settings\apenneba\Desktop\src\ini\node_modules\tap\node_modules\tap-assert\assert.js:17:16)
          - Function.equivalent (c:\Documents and Settings\apenneba\Desktop\src\ini\node_modules\tap\node_modules\tap-assert\assert.js:174:10)
          - Test._testAssert (c:\Documents and Settings\apenneba\Desktop\src\ini\node_modules\tap\node_modules\tap-test\test.js:86:16)
          - Test.<anonymous> (c:\Documents and Settings\apenneba\Desktop\src\ini\test\bar.js:19:7)
          - Test.EventEmitter.emit (events.js:92:17)
          - Test.emit (c:\Documents and Settings\apenneba\Desktop\src\ini\node_modules\tap\node_modules\tap-test\test.js:102:8)
          - GlobalHarness.Harness.process (c:\Documents and Settings\apenneba\Desktop\src\ini\node_modules\tap\node_modules\tap-harness\harness.js:86:13)
          - process._tickCallback (node.js:415:13)
          - Function.Module.runMain (module.js:499:11)
        found:
          theDude:
            abides:   true
            rugCount: 1
        wanted:
          theDude:
            abides:   true
            rugCount: 1
        diff:   |
          FOUND:  es":true,"rugCount":"1"}}
          WANTED: es":true,"rugCount":1}}
                                      ^ (at position = 37)
        unique: 3
      ...
    ok 5 test/bar.js

    1..5
    # tests 5
    # pass  3
    # fail  2

total ................................................... 3/5

not ok

System:

$ specs tap node os
Specs:

specs 0.4
https://github.com/mcandre/specs#readme

tap --version
0.4.2

npm --version
1.2.17

node --version
v0.10.3

systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
OS Name:                   Microsoft Windows XP Professional
OS Version:                5.1.2600 Service Pack 3 Build 2600

Encode values without quoting (unsafe encoding)

When encoding a Base64 String with padding, the parser quotes it. But since another parser does not understand these quotes, it fails to decode the string.

let buf = new Buffer(16), // Buffer filled with random bytes
    section = ini.parse('[section]\nkey=' + buf.toString());

console.log(section); // { section: { key: 'UPIvqf0AAABA5i+p/QAAAA==' } }
console.log(encode(section)); // key="4EQ8rlYAAAAQlTWuVgAAAA=="

Hence I suggest to add an option to allow for unsafe encoding.

Strict Mode

Running ini in strict mode results in the following:

node_modules/ini/ini.js:49
.replace(/\2LITERAL\1LITERAL\2/g, '\1')

SyntaxError: Octal literals are not allowed in strict mode.

[BUG] <title>

What / Why

n/a

When

  • n/a

Where

  • n/a

How

Current Behavior

  • n/a

Steps to Reproduce

  • n/a

Expected Behavior

  • n/a

Who

  • n/a

References

  • n/a

[BUG] Problem with # in value ini

What / Why

Problem with # in value ini

n/a

When

string in ini have #

  • n/a

Where

`function unsafe (val, doUnesc) {
val = (val || '').trim()
if (isQuoted(val)) {
// remove the single quotes before calling JSON.parse
if (val.charAt(0) === "'")
val = val.substr(1, val.length - 2)

try {
  val = JSON.parse(val)
} catch (_) {}

} else {
// walk the val to find the first not-escaped ; character
var esc = false
var unesc = ''
for (var i = 0, l = val.length; i < l; i++) {
var c = val.charAt(i)
if (esc) {
if ('\;#'.indexOf(c) !== -1)
unesc += c
else
unesc += '\' + c

    esc = false
  } else if (';#'.indexOf(c) !== -1)
    break
  else if (c === '\\')
    esc = true
  else
    unesc += c
}
if (esc)
  unesc += '\\'

return unesc.trim()

}
return val
}`

  • n/a

How

Current Behavior

  • n/a

Steps to Reproduce

  • n/a

Expected Behavior

You need to delete # in :

} else if (';#'.indexOf(c) !== -1)

and

if ('\;#'.indexOf(c) !== -1)

to:

} else if (';'.indexOf(c) !== -1)

and

if ('\;'.indexOf(c) !== -1)

  • n/a

Who

  • n/a

References

  • n/a

x = 'foo' x = 'bar' parsing

Hello, in my .ini file I have

ServerPackages=Core
ServerPackages=Engine
....

After parsing it leaves only 1 ServerPackages line, how this can be fixed ?

How to check the value of a key without an equal sign

Hi,
I have a config.ini file with values of Key2 and Key3 not yet set:
ini-1

I'm trying to validate the ini file, if the session, key, and value information is invalid it will output an error and stop the node-red application.
I'm on windows, case that no '=' after Key2 the ini node has given it a value of true.
Is it expected behavior?
I cannot judge whether the value of Key2 that was set from the beginning is true like Key4 or if the input error has no = but the given value is true.
ini-2

Remove keys when stringifying null and undefined

Is the following behavior on purpose ?

ini.stringify({toto:undefined}) == 'toto = undefined\n'
ini.stringify({toto:null}) == 'toto = null\n'

When stringifying/encoding, I would suggest to remove the key if the value is null or undefined. If you agree, I will provide a patch and a test.

Thanks, d.

Section headers with '.' in them are split

I have the following .ini file:

[https://www.example.com]
settingA = foo
settingB = bar

When parsing this .ini the resulting structure has the section header cut into pieces, I expected {'https://www.example.com': { settingA: 'foo', settingB: 'bar' } }, but got {'https://www': { 'example': { 'com': { settingA: 'foo', settingB: 'bar' } } } }.

Incorrect conversion of arrays to .ini format in Windows

[Section]
name[]=value_one
name[]=value_two
name[]=value_three

[Next section]

That is being parsed well, but then is being written to .ini file as:

[Section]
name[]=value_onename[]=value_twoname[]=value_three
[Next section]

Windows versions in which that behaviour was noticed are 7 and 10.

[FEATURE] <title>

What / Why

n/a

When

  • n/a

Where

  • n/a

How

Current Behavior

  • n/a

Expected Behavior

  • n/a

Who

  • n/a

References

  • n/a

Lists of quoted strings containing semicolons are not being parsed properly

Here's a simple reproduction of this Issue:

const iniParser = require('ini');

console.log(iniParser.parse('values=["foo; bar"]'));

Actual result:

Semicolon's in a quoted string in a list are parsed as a comment.

{ values: '["foo' }

Expected result:

Semicolon's in a quoted string should not be parsed as a comment.

{ values: ['foo; bar'] }
  • ini version: 1.3.5
  • node version: 8.9.4

[FEATURE] <title>

What / Why

n/a

When

  • n/a

Where

  • n/a

How

Current Behavior

  • n/a

Expected Behavior

  • n/a

Who

  • n/a

References

  • n/a

Double backslashes are turned into one

I'm on windows (don't think it is revelant) and I have a problem with values containing multiple backslashes like \\192.168.1.1, the parser turn the \\ into \

Is it expected behavior? I don't think it should be since a simple read then reencode change the file and lose information.

Exemple:
first pass: \\\\ read as \\ and then encoded as \\
second pass: \\ read as \ and then encoded as \
third pass: \ read as \ and then encoded as \

[BUG] problem with doublequotes in the keys.

What / Why

my ini file content

[gitflow "branch.feature/PLANO-34129"]
	base = master

gets parsed to

{
  'gitflow "branch': {
    'feature/PLANO-34129"': {
      'base': 'master'
    }
  }
}

Note the missing " in the keys.

How

Steps to Reproduce

.gitconfig

[gitflow "branch.feature/PLANO-34129"]
	base = master

reproduce.js

const ini = require('ini')
const fs = require('fs')

var config = ini.parse(fs.readFileSync('.gitconfig', 'utf-8'))

console.log(JSON.stringify(team_config));

Expected Behavior

Something like this:

{
  'gitflow': {
    'branch': {
      'feature/PLANO-34129': {
        'base': 'master'
      }
    }
  }
}

[FEATURE] Github releases

Currently when visiting the tags page none of the tags have GitHub releases attached meaning tools like npm-upgrade end up linking to an almost empty page when attempting to show the changelog.

Numeric attributes

Hi! If i have ini like this:

001=foo

In javascript object key 001 convert to number 1. I think that we need an option that will configure storage of keys as strings.
Thanks!

error while parsing semicolons

Ini spec only allows semicolons to be interpreted as comments when they are in the beginning of the line.
; comment
I'm experiencing bug when parsing the following keypair:
key=value;value;value
value;value;value should be interpreted as a string and instead it's parsed only as value and rest is ignored.

Thanks for considering a fix!

Hot-reloading

Hi , i try to use ur ini module for make a configuration update with OTA , well when i use util.promisify for reloaded the fs.readFileSync with an application already started
my app not see the change in ini file =/ do u have a solution for use ur ini module in async ??

Parsing bug

[section1]
alice=value1

[section2]          ; spaces behind section2
bob=value2

When you decode the file, the result is not what you expect

{ section1: { alice: 'value1', '[section2]          ': true, bob: 'value2' } }

It should be

{ section1: { alice: 'value1'}, section2: {bob: 'value2'} }

Reserve comments in ini file

Hi,
I want to change php.ini, but I want to reserve comments that exist in this file. In this file comments specific with (;) character. What should I do?

Thanks

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.