GithubHelp home page GithubHelp logo

charlesguse / run-script-os Goto Github PK

View Code? Open in Web Editor NEW
191.0 191.0 30.0 76 KB

run-script-os will let you use OS specific operations in npm scripts without specifying which OS you are on. It's not magic though... you still have to write OS specific scripts.

License: MIT License

JavaScript 72.37% Shell 12.77% PowerShell 14.87%

run-script-os's People

Contributors

asaf-s avatar charlesguse avatar denco avatar h6ah4i avatar jamesmstone avatar jimcatts avatar mathiscode avatar samstagern avatar sators 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

run-script-os's Issues

Published index.js file has CRLF line endings, breaks Linux

The current version of this package on npm is published with CRLF line endings, which causes this error on Linux:

/usr/bin/env: ‘node\r’: No such file or directory
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! [email protected] appendnw: `run-script-os`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the [email protected] appendnw script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/saboya/.npm/_logs/2017-07-03T11_25_44_222Z-debug.log

'babel' is not recognized

I'm having an issue with combining babel with run-script-os. The script I'm trying to execute is supposed to build a sibling/dependency project, e.g.:

"build:dep":"run-script-os",
"build:dep:win32": "cd ../other-project && yarn build",
"build:dep:linux:darwin": "cd ../other-project && sudo yarn build",

and the build script for the dependency looks like:

"build": "yarn && babel src --presets @babel/preset-react,@babel/preset-env --out-dir dist"

I'm testing on Windows 10 at the moment. Running yarn build:dep:win32 directly runs perfectly fine. But when I try to run yarn build:dep it fails with 'babel is not recognized as an internal or external command.' Ran it with npm/yarn and both have the same results.

Any ideas?

run-script-os does not work on yarn 2

run-script-os does not work on yarn 2.

$ yarn start
This is meant to be run from within npm script. See https://github.com/charlesguse/run-script-os

Perhaps related to issue #34

Aliases combined with OS names do not work

I'm running pnpm watch-app on Windows with the following setup:

"watch-app": "run-script-os",
"watch-app:windows:macos": "echo 1",
"watch-app:default": "echo 2"

And it prints 2, but it should print 1 since I'm on Windows.

The simple fix is:

"watch-app": "run-script-os",
"watch-app:win32:macos": "echo 1",
"watch-app:default": "echo 2"

This prints 1.
The only difference is that I use OS name (win32) here instead of an alias (windows).

But it's not obvious that you cannot combine aliases with OS names and this should be either mentioned in the README or fixed so that aliases can be used together with OS names.

Does not work with `npm i`

I was installing my dependencies with npm i and suddenly things stopped working and dependencies were missing.

Turned out when I ran npm install it worked.

I tracked the problem down to line 30:

if (process.env.npm_config_user_agent.includes('yarn') && !options[1]) options[1] = 'install';
let osCommand = `${options[1]}:${platform}`;

I would get an error:

npm ERR! missing script: i:darwin

Which I assume is to be install:darwin

Specify script name

This package uses a simple approach of getting the script name based on the arguments of the npm command. That does not work in all cases. (ex prepare called by install) I propose an argument to be added to allow users to specify the scripts to get around this issue.

This repo seems pretty dead. If I make a PR will it be considered?

RUN_OS_WINBASH_IS_LINUX does not work in VS Code git bash terminal

The possibility to set the RUN_OS_WINBASH_IS_LINUX environment variable to make git bash being seen as a Linux terminal is great, and it works well if git bash is started on its own.

However if you start git bash within Visual Studio Code, the check condition does not work anymore and the terminal is always seen as Windows.

Here is what I get in a git bash terminal spawn independently.

> process.env.SHELL
'C:\\Program Files\\Git\\usr\\bin\\bash.exe'
> process.env.TERM_PROGRAM
'mintty'

Hence the condition works.

However same commands in git bash spawned within VS Code and I get

> process.env.SHELL
undefined
> process.env.TERM
'xterm-256color'
> process.env.TERM_PROGRAM
'vscode'

EDIT:
It turns out the terminal does not behave the same way if you start a new first instance within VS Code (instance on the left in the capture below) or if you split a second terminal from the first one afterwards (instance on the right)

image

missing script: start:win32

Hi
My package.json looks like this:
image

But it seems that if I don't create a start:win32 to follow the prestart:win32 command it fails.

`npx run-script-os` fails on Apple Mac M1

I recently changed my workstation to an Apple Mac M1 and I was running the run-script-os with npx.
With the above system change, suddenly the commands we failing with the following error.

Script

  "compile": "npx run-script-os",
  "compile:win32": "..\\..\\node_modules\\.bin\\tsc -p tsconfig.json --incremental",
  "compile:default": "../../node_modules/.bin/tsc -p tsconfig.json --incremental",

Stacktrace

run-script-os was unable to execute the script 'npx'
npm ERR! Lifecycle script `compile` failed with error: 
npm ERR! Error: command failed 
npm ERR!   in workspace: ---
npm ERR!   at location: ---
npm ERR! Lifecycle script `build` failed with error: 
npm ERR! Error: command failed 
npm ERR!   in workspace: ---
npm ERR!   at location: ---

When I remove the npx prefix, everything works. Any ideas?

npm run scriptname doesn't work

Output of npm run builddeps



> [email protected] builddeps
> run-script-os

This is meant to be run from within npm script. See https://github.com/charlesguse/run-script-os

My package.json scripts

 "scripts": {
    "builddeps": "run-script-os",
    "builddeps:linux": "sh builddeps.sh",
    "builddeps:win32": "builddeps.bat",
    "build": "webpack -p",
    "start": "webpack && qode ./dist/index.js",
    "debug": "webpack && qode --inspect ./dist/index.js",
    "tsc": "tsc"
  },

From what I can tell, it should work?

`Run-script-OS` doesn't support `pnpm` package manager

Hello,

I am on Mac, trying to setup a project that uses pnpm package manager and run-script-os tool.
My package.json is as small as possible:

{
    "name": "tmp.pnpm",
    "version": "0.0.0",
    "packageManager": "[email protected]",
    "scripts": {
        "prestart": "echo 'pre'",
        "start": "run-script-os",
        "start:windows": "echo 'wind'",
        "start:default": "echo 'macos'"
    },
    "devDependencies": {
        "run-script-os": "1.1.6"
    }
}

If I run pnpm run start command, I get ELIFECYCLE  Command failed with exit code 1. error.

image

Any ideas why it doesn't work?
Kind regards,
Ilia

using this for the start script causes the started app to fail

looks like the start path is not set..

C:\Users\sam.sams\MagicMirror>npm start

> [email protected] start C:\Users\sam.sams\MagicMirror
> run-script-os


> [email protected] start:win32 C:\Users\sam.sams\MagicMirror
> electron js/electron.js $1


Starting MagicMirror: v2.5.0
Loading config ...
Loading module helpers ...
No helper found for module: alert.
Initializing new module helper ...
Module helper loaded: updatenotification
No helper found for module: clock.
WARNING! Could not load config file. Starting with default configuration. Error found: Error: Cannot find module 'moment

C:\Users\sam.sams\MagicMirror>npm -v
6.13.4

C:\Users\sam.sams\MagicMirror>node -v
v12.16.1

config

 "scripts": {
    "start": "run-script-os",
    "start:windows": "node_modules/.bin/electron js/electron.js $1",
    "start:nix": "run-start.sh",

Fails to work as expected on Node 14.15.1 npm 6.14.9 on Win32

After following the instructions in the readme.md I attempt to run a command and npm doesn't run.

package.json

  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build & echo $? & npm run sync",
    "lint": "vue-cli-service lint",
    "sync:linux": "echo syncing for linux",
    "sync:windows": "echo syncing for windows"
}

cmd.exe

C:\Users\someuser\Documents\some-project>npm sync

Usage: npm <command>

I can see the package installed into node_modules.

Are there any other setup steps required to register this module with npm and what else can I do to confirm its installed correctly?

Some Error: "This is meant to be run from within npm script. See https://github.com/charlesguse/run-script-os"

I tried to use run-script-os with npm 7.6.1, and 7.5.6 but it results in not starting the correct npm script and instead prints the message

"This is meant to be run from within npm script. See https://github.com/charlesguse/run-script-os"

to std-out.

It works as expected with npm 6.14.11.

I'm on windows if that matters and my package.json:

 "build": "run-script-os",
    "build:darwin:linux": "npm run clean && tsc index.ts && node index.js && rm index.js",
    "build:win32": "del /Q .\\out && ts-node index.ts",
    "build:default": "echo 'This will run on any platform that does not have its own script'",

I call npm using npm run build from a Java process using ProcessBuilder.

Is it somehow possible to use run-script-os using npm v7 ? It does not say anything about versions or the error in the README.md.

Thanks.

run-script-os does not pass the arguments passed to it with npm's "--"

macos 11.1
npm 6.14.8
node 14.4.0

The following package.json works as expected with version 1.0.7, but fails with the 1.1.5

{
  "name": "test",
  "version": "0.0.0",
  "private": true,
  "devDependencies": {
    "run-script-os": "1.0.7"
  },
  "scripts": {
    "call-echo": "npm run echo -- -i asd",
    "echo": "run-script-os",
    "echo:nix": "echo",
    "echo:win32": "echo"
  }
}

With 1.0.7 the option -i is passed down to the underlying command (echo)

As-MacBook-Pro:test angel$ npm run call-echo

> [email protected] call-echo /Users/angel/Git/test
> npm run echo -- -i asd


> [email protected] echo /Users/angel/Git/test
> run-script-os "-i" "asd"


> [email protected] echo:nix /Users/angel/Git/test
> echo "-i" "asd"

-i asd

With 1.1.5 it has been trimmed

As-MacBook-Pro:test angel$ npm run callecho
npm run callecho

> [email protected] callecho /Users/angel/Git/test
> npm run echo -- -i asd


> [email protected] echo /Users/angel/Git/test
> run-script-os "-i" "asd"


> [email protected] echo:nix /Users/angel/Git/test
> echo "asd"

asd

Extras : tags

It'd be nice if I could do something like this:

    "build:php": "run-script-os",
    "build:php:win32": "cpy **/*.php ../dist/ --parents --cwd=src/",
    "build:php:darwin:linux": "cd src; cp -vrf **/*.php ../dist --parents",

No longer detecting MacOS in version 1.1.1

Version 1.1.1 is not detecting MacOS

MacOS (v10.15.5).


package.json:


 {
  "name": "ngx-project",
  "version": "0.0.1",
  "scripts": {
    "ostest": "run-script-os",
    "ostest:macos": "echo 'This will run on MacOS'",
    "ostest:windows": "echo 'This will run on Windows'",
    "ostest:default": "echo 'This will run on any platform that does not have its own script'"
  },
  "dependencies": {
    "@angular/animations": "~10.0.9",
    "@angular/cdk": "^10.1.3",
    "@angular/common": "~10.0.9",
    "@angular/compiler": "~10.0.9",
    "@angular/core": "~10.0.9",
    "@angular/flex-layout": "^10.0.0-beta.32",
    "@angular/forms": "~10.0.9",
    "@angular/material": "^10.1.3",
    "@angular/platform-browser": "~10.0.9",
    "@angular/platform-browser-dynamic": "~10.0.9",
    "@angular/router": "~10.0.9",
    "rxjs": "~6.5.5",
    "tslib": "^2.0.0",
    "zone.js": "~0.10.3"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.1000.6",
    "@angular/cli": "~10.0.6",
    "@angular/compiler-cli": "~10.0.9",
    "@types/jasmine": "~3.5.0",
    "@types/jasminewd2": "~2.0.3",
    "@types/node": "^12.11.1",
    "codelyzer": "^6.0.0",
    "jasmine-core": "~3.5.0",
    "jasmine-spec-reporter": "~5.0.0",
    "karma": "~5.0.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage-istanbul-reporter": "~3.0.2",
    "karma-jasmine": "~3.3.0",
    "karma-jasmine-html-reporter": "^1.5.0",
    "npm-run-all": "^4.1.5",
    "protractor": "~7.0.0",
    "run-script-os": "^1.1.1",
    "ts-node": "~8.3.0",
    "tslint": "~6.1.0",
    "typescript": "~3.9.5"
  }

terminal output


ComputerName:dev abcdefg$ npm run ostest

[email protected] ostest /Users/abcdefg/projects/ngx-project/dev
run-script-os

[email protected] ostest:default /Users/abcdefg/projects/ngx-project/dev
echo 'This will run on any platform that does not have its own script'

This will run on any platform that does not have its own script

Yarn

Doesnt work with yarn for some reason 😢

yarn run v1.9.4
$ run-script-os
module.js:549
    throw err;
    ^

Error: Cannot find module '\c\dev\bam\user-domain\package.json'
    at Function...

Doesn't support recursive yarn script call

Script failed with a recursive yarn call:

package.json:
[...]
"scripts": {
"build": "yarn wsrun build --stages",
"clean": "run-script-os",
"clean:win32": "rmdir /S /Q .\node_modules",
"clean:darwin:linux": "rm -rf ./node_modules",
"rebuild": "yarn clean && yarn",
},
[...]

Calling "yarn rebuild" run-script-os return error:

$ yarn clean && yarn
$ run-script-os
npm ERR! missing script: rebuild:linux
npm ERR!
npm ERR! Did you mean this?
npm ERR! rebuild

Support :default platform

Could you add a feature where you can specify :default, meaning "all other platforms".
e.g.

"foo": "run-script-os",
"foo:win32": "echo windows",
"foo:darwin": "echo mac",
"foo:default": "echo everything else",

npx run-script-os fails on Apple Mac macOs Monterey 12.5

Hi Team,

I faced with an issue in macOs 12.5(Apple M1 Pro) which does not support npx run-script-os

Script

"compile": "npx run-script-os",
"compile:win32": "..\\..\\node_modules\\.bin\\tsc -p tsconfig.json",
"compile:default": "../../node_modules/.bin/tsc -p tsconfig.json",

Stack trace

___: run-script-os was unable to execute the script 'npx'
lerna ERR! npm run build exited 254 in ___
lerna WARN complete Waiting for 3 child processes to exit. CTRL-C to exit immediately.
npm ERR! code ELIFECYCLE
npm ERR! errno 254
npm ERR! ___ build: `npx lerna run build --stream`
npm ERR! Exit status 254
npm ERR! 
npm ERR! Failed at the ___ build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

I used to replace the command npx run-script-os by npm run compile:default and it works. That is not a good workaround for overridden dependencies.

Thank You

Error on prepare via install, npm ERR! missing script: install:win32

package.json

"scripts": {
    "prepare": "run-script-os",
    "prepare:windows": "@echo windows execution script",
    "prepare:nix": "@echo nix execution script"
  },

running npm run-script prepare on it's own works just fine.

> @echo windows execution script
windows execution script

In a nutshell, I can't call into the right script through the install script.

Thank you so much for your help in advance!

Arguments to lifecycle events

Once there is an accepted solution for using run-script-os in lifecycle events, there will be unexpected arguments passed to the lifecycle event scripts. For instance, when I execute "npm version patch" with the following package.json, I would expect to see "1.0.1" output but instead I see "1.0.1 patch". This is because the options array is passing on all the arguments from the original command - ["npm", "version", "patch"] becomes ["run", "version", "patch"]. This can create some unexpected behaviors with multiple arguments and complex scripts.

{ "name": "test-script", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "version": "run-script-os", "version:nix": "echo ${npm_package_version}", "version:default": "echo %npm_package_version%" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "run-script-os": "^1.0.7" } }

Since this may be the desired behavior in some situations, suggest allowing for a --no-arguments flag for the run-script-os script like:

{ "name": "test-script", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "version": "run-script-os --no-arguments", "version:nix": "echo ${npm_package_version}", "version:default": "echo %npm_package_version%" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "run-script-os": "^1.0.7" } }

process.env.npm_config_user_agent is undefined nodejs v12, npm 7.7.0 @ arch

Hi,

i've use you npm plugin on arch with nodejs v12.21.0 and npm v 7.7.0. It's looks like arch compile npm without user_agent property.

If I try to run tests. I get a undefined error:

2. Test (Generic) runs transitioning to OS specific code
/home/denco/Projects/public/run-script-os/index.js:65
const isYarn = process.env.npm_config_user_agent.includes('yarn');
                                                 ^

TypeError: Cannot read property 'includes' of undefined
    at Object.<anonymous> (/home/denco/Projects/public/run-script-os/index.js:65:50)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
    at Module.load (internal/modules/cjs/loader.js:863:32)
    at Function.Module._load (internal/modules/cjs/loader.js:708:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
    at internal/main/run_main_module.js:17:47
npm ERR! code 1
npm ERR! path /home/denco/Projects/public/run-script-os
npm ERR! command failed

thx!

Use windows when running from Cmder

Based on this PR, it will assume linux when running on cygwin.

But there are cases where you are running cygwin without the bash syntax, and will cause some issues, for example:
error

I've created a quick check to detect if Cmder is installed in which case will assume Windows (checking if a ENV var declared by Cmder exists) and it seems to be working:
working

I will submit a PR if you wish to include it in your codebase

Run platform pre/post commands if default or combination is specified

I'm not sure if this would be reasonable as a feature, since it does add some implied logic to what will run, but given the following package.json as an example:

{
    "name": "run-script-os-test",
    "version": "1.0.0",
    "description": "shows desired use of pre/post handling.",
    "scripts": {
        "preascript:win32": "echo 1 - win32 prep",
        "preascript:nix": "echo 1 - linux prep",
        "ascript": "run-script-os",
        "ascript:default": "echo 2 - platform neutral command",
        "postascript:win32": "echo 3 - win32 cleanup",
        "postascript:nix": "echo 3 - linux cleanup"
    },
    "dependencies": {
        "run-script-os": "^1.1.6"
    }
}

If you do the following, here's the actual results:

$ npm install
# ..installation output elided..
$ npm run ascript

> [email protected] ascript /root
> run-script-os


> [email protected] ascript:default /root
> echo 2 - platform neutral command

2 - platform neutral command

I'd sort of expected the following:

$ npm run ascript

> [email protected] ascript /root
> run-script-os


> [email protected] preascript:nix /root
> echo 1 - linux prep

1 - linux prep

> [email protected] ascript:default /root
> echo 2 - platform neutral command

2 - platform neutral command

> [email protected] postascript:nix /root
> echo 3 - linux cleanup

3 - linux cleanup

Based on the readme, i had hoped that doing this might be a workaround, but it similarly does not trigger pre/post:

"ascript:nix:win32": "echo 2 - platform neutral command",

Would this type of behavior be useful, even if behind a flag passed to run-script-os that could be added to the main 'ascript' command? This would make the package.json far less verbose, but still allow for "handling" all the os specific things as necessary, since in many cases the actual command invocation doesn't change between platforms. I know that you can make this work with the current implementation by adding:

"ascript:win32": "echo 2 - platform neutral command",
"ascript:nix": "echo 2 - platform neutral command",

But as i've stated, it'd be nice to remove the additional verbosity if it could identify the platform or combo that will run and appropriately run the pre/post scripts associated.

Propagate exit code

When the platform-specific script fails, it usually ends with a non-zero exit code. run-script-os hides those failures. In order to be really isomorphic, exit codes should be propagated when the script exits.

Carriage return and line endings in index.js is broken on latest update

The recent change (which has been committed) has a different line endings in index.js and due to which on ubuntu 18.04, we are getting the below error:

> run-script-os

/usr/bin/env: ‘node\r’: No such file or directory
npm ERR! code ELIFECYCLE
npm ERR! syscall spawn
npm ERR! file sh
npm ERR! errno ENOENT
npm ERR! [email protected] cmdtools_download: `run-script-os`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the [email protected] cmdtools_download script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/user/.npm/_logs/2020-03-03T15_19_54_083Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] setup: `npm run cmdtools_download && npm run sdk_manager_download`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] setup script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/user/.npm/_logs/2020-03-03T15_19_54_092Z-debug.log

use npm_lifecycle_event instead?

I want to use prepare:win32 and prepare:default and added prepare: "run-script-os" to my package.json - however it tries to run install:xxx as prepare is called from npm install.
When adding the following code it works fine:

if (process.env.npm_config_user_agent.includes('yarn') && !options[1]) options[1] = 'install';

// added this:
options[1] = process.env['npm_lifecycle_event'];

let osCommand = `${options[1]}:${platform}`;

Doesn't support install with yarn

package.json

{
  "scripts": {
    "preinstall": "run-script-os",
    "install:win32": "echo 'win32'",
    "install:darwin:linux": "echo 'darwin/linux'"
  }
}

Running: yarn (on its own) is equivalent to running yarn install, but fails with the following error:

yarn install v1.13.0
$ run-script-os
npm ERR! missing script: undefined:darwin

While: yarn install works correctly:

yarn install v1.13.0
$ run-script-os

> [email protected] install:darwin:linux /Users/Seb/Development/app
> echo 'darwin/linux'

darwin/linux
[1/5] 🔍  Validating package.json...
...

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.