Git Product home page Git Product logo

ember-cli-dependency-checker's Introduction

Ember CLI Dependency Checker Build Status Code Climate Ember Observer Score

An Ember CLI addon that checks for missing npm and bower dependencies before running ember commands.

Installation

ember install ember-cli-dependency-checker

Usage

Upon being included in a project (when running ember build for example), the dependency checker will confirm versions according to several signals of intent:

  • bower.json will be compared to the contents of bower_components (or your Ember-CLI configured bower directory)
  • package.json will be compared to the contents of node_modules. This check only takes the top-level of dependencies into account. Nested dependencies are not confirmed.
  • npm-shrinkwrap.json, if present, will be compared to the contents of node_modules. This is done only if a package.json check does not find any unsatisfied dependencies. Nested dependencies are confirmed.

Shrinkwrap Workflow

This workflow presumes npm v2.7.6 - v3.0.0, though it may work well for earlier versions.

When installing dependencies, it is important that npm shrinkwrap --dev is run and the resulting npm-shrinkwrap.json file committed. For example, to install the Torii library:

npm install --save-dev torii
npm shrinkwrap --dev
git add package.json npm-shrinkwrap.json
git commit -m "Install Torii"

If the npm-shrinkwrap.json file is not committed, nested dependencies cannot be confirmed. Remembering to execute npm shrinkwrap --dev and commit npm-shrinkwrap.json is akin to committing the Gemfile.lock file when using Ruby's Bundler library.

If ember is run and the contents of node_modules/ differs from the contents of package.json and npm-shrinkwrap.json an error will be raised. To resolve a difference in dependencies, you must destroy the node_modules/ directory and re-run npm install. With a blank directory, npm install will respect the versions pinned in npm-shrinkwrap.json.

In some rare cases there may be un-resolvable conflicts between installable versions of dependencies and those pinned. Upgrading packages after deleting the npm-shrinkwrap.json file or changing the version of a dependency requested in package.json may be the only way to resolve theses cases.

Deployment with Shrinkwrap

Ember-CLI projects may be built on Travis or another dedicated build tool like Jenkins. To ensure that versions of dependencies (including of nested dependencies) are the same during builds as they are on the authoring developer's computer, it is recommended that you confirm dependencies before a build. Do this by running ember version to begin a dependency check, then if needed clearing the node_modules/ and bower_components/ folder and installing dependencies. For example:

([ -f node_modules/ember-cli/bin/ember ] && node_modules/ember-cli/bin/ember version) || (rm -rf node_modules/ bower_components/ && npm install && bower install)
ember build -e production

Caveats

Due to the limited information available in configuration files and packages, git dependencies may fall out of sync. Using shrinkwrap will confirm that they are correct upon installation, but they cannot be confirmed at runtime until improvements are made to the npm-shrinkwrap.json file.

Pinning solely to versioned releases should be preferred.

Tests

To run tests:

npm test

LICENSE

MIT

ember-cli-dependency-checker's People

Contributors

acburdine avatar alvincrespo avatar bantic avatar brzpegasus avatar cibernox avatar dependabot[bot] avatar ef4 avatar ember-tomster avatar gnclmorais avatar jacobq avatar kanongil avatar kenearley avatar knownasilya avatar mansona avatar mixonic avatar nullvoxpopuli avatar olleolleolle avatar orf avatar quaertym avatar rwjblue avatar saygun avatar sergeastapov avatar stefanpenner avatar trabus avatar tschoartschi avatar turbo87 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

Watchers

 avatar  avatar  avatar  avatar  avatar

ember-cli-dependency-checker's Issues

Verify node and npm is compatible

As you can specify a node and npm version in the engines part of the package.json, can this addon be use to warn if an incompatible version is being used?

 "engines": {
   "node": "5.0.0",
   "npm": "3.3.12"
 },

null version detected for bower dependencies

When pulling a bower dependancy from a git url like: git://github.com/amk221/my-thing.git _#master_
the dependancy is determined to be 'not installed' (therefore builds fail).
It works without the #tag

npm v3 dedupe + symlinking issue

given:

a shrinkwrap

and

symlink node_modules/broccoli-merge-trees @ 1.x
node_modules/foo/node_modules/bar which depends on broccoli-merge-trees @ 0.2.x

the symlink does not correctly put the dep checker into warn only mode for that version mismatch.

Incorrectly flagging optional dependencies

I'm not sure if this is new or related to #50, but...

My shrinkwrap file includes fsevents with "optional": true and so naturally npm doesn't install it on linux where it's not supported. But when running ember exam, I get:

Missing npm-shrinkwrap packages: 
Package: fsevents
Required by: pagerduty
  * Specified: 1.1.1
  * Installed: (not installed)
Run `rm -rf node_modules/ && npm install` to install missing dependencies.

The optional attribute was just added to npm shrinkwrap around the end of last year, so I wouldn't be surprised if it's not supported here yet, but it probably should be?

Temporary workaround might be just removing that bit from the npm shrinkwrap file for now.

Idea: fail build if peerDep is missing?

๐Ÿ‘‹ Hey there! I wanted to open an issue to discuss adding peerDependencies support to ember-cli-dependency-checker.

I've gone around a few times with folks like @ef4 and @Turbo87 about the best way for addons to specify their dependencies. It seems peerDependencies is semantically often what we want, but it's currently not really used or enforced by existing tooling.

If ember-cli-dependency-checker failed builds if a peer dependency were missing, it would encourage addon authors to start using them more, and might make everyone's lives a little easier.

What do you think? Has there been priori discussion around this? I'm just learning about these issues, but often get recommended to consider using peerDependencies even though it's not currently enforced anywhere. If this addon supported it, I think myself and others would be more incentivized to use it.

Warn, don't error if a dependency is the wrong version.

Erroring out on missing dependencies is useful, erroring out on incorrect dependencies is a PITA. Often a dependency is mismatched because a new version is being trialed, and often it's a more recent version than the one in package.json. Warning would be much more useful.

Option to error out when missing dependencies found

Thanks for this addon. I've been needing something like this for a while now. Any chance an option be added to error out of the command if missing dependencies are detected?

The application shouldn't work anyway so I think this would be reasonable.

Better error message possible

A try catch here would allow us to include which package failed.

The existing error message is as follows:

Invalid Version: *
TypeError: Invalid Version: *
    at new SemVer (/Users/offirgolan/Documents/Projects/Ember-Components/ember-cp-validations/node_modules/ember-cli-dependency-checker/node_modules/semver/semver.js:295:11)
    at Range.test (/Users/offirgolan/Documents/Projects/Ember-Components/ember-cp-validations/node_modules/ember-cli-dependency-checker/node_modules/semver/semver.js:1049:15)
    at Function.satisfies (/Users/offirgolan/Documents/Projects/Ember-Components/ember-cp-validations/node_modules/ember-cli-dependency-checker/node_modules/semver/semver.js:1098:16)
    at Function.VersionChecker.satisfies (/Users/offirgolan/Documents/Projects/Ember-Components/ember-cp-validations/node_modules/ember-cli-dependency-checker/lib/version-checker.js:31:17)
    at Package.updateRequired (/Users/offirgolan/Documents/Projects/Ember-Components/ember-cp-validations/node_modules/ember-cli-dependency-checker/lib/package.js:21:26)
    at Package.init (/Users/offirgolan/Documents/Projects/Ember-Components/ember-cp-validations/node_modules/ember-cli-dependency-checker/lib/package.js:15:27)
    at new Package (/Users/offirgolan/Documents/Projects/Ember-Components/ember-cp-validations/node_modules/ember-cli-dependency-checker/lib/package.js:4:13)
    at EmberCLIDependencyChecker.<anonymous> (/Users/offirgolan/Documents/Projects/Ember-Components/ember-cp-validations/node_modules/ember-cli-dependency-checker/lib/dependency-checker.js:122:12)
    at Array.map (native)
    at EmberCLIDependencyChecker.readDependencies (/Users/offirgolan/Documents/Projects/Ember-Components/ember-cp-validations/node_modules/ember-cli-dependency-checker/lib/dependency-checker.js:118:36)

Proposed error message:

Package: <Package Name> - <Reason>
Path: <Path>
# ... rest of stack trace

ember-cli org

Not a all required, if you are interested ember-cli org now exists now and as this repo provides core functionality you are welcome to transition it to that org.

I will be sure you continue to maintain existing commits + ownership.

If at this point in time you would prefer not to, this is fine. But if in the future you no-longer want to maintain this project, I will then gladly welcome it on the org.

Warns when dependencies are not installed

Does make sense to ember-cli-dependency-checker warns when node_modules or bower_components are not present?
For instance running some ember-cli command in a project without node_modules will throw Error: Cannot find module 'ember-cli/lib/broccoli/ember-app'. I think we could show a better message like: No dependencies installed. Run npm installandbower install to install missing dependencies.

This is related to ember-cli/ember-cli#3961, but I think this kind of check belongs here.

Thoughts?

//cc @stefanpenner @quaertym

The addon `ember-cli-pagination` requires the npm package `ember-cli` to be above 1.13.0, but you have 2.2.0-beta.1.

The addon `ember-cli-pagination` requires the npm package `ember-cli` to be above 1.13.0, but you have 2.2.0-beta.1.
Error: The addon `ember-cli-pagination` requires the npm package `ember-cli` to be above 1.13.0, but you have 2.2.0-beta.1.
    at DependencyVersionChecker.assertAbove (/Users/dsaenzt/Projects/js_image_client2/node_modules/ember-cli-pagination/node_modules/ember-cli-version-checker/index.js:81:18)
    at Class.module.exports.init (/Users/dsaenzt/Projects/js_image_client2/node_modules/ember-cli-pagination/index.js:10:37)
    at new Class (/Users/dsaenzt/Projects/js_image_client2/node_modules/ember-cli/node_modules/core-object/core-object.js:18:12)
    at /Users/dsaenzt/Projects/js_image_client2/node_modules/ember-cli/lib/models/addons-factory.js:48:19
    at visit (/Users/dsaenzt/Projects/js_image_client2/node_modules/ember-cli/lib/utilities/DAG.js:23:3)
    at DAG.topsort (/Users/dsaenzt/Projects/js_image_client2/node_modules/ember-cli/lib/utilities/DAG.js:82:7)
    at AddonsFactory.initializeAddons (/Users/dsaenzt/Projects/js_image_client2/node_modules/ember-cli/lib/models/addons-factory.js:44:9)
    at Project.initializeAddons (/Users/dsaenzt/Projects/js_image_client2/node_modules/ember-cli/lib/models/project.js:376:36)
    at Project.eachAddonCommand (/Users/dsaenzt/Projects/js_image_client2/node_modules/ember-cli/lib/models/project.js:427:10)
    at module.exports (/Users/dsaenzt/Projects/js_image_client2/node_modules/ember-cli/lib/cli/lookup-command.js:33:13)

Add ember-cli team to `npm` for releases...

This addon has been extremely helpful to all ember-cli users for quite some time. Since this is somewhat fundamental to newly generated ember-cli applications, I'd like to reduce bus factor and get a few of the ember-cli core team members added to npm for releasing updates and fixes.

The following would be a great start:

npm owner add stefanpenner ember-cli-dependency-checker
npm owner add rwjblue ember-cli-dependency-checker
npm owner add turbo87 ember-cli-dependency-checker

/cc @quaertym

Release 1.2.0 is causing deprecation warnings

Version 1.2.0 is causing the following error

DEPRECATION: Overriding init without calling this._super is deprecated. Please call this._super.init && this._super.init.apply(this, arguments); addon: ember-cli-dependency-checker

Commit 6c05a33 fixes this. Can we get a new release out?

Detect installed but not manifested dependencies

Sometimes a dependency is removed from bower.json or package.json and it stays installed on the developer machine. This addon can warn developer when that happens. In this case, developer can run prune command or manifest that dependency.

Update Dependency Error Message?

The addon currently displays "Missing npm packages" and "Run npm install to install missing dependencies" (same with Bower). However, the error might be a bit misleading because sometimes, the packages are installed; they're just not the right version.

Also, I realize this is a bit subjective, but it'd be nice to minimize the colors used in the error message (replace green with white?):

screen shot 2014-10-31 at 5 30 33 pm

Unrecognized version that doesn't follow semantic version

I just installed Block UI via bower. There version it specifies in its bower.json is 2.70 without a patch version. This causes the cli to tell me:

Invalid Version: 2.70
TypeError: Invalid Version: 2.70
    at new SemVer (/Users/will.henry/Desktop/unikitty/core/smallbiz/node_modules/ember-cli-dependency-checker/node_modules/semver/semver.js:295:11)

If I manually change it to 2.70.0 all is well. But I don't want to do that. How do I ignore this check for blockUI? The "whitelist" issue only checked if a dependency didn't have a bower.json?

semver doesn't recognise a version of "*"

If a dependency has a version of "*" then the dependency checker throws an exception, and doesn't indicate where the dependency is coming from.

Invalid Version: *
TypeError: Invalid Version: *
    at new SemVer (terminal/node_modules/ember-cli-dependency-checker/node_modules/semver/semver.js:273:11)
    at Range.test (terminal/node_modules/ember-cli-dependency-checker/node_modules/semver/semver.js:998:15)
    at Function.satisfies (terminal/node_modules/ember-cli-dependency-checker/node_modules/semver/semver.js:1047:16)
    at Package.updateRequired (terminal/node_modules/ember-cli-dependency-checker/lib/package.js:35:18)
    at new Package (terminal/node_modules/ember-cli-dependency-checker/lib/package.js:7:27)
    at EmberCLIDependencyChecker.<anonymous> (terminal/node_modules/ember-cli-dependency-checker/lib/dependency-checker.js:85:12)
    at Array.map (native)
    at EmberCLIDependencyChecker.readBowerDependencies (terminal/node_modules/ember-cli-dependency-checker/lib/dependency-checker.js:82:36)
    at EmberCLIDependencyChecker.checkDependencies (terminal/node_modules/ember-cli-dependency-checker/lib/dependency-checker.js:28:24)
    at new EmberCLIDependencyChecker (terminal/node_modules/ember-cli-dependency-checker/lib/dependency-checker.js:19:8)

Installed package is not recognized

I just upgraded to Ember 1.10 beta by adding "ember": "~1.10.0" to bower.json. I ran bower install, and everything installed. But the dependency checker fails when I try to start ember-cli:

$ ember s
version: 0.1.4

Missing bower packages: 
Package: ember
  * Specified: ~1.10.0
  * Installed: 1.10.0-beta.3

Please recognize packages that are correctly installed and meet the requested dependencies.

(tested on ember-cli-dependency-checker version 0.0.6 and 0.0.7)

feedback

my incredibly version pedantic feedback.

Detect yarn and surface correct error message

It would be nice to not have the error message for missing dependencies say to use npm install when you're using yarn in that project. Developers who are not familiar with what's going on will just trust the error message instead of realizing that they should actually have run yarn install.

Tests?

Not trivial I realize, but tests seem fairly important to make sure we deal with the edge cases.

Checker does not follow node-semver rules for beta versions

My package.json contains this line: "ember-cli-sass": "^3.0.3",. Trying to run ember build results in this message:

Missing npm packages: 
Package: ember-cli-sass
  * Specified: ^3.0.3
  * Installed: 3.1.0-beta

Run `npm install` to install missing dependencies.

According to the node-semver documentation about prereleases, version 3.1.0-beta does in fact satisfy the specifier ^3.0.3. Pretty sure it is right, because npm install installed version 3.1.0-beta. Please either follow the specifier rules used by the package managers or change the error message to explain why you don't follow them and how to fix the problem. The error message says to run npm install, and that is just flat out wrong.

New Release?

Might need to be a 0.1.0 to signify that there are relatively large changes (I'm thinking of the shrinkwrap work), but either way I'd love to have a new version to start testing/playing with.

Unhelpful message `TypeError: Invalid Version: *`

After having linked a local module for development, and forgetting I had done so, I was left with this unhelpful message:

~/Code/project (develop *)$ ember dependency-lint
Invalid Version: *
TypeError: Invalid Version: *
    at new SemVer (/Users/pcm/Code/web-directory/node_modules/ember-cli-dependency-checker/node_modules/semver/semver.js:295:11)
    at Range.test (/Users/pcm/Code/web-directory/node_modules/ember-cli-dependency-checker/node_modules/semver/semver.js:1049:15)
    at Function.satisfies (/Users/pcm/Code/web-directory/node_modules/ember-cli-dependency-checker/node_modules/semver/semver.js:1098:16)
    at Function.VersionChecker.satisfies (/Users/pcm/Code/web-directory/node_modules/ember-cli-dependency-checker/lib/version-checker.js:31:17)
    at Package.updateRequired (/Users/pcm/Code/web-directory/node_modules/ember-cli-dependency-checker/lib/package.js:21:26)
    at Package.init (/Users/pcm/Code/web-directory/node_modules/ember-cli-dependency-checker/lib/package.js:15:27)
    at new Package (/Users/pcm/Code/web-directory/node_modules/ember-cli-dependency-checker/lib/package.js:4:13)
    at EmberCLIDependencyChecker.<anonymous> (/Users/pcm/Code/web-directory/node_modules/ember-cli-dependency-checker/lib/dependency-checker.js:133:12)
    at Array.map (native)
    at EmberCLIDependencyChecker.readDependencies (/Users/pcm/Code/web-directory/node_modules/ember-cli-dependency-checker/lib/dependency-checker.js:129:36)

By following that stacktrace though to here I just threw in this:

    try {
        return new Package(name, versionSpecified, versionInstalled, path);
    } catch (e) {
        console.error('Error mapping package', name, versionSpecified, versionInstalled, path);
        throw(e);
    }

Which gave me a much more helpful

Error mapping package SimpleWebRTC ~2.2.0 * bower_components/SimpleWebRTC

If you'd be amenable to this change, or even just a helpful console log if versionSpecified or versionInstalled is '*' I'll open a PR.

Yarn PnP Support

Part of ember-cli PnP meta issue (ember-cli/ember-cli#8164).

We need to update this code (and any other that uses resolve.sync):

const nodePackage = resolve.sync(path.join(name, 'package.json'), { basedir: this.project.root });

We can do either of the following:

  • Wait for browserify/resolve#170 to land, bump the version here, and pass useProcessResolution to the resolve.sync call.
  • Update to use this.project.resolveSync (and assume that ember-cli will address as part of ember-cli/ember-cli#8164).

I would suggest swapping to this.project.resolveSync since it works for older ember-cli versions and allows us to move forward immediately...

False positive `Missing npm packages:` when installing from tarball

I've run into a problem that I suspect is related to ember-cli-dependency-checker:
adopted-ember-addons/ember-electron#355 (comment)

Basically we are installing a package via the npm install <tarball file> syntax (to work around a caching problem and a symlink problem), but the dependency checker seems to get confused about this and think the wrong package is installed:

Missing npm packages: 
Package: ember-electron
  * Specified: file:../../tmp-2580rXGPRrApjWO8/ember-electron-cachebust.tgz
  * Installed: file:C:/Users/appveyor/AppData/Local/Temp/1/tmp-2580rXGPRrApjWO8/ember-electron-cachebust.tgz
Run `npm install` to install missing dependencies.

can't track master

I have a dependency which I would like to track master branch on github:

"devDependencies": { ...
  "ember-cli-smenu": "shaunc/ember-smenu"
}

When I try to install another addon, I can't because dependency check fails.

Perhaps in this and similar cases, you could ignore (or warn) on check?

Alternatively (or in addition), in .ember-cli or in own config package, there could be a list of dependencies to skip.

transition away from SKIP_DEPENDENCY_CHECKER for linked projects

overall the dependency checking is extremely valuable, except when developing a module via npm link.

Using SKIP_DEPENDENCY_CHECKER=true in this scenario is actually an anti-pattern, as it is insufficiently granular.

Let me propose instead, npm link'ed modules that do not satisfy the version contraints by default merely warn.

note: https://github.com/quaertym/ember-cli-dependency-checker/blob/master/lib/dependency-checker.js#L31

cc @rwjblue

Split core logic into separate package to be used outside of ember

I love the way this package works inside of ember cli. I would really like to have similar functionality in another non-ember application (a simple node.js server project). I've only quickly scanned the code here, but it seems like it wouldn't be too hard to split this into two separate npm packages. One being a generic package that does the version checking in an ember agnostic way and the second still being called ember-cli-dependency-checker which would consume the first. I envision the first package returning some sort of json structure that describes what packages are missing and/or need updating.

Do you think this could be done without too much pain and suffering? If you had the time and interest to create such a package, I may be willing to trade you for my left kidney. If not, I would be willing to attempt using your code to create such a package (assuming you think it's do-able and I have your blessing). However, I do have a looming deadline at the moment so it would be a few weeks before I could look into it.

Broken with npm5 generated shrinkwraps

When I run any ember command I get a long list of missing packages:

Missing npm-shrinkwrap packages: 
Package: extend
Required by: mtv-cast-receiver / fsevents
  * Specified: https://registry.npmjs.org/extend/-/extend-3.0.0.tgz
  * Installed: 3.0.0
โ€ฆ

Apparently, a bunch of the packages use the package download url as the version in npm-shrinkwrap.json, eg.:

        "extend": {
          "version": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz",
          "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=",
          "dev": true,
          "optional": true
        },

As far as I can tell, it is allowed within the design of package locks, and needs to be handled here.

I suspect the solution would be to also do a check against the "_resolved" field in the installed package.json?

Ignore `ember install` command

If possible, this addon should ignore the ember install command (as well as install:npm and install:bower) since that command is used to update dependencies.

Don't check dependencies for commands other than `test/serve/build`

This addon should not be checking dependencies for commands that aren't test serve or build. By doing so it breaks many commands that still valid, and likely even what the user needs at that moment in time, such as ember install or ember update.

One of the things I'm doing with ember-cli-toolbelts is enabling easier dependency maintenance, but this addon conflicts with that.

Add command to "fix" missing deps.

I'm basically proposing adding a ember fix-dependencies command that does essentially the following:

  • For npm deps installed at the wrong versions: rimraf('node_modules/<package-name>');
  • For bower deps installed at the wrong versions: rimraf('bower_components/<package-name>');
  • npm install
  • bower install

This is essentially what we all have to do manually right now after seeing we have the wrong deps, it would be nice if the error that prints out today by the dep checker could include a reference to the command that would "fix" things...

Release 1.0.0 ?

Hey, could you please release so the following goes out #31 ? we would like to include this in the next release of ember-cli which will be out today (hopefully)

Yarn workspaces

Hi, it doesn't work correctly with Yarn workspaces... Here is the issues: yarnpkg/yarn#4503 (same as yarnpkg/yarn#4081). All other apps works fine, they search for node_modules in root dir instead of current dir if they don't find it, but Ember just search it in current dir...

Ability to specify a whitelist

It's possible (and not uncommon) to install packages using bower that don't have a bower.json. For example, Sinon.js doesn't provide a Bower package, so you install it using an HTTP URL:

"sinon": "http://sinonjs.org/releases/sinon-1.10.0.js",

This is reported as "(not installed)" by this module and prevents ember-cli from starting. The only workaround that I can see is to remove this module.

It would be good to be able to specify a "whitelist" of packages that should be ignored.

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.