Giter VIP home page Giter VIP logo

laravel-htmlmin's Introduction

Laravel HTMLMin

Laravel HTMLMin is currently maintained by Raza Mehdi, and is a simple HTML minifier for Laravel. It utilises Mr Clay's Minify package to minify entire responses, but can also minify blade at compile time. Feel free to check out the change log, releases, license, and contribution guidelines.

Tests Software License Latest Version

Installation

Laravel HTMLMin requires PHP 5.5+. This particular version supports Laravel 5.1-5.8, 6.x, 7.x and 8.x.

To get the latest version, simply require the project using Composer:

$ composer require htmlmin/htmlmin

Once installed, register the service provider in your config/app.php

'providers' => [
    HTMLMin\HTMLMin\HTMLMinServiceProvider::class
]

If you want, a facade is available to alias

'aliases' => [
    'HTMLMin' => HTMLMin\HTMLMin\Facades\HTMLMin::class
]

Configuration

Laravel HTMLMin supports optional configuration.

To get started, you'll need to publish all vendor assets:

$ php artisan vendor:publish

This will create a config/htmlmin.php file in your app that you can modify to set your configuration. Also, make sure you check for changes to the original config file in this package between releases.

There are three config options:

Automatic Blade Optimizations

This option ('blade') enables minification of the blade views as they are compiled. These optimizations have little impact on php processing time as the optimizations are only applied once and are cached. This package will do nothing by default to allow it to be used without minifying pages automatically. The default value for this setting is false.

Force Blade Optimizations

This option ('force') forces blade minification on views where there such minification may be dangerous. This should only be used if you are fully aware of the potential issues this may cause. Obviously, this setting is dependent on blade minification actually being enabled. The default value for this setting is false.

Ignore Blade Files

This option ('ignore') is where you can specify paths, which you don't want to minify. A sensible default for this setting is provided.

Usage

HTMLMin

This is the class of most interest. It is bound to the ioc container as 'htmlmin' and can be accessed using the Facades\HTMLMin facade. There are four public methods of interest.

The 'blade' method will parse a string as blade and minify it as quickly as possible. This is method the compiler class uses when blade minification is enabled.

The 'css' and 'js' methods will parse a string as css/js and will minify it using Mr Clay's Minify package.

The 'html' method will parse a string as html and will minify it as best as possible using Mr Clay's Minify package. It will also be able to minify inline css and js. This is the method that is used by the minification middleware.

Facades\HTMLMin

This facade will dynamically pass static method calls to the 'htmlmin' object in the ioc container which by default is the HTMLMin class.

Minifiers\MinifierInterface

This interface defines the public method a minifier class must implement. Such a class must only provide a 'render' method which takes one parameter as a string, and should return a string. This package ships with 4 implementations of this interface, but these classes are not intended for public use, so have no been documented here. You can see the source here.

Http\Middleware\MinifyMiddleware

You may put the HTMLMin\HTMLMin\Http\Middleware\MinifyMiddleware middleware in front of your routes to live minify them. Note that this middleware allows you to achieve maximal results, though at a performance cost because of it running on each request instead of once like the built in blade minification. It may be useful for you to take a look at the source for this, read the tests, or check out Laravel's documentation if you need to.

Skipping Minification

As well as being able to skip folders using the ('ignore') config, there are occasions where you will want to 'skip' single files.

Just add the following comment to each file you want to skip:

<!-- skip.minification -->

Please note that if you use ('force') option in the config it will not work.

HTMLMinServiceProvider

This class contains no public methods of interest. This class should be added to the providers array in config/app.php. This class will setup ioc bindings and register automatic blade minification based on the config.

Further Information

There are other classes in this package that are not documented here (such as the compiler class). This is because they are not intended for public use and are used internally by this package.

Please note to clear view cache to see changes.

php artisan view:clear

Security

If you discover a security vulnerability within this package, please send an e-mail to Raza Mehdi at [email protected]. All security vulnerabilities will be promptly addressed.

License

Laravel HTMLMin is licensed under The MIT License (MIT).

laravel-htmlmin's People

Contributors

andreiio avatar bitdeli-chef avatar bramburn avatar burakerdem avatar dansmith83 avatar danwall avatar diadal avatar grahamcampbell avatar guidocella avatar kristofmorva avatar miladnouri avatar mul14 avatar mweghorst avatar phuongnamsoft avatar rodrigopedra avatar scottbedard avatar shonetow avatar shovhan avatar srmklive avatar tehwave avatar xel1045 avatar ziishaned 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

laravel-htmlmin's Issues

Compiler Breaks Blade Extensions

Using the Blade compiler minification option breaks Blade extensions. From the looks of things your minification is similar to fitzrev/laravel-html-minify, and that package shares the same issue (fitztrev/laravel-html-minify#21 (comment)).

Specifically, the BladeCompiler::$extensions property is an empty array when the BladeCompiler::compileExtensions method is run. I am sure that the extensions are successfully registering via the BladeCompiler::extend method but can't put my finger on what happens from there. I'm not sure if the issue is with Laravel or the package but ATM I can't find a minifier at the compile stage that doesn't have this problem.

Flattening <pre> tags with newlines in them

I have a blade file that contains a <pre> tag, however this package will flatten:

<pre>
foo
bar
</pre>

into a single line foo bar disregarding the newline. Is there any way to fix this?

Not every view is being compiled.

Hey there, nice package.

So when enabling 'Automatic Blade Optimisations' maybe 80% of my views compile.
The others, refuse to. So after some playing around I found that, indeed, 'Force Blade Optimisations' will 100% minify the views.

My question is why should it be 'USED WITH CAUTION', I don't really understand the potential security threats there, when all it's essentially doing is removing whitespace.

Also how can I compose a view so that I do not need to use the force setting? Like all the html validates fine, so what is it that's causing the view to refuse to be minified. Do I even need to be weary of the forced blade optimisations?

So yeah if you could expand on what the differences are amongst those settings, that'd be sweet.

Luka

the MinifyMiddleware not removing new lines

its just remove all whitespace but leave new lines, is it by intend?

this:

<div class="navbar-header">
        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"
                aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
        </button>
        <a class="navbar-brand" href="#"><img src="/logo.png" style="max-height:25px;"></a>
    </div>

become this:

<div
class="navbar-header">
<button
type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"
aria-expanded="false" aria-controls="navbar">
<span
class="sr-only">Toggle navigation</span>
<span
class="icon-bar"></span>
<span
class="icon-bar"></span>
<span
class="icon-bar"></span>
</button>
<a
class="navbar-brand" href="#"><img
src="/logo.png" style="max-height:25px;"></a></div>

What are potential issues with "force"

This option ('force') forces blade minification on views where there such minification may be dangerous. This should only be used if you are fully aware of the potential issues this may cause. Obviously, this setting is dependent on blade minification actually being enabled. The default value for this setting is false.

I am unsure what the potential issues are ? can you please tell me what they are so I can have better judgment?

HTMLMin not working for Laravel 4.2

Hi,

I'm not sure if this is a problem with laravel or your package or mine.

Well all along I have been using laravel-html-minify until recently where I discovered that it just stopped working, no errors but when view source, nothing gets minified. So I deleted the compiled view files at storage/views.

But the problem pesist. So I decided to switch to HTMLMin. Had the same problem as well. blade option true, didn't see minification happen.

For live option true, all I see is all the space on the left are trimmed away, but everything that is on that line still stays on the same line.

I'm not sure if it helps to show you my composer.json to see if anything conflict with yours

    "require": {
        "laravel/framework": "4.2.*",
        "graham-campbell/markdown": "~2.0",
        "maatwebsite/excel": "1.*",
        "watson/validating": "0.10.*",
        "guzzlehttp/guzzle": "~4.0",
        "jenssegers/agent": "~2.1",
        "barryvdh/laravel-dompdf": "0.4.*",
        "frozennode/administrator": "dev-master",
        "graham-campbell/throttle": "~2.0",
        "propaganistas/laravel-phone": "~1.2",
        "pubnub/pubnub": "~3.7",
        "aloha/twilio": "dev-master",
        "antoineaugusti/laravel-easyrec": "0.5.2",
        "iron-io/iron_mq": "~3.0",
        "graham-campbell/htmlmin": "~2.0",
        "roave/security-advisories": "dev-master"
    },
    "require-dev": {
        "way/generators": "~2.0",
        "barryvdh/laravel-ide-helper": "~1.11",
        "barryvdh/laravel-debugbar": "~1.8",
        "phpunit/phpunit": "4.5.*"
    },

Thank you.

Config File Not Generated

I have followed your instruction and even noticed the missing "r" in the service provide(r) per your instruction. On running "php artisan vendor:publish" the config file is not added to Laravel's config folder.

don't minify markdown

I'm using Laravels 5.4 new Markdown Mail framework, but this plugin keeps stripping away newlines in markdown files. I'd love to see a way to ignore markdown blade files.

URL rendering issue in email blade

Use case: Laravel's standard password reminder/reset email. For this, I have set up a simple emails/pwreset.blade.php that echoes out the corresponding route {{ URL::route(...) }}. All fine with HTMLMin turned off. Strangely, when turned on, the received email shows the URL with a double dot in the domain name, i.e. domain..ch instead of domain.ch. If I rename pwreset.blade.php to pwreset.php with standard php echo (easy workaround), all fine again even with HTMLMin turned on. So something is happening here between Laravel's blade compiler, HTMLMin and/or SwiftMailer(?). No big deal, but possibly a small symptom of a wider issue.

Inline PHP comments within blade @php tags comments out succeeding code

When automatic blade optimizations is set to true in the config file, the following:

<?php
    // Just a comment
    $str = 'abc';
?>

@php
    // Just a comment
    $str = 'abc';
@endphp

Gets minified and compiled to:

<?php
    // Just a comment
    $str = 'abc';
?>
 <?php // Just a comment $str = 'abc'; ?>

Using the regular <?php ?> tags is fine, but when using the blade @php @endphp tags, the inline comment and succeeding code gets pushed onto the same line and is commented out.

Not a huge deal as /* */ can be used for comments instead. Just thought it worth pointing out.

Thanks.

Problem after installing

After I install laravel 5 and this via composer and add the two lines at config -> app I'm getting errors like: BadMethodCallException in ServiceProvider.php line 111: Call to undefined method [package]

at ServiceProvider->__call('package', array('graham-campbell/htmlmin', 'graham-campbell/htmlmin', 'C:\xampp\htdocs\vdhjonas\laravel\vendor\graham-campbell\htmlmin\src')) in HTMLMinServiceProvider.php line 46

So whatever view or url request I do I get this and when I use the command line 'php artisan publish:config graham-campbell/htmlmin' -> same error.
I used this line: composer create-project laravel/laravel test-laravel-5-project dev-develop --prefer-dist
for installing laravel 5. So can someone help me or get this fixed? thanks in advance.

Support for custom Blade tags

I am developing an application using AngularJS and need to modify the Blade content tags from the default {{ }} to avoid clashes.

Blade::setRawTags('@<%', '%>');
Blade::setContentTags('<%', '%>');
Blade::setEscapedContentTags('<%%', '%%>');

This seems to work fine with a clean install of Laravel 5, but not when using this package. The minifier seems to ignore these options completely.

Any suggestions?

Thanks.

These elements created a bug in the blade minifier

<!--[if IE 8]> <html lang="{{Lang::getLocale()}}" class="ie8 no-js"> <![endif]-->
<!--[if IE 9]> <html lang="{{Lang::getLocale()}}" class="ie9 no-js"> <![endif]-->
<!--[if !IE]><!-->
<html lang="{{Lang::getLocale()}}">
<!--<![endif]-->

These elements broke down the HTML Minifier

Custom Blade Directives Do Not Get Rendered

With blade minification turned on, any custom directives just get turned into plain text, example:

Blade Minification On
image

Blade Minification Off
image

The force option doesn't seem to affect the behavior....

[Feature request] Exclude some View folders

Hello and thanks for this useful piece of code :)

I had a hard time to understand why my text/plain emails (in /resources/views/emails folder) were displayed without any line breaks in my inbox. :)
They were just minified as the rest of my HTML views.

It would be great to be able to exclude some folders or some files or any tips to help me?

Thanks a lot.

configurable all minify options?

I have a use case that I need to not remove html comments,
would you accept a pr that make all the minifies into configable options?
like:

'minifiers' => [
        'html' => [
            'remove_comments' => true,
            'trim_newlines' => true,
            etc..
        ]
    ]

lot of @break in views

I have integrated GrahamCampbell/Laravel-HTMLMin in my project and i get lot of @break in my page
please check attached image

screenshot from 2017-07-05 09-09-25

How to minify JS/CSS

Hello,
I haven't found a way to contact you elsewhere. I'm not to long into Laravel and I don't understand how to minify JS/CSS. The HTML minification works like a charme. But how to minify a stylesheet?

Live HTML Doesn't Get Minified

The output for "Automatic Live Optimizations" doesn't really seem to minifiy. At the moment it just breaks up the lines awkwardly with no real space saving.

Source:

<nav class="top_nav">
    <a href="/repairs">Repairs</a>
    <a href="/services">Services</a>
    <a href="/pricing">Pricing</a>
</nav>

Output:

<nav
class="top_nav">
<a
href="/repairs">Repairs</a>
<a
href="/services">Services</a>
<a
href="/pricing">Pricing</a>
</nav>

Expected:

<nav class="top_nav"><a href="/repairs">Repairs</a><a href="/services">Services</a><a href="/pricing">Pricing</a></nav>

Alias/Facade and Service Providers in README are wrong

Hi there,

Have just finished installing and configuring this package to a project, and found out the Facade/Provider lines mentioned did not work for me.

Facade/Alias
I replaced 'HTMLMin' => HTMLMin\HTMLMin\Facades\HTMLMin::class, with 'HTMLMin' => GrahamCampbell\HTMLMin\Facades\HTMLMin::class,

Service Provider
I replaced HTMLMin\HTMLMin\Http\Middleware\MinifyMiddleware with GrahamCampbell\HTMLMin\HTMLMinServiceProvider::class.

Both substitutes mentioned above worked in my case. I just would like to confirm if this is correct?

The whole file that includes bad html is skipped from compression

You've used containsBadHtml function at BladeMinifier class to detect bad html and used shouldMinify function to decide whether skip the whole file that contains these pieces of codes. It was nicer if you took those segments out, minified them separately in case of need and put them back after compressing other codes.

WARN: using htmlmin besides artesaos/defender and other packages

Hello,

i have found a bug when using GrahamCampbell/Laravel-HTMLMin and artesaos/defender together.

artesaos/defender registers some custom blade directives like @shield and @endshield... when using the option "Automatic Blade Optimizations" the directives will be printed instead of replaced by php code.

htmlmin.php not generated

I installed this package and ran php artisan vendor:publish and I get the message Nothing to publish.

Any idea how to fix this?

Example of CSS and JS minifier

I know this sounds silly but this is what I found out from the API and other documentations of how to use the CSS Minifier which isn't working. Please guide me on how (and where) to use the correct code (what code exactly).

<link href="{!!HTMLMin::css('/themes/bootstrap/assets/global/css/components.css')!!}" rel="stylesheet">

master blade template is not minified

Hello,

I have a 'master.blade.php' file that includes the rest of the templates inside the body tag.
Those templates are minified, but not the master one.

I have both options, 'blade' and 'force' with TRUE value.

As you see in the image, the code inside the body tag occupies one line, but not the rest of the code.

captura de pantalla 2015-09-15 a la s 20 06 21

I am the only one with this problem, or is this a bug?

Thank you.

[2.0] Blade View Minification Not Working

@andrewdworn is having and issue with blade minification. He says that the blade files are not being minified on compile. He says:

The extension works in live mode, but doesn't work when only blade config option is enabled.
I've just upgraded to Laravel 4.2.6, and followed the install instructions.

The HTMLMin::html($value) function also works! Although, my html code gets 'divided' in strange places, for example:

...<ul
class="pipe"><li>...

I said:

I assume this issue is caused by the following scenario:

  1. You have a Laravel 4.2 project and you've been using it before you installed my package.
  2. You installed my package (~2.0@dev) and registered the service provider correctly.
  3. You enabled blade minification, but for some reason you observe no change.

Let me explain why this happens. Before you installed this package, Laravel compiled your views and stored then in "app/storage/views". Laravel will only re-compile a view if it has been modified. You now enable blade minification, but the old compiled view files still exist, and Laravel sees that the views haven't changed, so it doesn't re-compile then.

What you need to do to get Laravel to re-compile the views is to open up "app/storage/views" and delete all compiled views. Now Laravel will re-compile the views as you need them, and they should be minified.

Let me know how you get on, and give me a buzz if you've got any further questions.

He replied with:

Thanks for the quick answer!
I have my "app/storage/views" dir open in mc all the time, and I clean it before expecting any change in my page, so it must be something else...


This issue was extracted from #11 (comment).

New lines removed causing text between tags to be bunched together

First off, thanks for this package. I did notice some strange inconsistency that's causing some new lines to be removed and replaced with nothing.

Using Laravel 5.2.43, Laravel-HTMLMin 4.3,PHP 7.0.9, blade compilation disabled, live compilation via middle is active.

It's easier to just provide the reproducible code:

Example 1: Current, correct minification:

<p>Hello
<b>World</b></p>

Gets minified as:

<p>Hello
<b>World</b></p>

There's no change, which is good. The intentional line break before the opening bold <b> tag is honored.

Example 2: Incorrect minification (notice the extra line break in the middle):

<p>Hello

<b>World</b></p>

Gets minified to this:

<p>Hello<b>World</b></p>

The two words get bunched together, new line eliminated, and there's not even a space separating Hello and World. This changes the layout, and the actual wording from Hello World to HelloWorld

I'm just using the bold <b> tag as an example. This happens with other tags as well.

Thanks.

Specific blade syntaxes are outputed as text

Hey there,

thanks for this really good package.
I use the rappasoft boilerplate wich add some blade extensions (url), but those extensions when used are outputed as plain text when minified.

Anyway to add those extensions to the minifier list ?

Improve Make Function

It would be better if it didn't render the view ediately, and instead returned a View object with a modified __toString method which could perform the minification when called. This would allow for more complex scenarios where we may wish to run methods on the object before rendering it.

Mess the email views

Unfurtunally, the package mess with the html email when automatic compile is enabled.

There is anyway to disable it on email views?

Minify Whitespace for Blade

It's not stripping whitespaces for blade templates.

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> 

But it's okay for live.

Incompatibility when extending blade ?

Hello,

everything works fine at compilation time but when I register my Service Provider which adds a new blade word, it does not work anymore.

Here is my extend :

Blade::extend(function($view, $compiler)
{
    $pattern = $compiler->createMatcher('alternate');
    return preg_replace($pattern, "$1<?php echo app('blade.alternator')->choose$2 ?>", $view);
});

In your service provider, if I add 2 debug lines :

    protected function enableBladeOptimisations()
    {
        $app = $this->app;
error_log('coucou1');
        // register a new engine
        $app['view']->getEngineResolver()->register('blade', function () use ($app) {
            $compiler = $app['htmlmin.compiler'];
error_log('coucou2');
            return new CompilerEngine($compiler);
        });

        // add the extension
        $app->view->addExtension('blade.php', 'blade');
    }

only coucou1 is displayed and not coucou2. If I remove my extend, coucou2is displayed at compilation time.

Do I extend blade not correctly ? (based on http://laravel.com/docs/4.2/templates#extending-blade)

No effect in lumen?

I have installed this package in lumen.But nothing happened.

Does this package support lumen framework?

HTML Not minified without Middleware

Hey @GrahamCampbell,
maybe I am reading the docs wrong, but it does not do any minification of m html without the middleware.

I did the following:

  • install
  • add service provider
  • publish config and set blade to true (also tried force to true)
  • artisan view:clear

No result. Only when I add the middleware, will the html be minified. However, the way I understood it, the minification would normally be done when the blade templates are cached, correct?

So I should have cached and minified blade templates?

Nesting Level

Package looks great, but when I did a composer require I get this:

`$ php artisan vendor:publish

PHP Fatal error: Maximum function nesting level of '256' reached, aborting! in /var/www/influencer.co/vendor/laravel/framework/src/Illuminate/Container/Container.php on line 647`

I removed the includes from app.php and re-ran which seemed to work fine, but i re-included them and ran '$ php artisan vendor:publish' and got the same error. If I am going to release this package to a live server I am iffy about changing that nesting level as the system has a VERY high potential traffic load.

shouldMinify ignores @shield

hello,

i found a problem with this script.

i use defender for laravel and it uses @shield and @endshield

but the shouldMinify ignores this and prints the @shield as text on the web page.

what do i need to add to shouldMinify to fix this problem?

Testing

We need some unit tests...

Getting Auth not found error

I have just installed the HTMLMin and then added the class and facade to my app.php file.

If I try to run php artisan vendor:publish nothing happens. If I try to load the site, I get a 500 error.

My PHP logs the following error:
[03-Apr-2017 07:40:45 America/Los_Angeles] PHP Fatal error: Uncaught Exception: Class 'Auth' not found

I can't figure out what is causing this. If I comment out the class and facade in the app.php it goes away and everything works as it was before I installed.

Any ideas on what I could be missing?

Disable minification on specific routes

Hello, I would like to know if there is a way to disable htmlmin in specific routes.
I am creating some txt files with blade, and the minification is breaking the markup.

Thank you very much!

Incorrect path to classes

HTMLMin\HTMLMin\HTMLMinServiceProvider ---> GrahamCampbell\HTMLMin\HTMLMinServiceProvider
HTMLMin\HTMLMin\Facades\HTMLMin ---> GrahamCampbell\HTMLMin\Facades\HTMLMin

Filter: undefined method

I would like to minify a group of routes.
As suggested in the readme (there is no more filters in Laravel 5), I added "htmlmin" as a middleware to this group:
'middleware' => ['htmlmin']

But instead of a minification, I get this error:

FatalErrorException in Pipeline.php line 125:
Call to undefined method GrahamCampbell\HTMLMin\HTMLMin::handle()```

Did I done something wrong ?

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.