Code Monkey home page Code Monkey logo

webpack-war-plugin's Introduction

Webpack WAR plugin

Build Status Coverage Status Gitter

This is a Webpack plugin which simplifies and automates the creation of a Web Application Archive (WAR) from your Webpack build outputs and other project files. This can be useful if you want to deploy your static / Single Page Web App or your applications web frontend to a Java (EE) Application server.

Installation

You can install the plugin via npm

npm install --dev webpack-war-plugin

Usage

Basic Usage

To add the webpack-war-plugin to your build just add an instance of WebpackWarPlugin to the plugins section of your Webpack configuration

const { WebpackWarPlugin } = require('webpack-war-plugin');

module.exports = {
  ...,
  plugins: [
    new WebpackWarPlugin(),
    ...
  ],
  ...
};

By default an archive containing all emitted Webpack build outputs is generated in the output directory of your Webpack build. It is named like your project.

Configuration

You can influence the generated archive by supplying a configuration object of the following structure to the plugins constructor:

type WebpackWarPluginOptions = {
    archiveName?: string;
    webInf?: string;
    additionalElements?: {
        path: string;
        destPath?: string;
    }[];
    archiverOptions?: {}
};
Option Effect
archiveName [optional] Sets the output name of the archive
webInf [optional] Specifies a path to a directory (or file) which will be included into the archive with the path WEB-INF
additionalElements [optional] Specifies multiple files or directories, which will be included in the archive. Each entry is a object with the following properties: path (The path of the source element), destPath ([optional] The path of the specified file / directory inside of the archive [by default path is used])
archiverOptions [optional] Specifies the options that should be used by archiver (used to create the archive). See https://archiverjs.com/docs/ for more information.

Example

The following plugin configuration:

const { WebpackWarPlugin } = require('webpack-war-plugin');

module.exports = {
  entry: {
    file1: './src/file1.js'
  },
  ...,
  plugins: [
    new WebpackWarPlugin({
      archiveName: 'archive',
      webInf: './web-inf',
      additionalElements: [
        { path: 'context/context.xml', destPath: 'META-INF/context.xml'},
        { path: 'package.json' },
        { path: 'images', destPath: 'assets/images' }
      ],
      archiverOptions: {
        zlib: {
          level: 9
        }
      }
    }),
    ...
  ],
  ...
};

generates an archive with the name archive.war in the Webpack output directory with the following structure:

archive.war
|
|\_ file1.js
|
|\_ WEB-INF
|          \_ web.xml
|
|\_ META-INF
|           \_ context.xml
|
|\_ package.json
|
 \_ assets
          \_ images
                   \_ img.png

Development

Typescript

The plugin is built with Typescript and the resulting package contains the corresponding typings.

Building

After checking out the project you can build transpile the Typescript via

npm run build

The build output is stored in dist.

Testing

Unit tests

Unit tests are named [tested-component].spec.ts.
They can be run via Mocha with

npm run test

Test coverage is measured via nyc and can be triggered with

npm run test:coverage

Functional tests

Functional test fixtures are located in functional_tests. To set up all fixtures run

npm run test:functional:setup

To execute the tests via Mocha run

npm run test:functional

Continuous integration

Continious integration is realized via Travis-CI. Coverage reports are shown on Coveralls. Deployments to NPM are automatically triggered via Git tags.

Licensing

The app is distributed under the MIT License (read LICENSE for more information). Copyright (c) 2017 Leo Lindhorst

Collaborating

I really appreciate any kind of collaboration!
You can use the GitHub issue tracker for bugs and feature requests or create a pull request to submit changes. If you don't want to use these possibilities, you can also write me an email to [email protected].

Contact

If you have any questions, ideas, etc. feel free to contact me:
DevWurm
Email: [email protected]
Jabber: [email protected]
Twitter: @DevWurm

webpack-war-plugin's People

Contributors

daniel-shuy avatar devwurm avatar gitter-badger avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

webpack-war-plugin's Issues

Question: option to choose jar/war

Does it make sense to add additional option to choose between jar and war archive? In face there is no difference (except file extension) between these two types, but for my deployment pipeline I need jar-file so I need to rename it manually.
So the question is - will it be useful to add such option in configuration of this plugin?

Cannon find type definition file for 'webpack'

"webpack-war-plugin": "^1.0.0-beta.3"

(...)  + 4344 hidden modules                                                                                              
                                                                                                                       
ERROR in C:/project/node_modules/webpack-war-plugin/dist/WebpackWarPlugin.d.ts  
(1,23): Cannot find type definition file for 'webpack'.                                                                
                                                                                                                       
        WAR Archive                                                                                                    
                project.war       10.97 MB        [written]                                                              
error Command failed with exit code 2.

Colors dependency is no longer in development, convert to @colors/colors

After the drama in the colors repo at the end of 2021 the original project is dead and the original owner has been barred from development. The project has been re-opened under @colors/colors. Given that webpack-war-plugin depends on the colors package, suggest moving to the new package.

Unable to create generate a WAR file after upgrading to Webpack 5

I am unable to generate a WAR file with this plugin after upgrading to Webpack 5. The specific error I get is:

Generating minified bundle. This will take a moment...
Error:  TypeError: compiler.plugin is not a function
    at WebpackWarPlugin.apply (C:\UnitySuiteFrontEnd\node_modules\webpack-war-plugin\src\WebpackWarPlugin.ts:38:14)
    at createCompiler (C:\UnitySuiteFrontEnd\node_modules\webpack\lib\webpack.js:73:12)
    at create (C:\UnitySuiteFrontEnd\node_modules\webpack\lib\webpack.js:134:16)
    at webpack (C:\UnitySuiteFrontEnd\node_modules\webpack\lib\webpack.js:142:47)
    at f (C:\UnitySuiteFrontEnd\node_modules\webpack\lib\index.js:63:16)
    at Object.<anonymous> (C:\UnitySuiteFrontEnd\tools\/build.js:12:1)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Module._compile (C:\UnitySuiteFrontEnd\node_modules\pirates\lib\index.js:136:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:1114:10)

Webpack 5 does not support compiler.plugin for any function. Is there any way that this package could be updated?

Jenkins cannot deploy WAR file created by webpack-war-plugin

Hi guys,

I added this plugin to my react project in order to get benefits of jenkins' deploy-war-to-a-container plugin. So, webpack can create the war but jenkins somehow cannot deploy it to Tomcat. I have another job which deploys the war created by maven, that works superb. What would be the reason behind this?

Cheers,

Log part:

ERROR: Build step failed with exception
org.codehaus.cargo.container.ContainerException: Failed to deploy [/home/jenkins/workspace/frontend/build/ROOT.war]
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.deploy(AbstractTomcatManagerDeployer.java:111)
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:185)
at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:73)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:116)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:103)
at hudson.FilePath$FileCallableWrapper.call(FilePath.java:2719)
at hudson.remoting.UserRequest.perform(UserRequest.java:120)
at hudson.remoting.UserRequest.perform(UserRequest.java:48)
at hudson.remoting.Request$2.run(Request.java:332)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at ......remote call to ci-slave02-b306fb41d657(Native Method)
at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1416)
at hudson.remoting.UserResponse.retrieve(UserRequest.java:220)
at hudson.remoting.Channel.call(Channel.java:781)
at hudson.FilePath.act(FilePath.java:979)
at hudson.FilePath.act(FilePath.java:968)
at hudson.plugins.deploy.CargoContainerAdapter.redeploy(CargoContainerAdapter.java:103)
at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:61)
at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:45)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:782)
at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:723)
at hudson.model.Build$BuildExecution.post2(Build.java:185)
at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:668)
at hudson.model.Run.execute(Run.java:1763)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:410)
Caused by: java.io.IOException: Error writing request body to server
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.checkError(HttpURLConnection.java:3479)
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.write(HttpURLConnection.java:3462)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:126)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.pipe(TomcatManager.java:647)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.invoke(TomcatManager.java:538)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.deployImpl(TomcatManager.java:611)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.deploy(TomcatManager.java:291)
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.deploy(AbstractTomcatManagerDeployer.java:102)
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:185)
at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:73)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:116)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:103)
at hudson.FilePath$FileCallableWrapper.call(FilePath.java:2719)
at hudson.remoting.UserRequest.perform(UserRequest.java:120)
at hudson.remoting.UserRequest.perform(UserRequest.java:48)
at hudson.remoting.Request$2.run(Request.java:332)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
java.io.IOException: Error writing request body to server
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.checkError(HttpURLConnection.java:3479)
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.write(HttpURLConnection.java:3462)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:126)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.pipe(TomcatManager.java:647)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.invoke(TomcatManager.java:538)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.deployImpl(TomcatManager.java:611)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.deploy(TomcatManager.java:291)
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.deploy(AbstractTomcatManagerDeployer.java:102)
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:185)
at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:73)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:116)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:103)
at hudson.FilePath$FileCallableWrapper.call(FilePath.java:2719)
at hudson.remoting.UserRequest.perform(UserRequest.java:120)
at hudson.remoting.UserRequest.perform(UserRequest.java:48)
at hudson.remoting.Request$2.run(Request.java:332)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Build step 'Deploy war/ear to a container' marked build as failure

Not able to deploy WAR file

18:42:27 Copied 1 artifact from "Package_Application" build number 1
18:42:27 [DeployPublisher][INFO] Attempting to deploy 1 war file(s)
18:42:27 [DeployPublisher][INFO] Deploying /var/jenkins_home/workspace/Deploy_Application_Staging_Env/java-tomcat-sample/target/java-tomcat-maven-example.war to container Tomcat 8.x Remote with context /
18:42:27 ERROR: Build step failed with exception
18:42:27 org.codehaus.cargo.container.ContainerException: Failed to redeploy [/var/jenkins_home/workspace/Deploy_Application_Staging_Env/java-tomcat-sample/target/java-tomcat-maven-example.war]
18:42:27 at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:176)
18:42:27 at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:81)
18:42:27 at hudson.plugins.deploy.CargoContainerAdapter$DeployCallable.invoke(CargoContainerAdapter.java:167)
18:42:27 at hudson.plugins.deploy.CargoContainerAdapter$DeployCallable.invoke(CargoContainerAdapter.java:136)
18:42:27 at hudson.FilePath.act(FilePath.java:1172)
18:42:27 at hudson.FilePath.act(FilePath.java:1155)
18:42:27 at hudson.plugins.deploy.CargoContainerAdapter.redeployFile(CargoContainerAdapter.java:133)
18:42:27 at hudson.plugins.deploy.PasswordProtectedAdapterCargo.redeployFile(PasswordProtectedAdapterCargo.java:95)
18:42:27 at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:113)
18:42:27 at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:123)
18:42:27 at hudson.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:81)
18:42:27 at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:48)
18:42:27 at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:808)
18:42:27 at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:757)
18:42:27 at hudson.model.Build$BuildExecution.post2(Build.java:179)
18:42:27 at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:701)
18:42:27 at hudson.model.Run.execute(Run.java:1937)
18:42:27 at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
18:42:27 at hudson.model.ResourceController.execute(ResourceController.java:100)
18:42:27 at hudson.model.Executor.run(Executor.java:433)
18:42:27 Caused by: java.net.ConnectException: Connection refused (Connection refused)
18:42:27 at java.net.PlainSocketImpl.socketConnect(Native Method)
18:42:27 at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
18:42:27 at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
18:42:27 at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
18:42:27 at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
18:42:27 at java.net.Socket.connect(Socket.java:607)
18:42:27 at java.net.Socket.connect(Socket.java:556)
18:42:27 at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
18:42:27 at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
18:42:27 at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
18:42:27 at sun.net.www.http.HttpClient.(HttpClient.java:242)
18:42:27 at sun.net.www.http.HttpClient.New(HttpClient.java:339)
18:42:27 at sun.net.www.http.HttpClient.New(HttpClient.java:357)
18:42:27 at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
18:42:27 at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
18:42:27 at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
18:42:27 at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
18:42:27 at org.codehaus.cargo.container.tomcat.internal.TomcatManager.invoke(TomcatManager.java:567)
18:42:27 at org.codehaus.cargo.container.tomcat.internal.TomcatManager.list(TomcatManager.java:882)
18:42:27 at org.codehaus.cargo.container.tomcat.internal.TomcatManager.getStatus(TomcatManager.java:895)
18:42:27 at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:161)
18:42:27 ... 19 more
18:42:27 java.net.ConnectException: Connection refused (Connection refused)
18:42:27 at java.net.PlainSocketImpl.socketConnect(Native Method)
18:42:27 at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
18:42:27 at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
18:42:27 at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
18:42:27 at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
18:42:27 at java.net.Socket.connect(Socket.java:607)
18:42:27 at java.net.Socket.connect(Socket.java:556)
18:42:27 at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
18:42:27 at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
18:42:27 at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
18:42:27 at sun.net.www.http.HttpClient.(HttpClient.java:242)
18:42:27 at sun.net.www.http.HttpClient.New(HttpClient.java:339)
18:42:27 at sun.net.www.http.HttpClient.New(HttpClient.java:357)
18:42:27 at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
18:42:27 at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
18:42:27 at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
18:42:27 at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
18:42:27 at org.codehaus.cargo.container.tomcat.internal.TomcatManager.invoke(TomcatManager.java:567)
18:42:27 at org.codehaus.cargo.container.tomcat.internal.TomcatManager.list(TomcatManager.java:882)
18:42:27 at org.codehaus.cargo.container.tomcat.internal.TomcatManager.getStatus(TomcatManager.java:895)
18:42:27 at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:161)
18:42:27 at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:81)
18:42:27 at hudson.plugins.deploy.CargoContainerAdapter$DeployCallable.invoke(CargoContainerAdapter.java:167)
18:42:27 at hudson.plugins.deploy.CargoContainerAdapter$DeployCallable.invoke(CargoContainerAdapter.java:136)
18:42:27 at hudson.FilePath.act(FilePath.java:1172)
18:42:27 at hudson.FilePath.act(FilePath.java:1155)
18:42:27 at hudson.plugins.deploy.CargoContainerAdapter.redeployFile(CargoContainerAdapter.java:133)
18:42:27 at hudson.plugins.deploy.PasswordProtectedAdapterCargo.redeployFile(PasswordProtectedAdapterCargo.java:95)
18:42:27 at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:113)
18:42:27 at jenkins.tasks.SimpleBuildStep.perform(SimpleBuildStep.java:123)
18:42:27 at hudson.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:81)
18:42:27 at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:48)
18:42:27 at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:808)
18:42:27 at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:757)
18:42:27 at hudson.model.Build$BuildExecution.post2(Build.java:179)
18:42:27 at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:701)
18:42:27 at hudson.model.Run.execute(Run.java:1937)
18:42:27 at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
18:42:27 at hudson.model.ResourceController.execute(ResourceController.java:100)
18:42:27 at hudson.model.Executor.run(Executor.java:433)
18:42:27 Build step 'Deploy war/ear to a container' marked build as failure
18:42:27 Finished: FAILURE

I've checked everything and gone through many troubleshooting steps for alot of time now. However I'm still unable to Deploy WAR File.

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.