@@ -5,6 +5,10 @@ return [ | |||
'cache' => [ | |||
'class' => 'yii\caching\FileCache', | |||
], | |||
'image' => [ | |||
'class' => 'yii\image\ImageDriver', | |||
'driver' => 'GD', //GD or Imagick | |||
], | |||
], | |||
'language' => 'fr-FR', | |||
]; |
@@ -9,15 +9,50 @@ | |||
namespace common\helpers; | |||
use yii\web\UploadedFile; | |||
use Yii ; | |||
class Upload { | |||
public static function uploadFile($model, $champs, $filename_old = '') { | |||
$file = UploadedFile::getInstance($model, $champs); | |||
if ($file) { | |||
$file_name = $file->baseName . '-' . uniqid() . '.' . $file->extension; | |||
$file->saveAs('../../frontend/web/uploads/' . $file_name); | |||
$model->$champs = $file_name; | |||
$file_name = $file->baseName . '-' . uniqid() ; | |||
$file_name_extension = $file_name .'.'.$file->extension ; | |||
$dir_file = '../../frontend/web/uploads/' ; | |||
$path_file = $dir_file . $file_name_extension ; | |||
$file->saveAs($path_file); | |||
// resize image | |||
list($width, $height, $type, $attr) = getimagesize($path_file); | |||
if($width > 500) | |||
{ | |||
$image = Yii::$app->image->load($path_file); | |||
// big | |||
if($width > 1600) | |||
{ | |||
$image->resize(1600) | |||
->save($dir_file . $file_name . '-big.'.$file->extension); | |||
} | |||
// medium | |||
if($width > 1024) | |||
{ | |||
$image->resize(1024)->save($dir_file . $file_name_extension) ; | |||
$image->save($dir_file . $file_name . '-medium.'.$file->extension); | |||
} | |||
// small | |||
if($width > 500) | |||
{ | |||
$image->resize(500) | |||
->save($dir_file . $file_name . '-small.'.$file->extension); | |||
} | |||
} | |||
$model->$champs = $file_name_extension ; | |||
} else { | |||
$model->$champs = $filename_old; | |||
} |
@@ -21,7 +21,8 @@ | |||
"2amigos/yii2-chartjs-widget": "~2.0.0", | |||
"2amigos/yii2-leaflet-extension" : "*", | |||
"kartik-v/yii2-mpdf": "dev-master", | |||
"c006/yii2-paypal-ipn": "dev-master" | |||
"c006/yii2-paypal-ipn": "dev-master", | |||
"yurkinx/yii2-image": "dev-master" | |||
}, | |||
"require-dev": { | |||
"yiisoft/yii2-codeception": "*", |
@@ -4,8 +4,8 @@ | |||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", | |||
"This file is @generated automatically" | |||
], | |||
"hash": "f8681a0fe3b2338999c789985d8bc0a0", | |||
"content-hash": "9ea68729b85dcd5dfed9eb8bb575dbde", | |||
"hash": "d41b7108eb456542c97aaf1f4b6a206b", | |||
"content-hash": "1cec9ac50b0fd15427454cbf2d701105", | |||
"packages": [ | |||
{ | |||
"name": "2amigos/yii2-chartjs-widget", | |||
@@ -69,21 +69,21 @@ | |||
}, | |||
{ | |||
"name": "2amigos/yii2-leaflet-extension", | |||
"version": "1.0.2", | |||
"version": "1.0.3", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/2amigos/yii2-leaflet-extension.git", | |||
"reference": "05ac1496b0b7a5c7bdeec110a02f0e36d0a91e88" | |||
"reference": "acaea5a6c33db1e4d9dbed040d7ad87c915928d4" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/2amigos/yii2-leaflet-extension/zipball/05ac1496b0b7a5c7bdeec110a02f0e36d0a91e88", | |||
"reference": "05ac1496b0b7a5c7bdeec110a02f0e36d0a91e88", | |||
"url": "https://api.github.com/repos/2amigos/yii2-leaflet-extension/zipball/acaea5a6c33db1e4d9dbed040d7ad87c915928d4", | |||
"reference": "acaea5a6c33db1e4d9dbed040d7ad87c915928d4", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"bower-asset/leaflet": "0.7.*@stable", | |||
"yiisoft/yii2": "~2.0.0" | |||
"bower-asset/leaflet": "^1.0", | |||
"yiisoft/yii2": "^2.0" | |||
}, | |||
"require-dev": { | |||
"phpunit/phpunit": "4.*" | |||
@@ -125,7 +125,7 @@ | |||
"yii", | |||
"yii2" | |||
], | |||
"time": "2016-02-05 23:47:38" | |||
"time": "2016-12-06 14:54:20" | |||
}, | |||
{ | |||
"name": "bower-asset/bootstrap", | |||
@@ -283,28 +283,23 @@ | |||
}, | |||
{ | |||
"name": "bower-asset/leaflet", | |||
"version": "v0.7.7", | |||
"version": "v1.0.3", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/Leaflet/Leaflet.git", | |||
"reference": "197f9d43b7bbc73c0492bf62cd666a5a98038098" | |||
"reference": "ed36a04aefd12cb92c78074fe63a8e460db1d464" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/Leaflet/Leaflet/zipball/197f9d43b7bbc73c0492bf62cd666a5a98038098", | |||
"reference": "197f9d43b7bbc73c0492bf62cd666a5a98038098", | |||
"url": "https://api.github.com/repos/Leaflet/Leaflet/zipball/ed36a04aefd12cb92c78074fe63a8e460db1d464", | |||
"reference": "ed36a04aefd12cb92c78074fe63a8e460db1d464", | |||
"shasum": "" | |||
}, | |||
"type": "bower-asset-library", | |||
"extra": { | |||
"bower-asset-main": [ | |||
"dist/leaflet.css", | |||
"dist/leaflet-src.js", | |||
"dist/images/layers-2x.png", | |||
"dist/images/layers.png", | |||
"dist/images/marker-icon-2x.png", | |||
"dist/images/marker-icon.png", | |||
"dist/images/marker-shadow.png" | |||
"dist/leaflet-src.js" | |||
], | |||
"bower-asset-ignore": [ | |||
".*", | |||
@@ -316,6 +311,9 @@ | |||
"build" | |||
] | |||
}, | |||
"license": [ | |||
"BSD-2-Clause" | |||
], | |||
"description": "JavaScript library for mobile-friendly interactive maps" | |||
}, | |||
{ | |||
@@ -529,12 +527,12 @@ | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/kartik-v/yii2-mpdf.git", | |||
"reference": "94de4fd901036bb086bf86e10509649345b462a0" | |||
"reference": "17fda1cb084c58fee6014026d35af5faf73316ef" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/kartik-v/yii2-mpdf/zipball/94de4fd901036bb086bf86e10509649345b462a0", | |||
"reference": "94de4fd901036bb086bf86e10509649345b462a0", | |||
"url": "https://api.github.com/repos/kartik-v/yii2-mpdf/zipball/17fda1cb084c58fee6014026d35af5faf73316ef", | |||
"reference": "17fda1cb084c58fee6014026d35af5faf73316ef", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
@@ -573,20 +571,20 @@ | |||
"utf8", | |||
"yii2" | |||
], | |||
"time": "2016-11-03 17:25:48" | |||
"time": "2017-01-14 11:51:12" | |||
}, | |||
{ | |||
"name": "mpdf/mpdf", | |||
"version": "v6.1.2", | |||
"version": "v6.1.3", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/mpdf/mpdf.git", | |||
"reference": "da078bc2669d3f98553ac41f920ead4c17c951ad" | |||
"reference": "7f138bf7508eac895ac2c13d2509b056ac7e7e97" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/mpdf/mpdf/zipball/da078bc2669d3f98553ac41f920ead4c17c951ad", | |||
"reference": "da078bc2669d3f98553ac41f920ead4c17c951ad", | |||
"url": "https://api.github.com/repos/mpdf/mpdf/zipball/7f138bf7508eac895ac2c13d2509b056ac7e7e97", | |||
"reference": "7f138bf7508eac895ac2c13d2509b056ac7e7e97", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
@@ -624,7 +622,7 @@ | |||
"php", | |||
"utf-8" | |||
], | |||
"time": "2016-07-20 12:31:58" | |||
"time": "2016-12-12 10:42:18" | |||
}, | |||
{ | |||
"name": "setasign/fpdi", | |||
@@ -677,23 +675,24 @@ | |||
}, | |||
{ | |||
"name": "swiftmailer/swiftmailer", | |||
"version": "v5.4.3", | |||
"version": "v5.4.5", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/swiftmailer/swiftmailer.git", | |||
"reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153" | |||
"reference": "cd142238a339459b10da3d8234220963f392540c" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/4cc92842069c2bbc1f28daaaf1d2576ec4dfe153", | |||
"reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153", | |||
"url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/cd142238a339459b10da3d8234220963f392540c", | |||
"reference": "cd142238a339459b10da3d8234220963f392540c", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"php": ">=5.3.3" | |||
}, | |||
"require-dev": { | |||
"mockery/mockery": "~0.9.1" | |||
"mockery/mockery": "~0.9.1", | |||
"symfony/phpunit-bridge": "~3.2" | |||
}, | |||
"type": "library", | |||
"extra": { | |||
@@ -726,7 +725,7 @@ | |||
"mail", | |||
"mailer" | |||
], | |||
"time": "2016-07-08 11:51:25" | |||
"time": "2016-12-29 10:02:40" | |||
}, | |||
{ | |||
"name": "yiisoft/yii2", | |||
@@ -874,21 +873,24 @@ | |||
}, | |||
{ | |||
"name": "yiisoft/yii2-composer", | |||
"version": "2.0.4", | |||
"version": "2.0.5", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/yiisoft/yii2-composer.git", | |||
"reference": "7452fd908a5023b8bb5ea1b123a174ca080de464" | |||
"reference": "3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/7452fd908a5023b8bb5ea1b123a174ca080de464", | |||
"reference": "7452fd908a5023b8bb5ea1b123a174ca080de464", | |||
"url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2", | |||
"reference": "3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"composer-plugin-api": "^1.0" | |||
}, | |||
"require-dev": { | |||
"composer/composer": "^1.0" | |||
}, | |||
"type": "composer-plugin", | |||
"extra": { | |||
"class": "yii\\composer\\Plugin", | |||
@@ -917,7 +919,7 @@ | |||
"extension installer", | |||
"yii2" | |||
], | |||
"time": "2016-02-06 00:49:24" | |||
"time": "2016-12-20 13:26:02" | |||
}, | |||
{ | |||
"name": "yiisoft/yii2-swiftmailer", | |||
@@ -968,6 +970,49 @@ | |||
"yii2" | |||
], | |||
"time": "2016-09-09 11:48:11" | |||
}, | |||
{ | |||
"name": "yurkinx/yii2-image", | |||
"version": "dev-master", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/yurkinx/yii2-image.git", | |||
"reference": "2737b1ef4cefbc4c664892c6b9f29847fcf72c56" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/yurkinx/yii2-image/zipball/2737b1ef4cefbc4c664892c6b9f29847fcf72c56", | |||
"reference": "2737b1ef4cefbc4c664892c6b9f29847fcf72c56", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"php": ">=5.4.0", | |||
"yiisoft/yii2": "*" | |||
}, | |||
"type": "yii2-extension", | |||
"autoload": { | |||
"psr-0": { | |||
"yii\\image\\": "" | |||
} | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"BSD-3-Clause" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Yuri Kileev", | |||
"email": "kileev@gmail.com" | |||
} | |||
], | |||
"description": "Yii2 extension for image manipulating using Kohana Image Library.", | |||
"homepage": "https://github.com/yurkinx/yii2-image", | |||
"keywords": [ | |||
"extension", | |||
"image", | |||
"yii2" | |||
], | |||
"time": "2016-12-08 19:34:11" | |||
} | |||
], | |||
"packages-dev": [ | |||
@@ -1132,21 +1177,21 @@ | |||
}, | |||
{ | |||
"name": "yiisoft/yii2-debug", | |||
"version": "2.0.6", | |||
"version": "2.0.7", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/yiisoft/yii2-debug.git", | |||
"reference": "55ed2e853ed8050a34415f63a4da84f88a56f895" | |||
"reference": "a74a2433ad1dfda30a253a92f6db52c131807432" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/55ed2e853ed8050a34415f63a4da84f88a56f895", | |||
"reference": "55ed2e853ed8050a34415f63a4da84f88a56f895", | |||
"url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/a74a2433ad1dfda30a253a92f6db52c131807432", | |||
"reference": "a74a2433ad1dfda30a253a92f6db52c131807432", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"yiisoft/yii2": ">=2.0.4", | |||
"yiisoft/yii2-bootstrap": "*" | |||
"yiisoft/yii2": "~2.0.4", | |||
"yiisoft/yii2-bootstrap": "~2.0.0" | |||
}, | |||
"type": "yii2-extension", | |||
"extra": { | |||
@@ -1175,7 +1220,7 @@ | |||
"debugger", | |||
"yii2" | |||
], | |||
"time": "2016-03-17 03:50:19" | |||
"time": "2016-11-24 09:42:29" | |||
}, | |||
{ | |||
"name": "yiisoft/yii2-faker", | |||
@@ -1282,7 +1327,8 @@ | |||
"minimum-stability": "stable", | |||
"stability-flags": { | |||
"kartik-v/yii2-mpdf": 20, | |||
"c006/yii2-paypal-ipn": 20 | |||
"c006/yii2-paypal-ipn": 20, | |||
"yurkinx/yii2-image": 20 | |||
}, | |||
"prefer-stable": false, | |||
"prefer-lowest": false, |
@@ -1,6 +1,5 @@ | |||
<p>Les présentes Conditions Générales de Service ( ci-après les « <strong>Conditions</strong> ») | |||
font partie intégrante du contrat conclu (le « <strong>Contrat</strong> ») entre <strong>La boîte à pain</strong>, | |||
hébergée par <strong>Cap'Entreprendre</strong> inscrit en tant que <strong>Société coopérative exploitée sous forme de SARL</strong> au Registre du Commerce et des Sociétés | |||
font partie intégrante du contrat conclu (le « <strong>Contrat</strong> ») entre <strong>La boîte à pain - Cap'Entreprendre</strong> inscrit en tant que <strong>SCOP SARL</strong> au Registre du Commerce et des Sociétés | |||
de <strong>Sarreguemines</strong>, sous le numéro <strong>47784404700019</strong>, dont le siège social est situé au | |||
<strong>12 PLACE ROBERT SCHUMAN 57600 FORBACH</strong> (ci-après la « <strong>Société</strong> ») et l’artisan boulanger | |||
souhaitant être référencé sur le site internet de la Société (le « <strong>Boulanger</strong> »).</p> |
@@ -54,8 +54,8 @@ $tileLayer = new \dosamigos\leaflet\layers\TileLayer([ | |||
'attribution' => 'Tiles Courtesy of <a href="http://www.mapquest.com/" target="_blank">MapQuest</a> ' . | |||
'<img src="http://developer.mapquest.com/content/osm/mq_logo.png">, ' . | |||
'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>', | |||
'subdomains' => '1234' | |||
] | |||
'subdomains' => ['1', '2', '3', '4'], | |||
], | |||
]); | |||
// now our component and we are going to configure it |
@@ -26,8 +26,8 @@ | |||
"source": "https://github.com/2amigos/yii2-leaflet-extension" | |||
}, | |||
"require": { | |||
"yiisoft/yii2": "~2.0.0", | |||
"bower-asset/leaflet": "0.7.*@stable" | |||
"yiisoft/yii2": "^2.0", | |||
"bower-asset/leaflet": "^1.0" | |||
}, | |||
"require-dev": { | |||
"phpunit/phpunit": "4.*" |
@@ -39,8 +39,7 @@ class LeafLetAsset extends AssetBundle | |||
'leaflet.css' | |||
]; | |||
public function init() | |||
{ | |||
$this->js = YII_DEBUG ? ['leaflet-src.js'] : ['leaflet.js']; | |||
} | |||
public $js = [ | |||
'leaflet-src.js' | |||
]; | |||
} |
@@ -3,6 +3,550 @@ Leaflet Changelog | |||
(all changes without author notice are by [@mourner](https://github.com/mourner)) | |||
## master | |||
An in-progress version being developed on the `master` branch. | |||
## 1.0.3 (November 21, 2016) | |||
### Bug fixes | |||
* Avoid extra `L.Canvas` redraws on several scenarios (by [@perliedman](https://github.com/perliedman), [#5250](https://github.com/Leaflet/Leaflet/pull/5034), also thanks to [@manubb](https://github.com/manubb) for investigation and PR). | |||
* Fix behaviour of `dblclick` events in [Chrome 55 due to `PointerEvent`s](https://developers.google.com/web/updates/2016/11/nic55#pointer-events) (by [@IvanSanchez](https://github.com/IvanSanchez), [#5185](https://github.com/Leaflet/Leaflet/pull/5185), [#5248](https://github.com/Leaflet/Leaflet/pull/5248), [#5268](https://github.com/Leaflet/Leaflet/pull/5268)). | |||
* Fix a dangling comma making IE8 fail to parse the code (by [@batje](https://github.com/batje), [#5270](https://github.com/Leaflet/Leaflet/pull/5270)). | |||
* Backport event handling fixes from [#5054](https://github.com/Leaflet/Leaflet/pull/5054) into `L.SVG.VML` for IE8 (by [@IvanSanchez](https://github.com/IvanSanchez), [#5215](https://github.com/Leaflet/Leaflet/pull/5215)). | |||
* Fix a race condition when closing popups during their `popupopen` event (by [@hagai26](https://github.com/hagai26), [#5202](https://github.com/Leaflet/Leaflet/pull/5202)). | |||
* Fix `getBoundsZoom` return value on CRSs with a flipped axis (by [@computerlove](https://github.com/computerlove), [#5204](https://github.com/Leaflet/Leaflet/pull/5204)). | |||
* Avoid infinite loops when the `errorTileUrl` of a `L.TileLayer` returns 404 (by [@IvanSanchez](https://github.com/IvanSanchez), [#5177](https://github.com/Leaflet/Leaflet/pull/5177)). | |||
* Remove erroneous initialization of unused event listeners (by [@Brikky](https://github.com/Brikky), [#5160](https://github.com/Leaflet/Leaflet/pull/5160)). | |||
* Fix rounding of `L.Canvas` redraw areas to avoid artifacts during partial updates (by [@Ernie23](https://github.com/Ernie23), [#5148](https://github.com/Leaflet/Leaflet/pull/5148)). | |||
* Fix `isPopupOpen()` behaviour of `L.Layer` when no popup is bound to a layer (by [@gvangool](https://github.com/gvangool), [#5106](https://github.com/Leaflet/Leaflet/pull/5106)). | |||
* Add a sanity check in `LatLngBounds.contains()` to allow for non-instantiated `LatLng` objects (by [@IvanSanchez](https://github.com/IvanSanchez), [#5135](https://github.com/Leaflet/Leaflet/pull/5135)). | |||
* Fix collapsing of `L.Control.Layers` when the `collapse` option is `false` (by [@perliedman](https://github.com/perliedman), [#5131](https://github.com/Leaflet/Leaflet/pull/5131)). | |||
### API changes | |||
* Added a new `WrapLatLngBounds` method to `L.CRS`, to fix an issue with `maxBounds` of `GridLayer`s (by [@IvanSanchez](https://github.com/IvanSanchez), [#5185](https://github.com/Leaflet/Leaflet/pull/5185), also thanks to [@DiogoMCampos](https://github.com/DiogoMCampos) for investigation). | |||
* `L.Map.getSize()` will now return `0` instead of `NaN` in non-graphical environments (by [@ughitsaaron](https://github.com/ughitsaaron), [#5209](https://github.com/Leaflet/Leaflet/pull/5209)). | |||
### Improvements | |||
* Several minor documentation improvements by [@IvanSanchez](https://github.com/IvanSanchez), [@jieter](https://github.com/jieter), [@alonsogarciapablo](https://github.com/alonsogarciapablo), [@jasonoverland](https://github.com/jasonoverland), [@danzel](https://github.com/danzel), [@ghybs](https://github.com/ghybs), [@Ralf8686](https://github.com/Ralf8686), [@geoloep](https://github.com/geoloep) | |||
* Add an `alt` attribute to the `<img>`s of marker shadows (by [@topicus](https://github.com/topicus), [#5259](https://github.com/Leaflet/Leaflet/pull/5259)). | |||
## 1.0.2 (November 21, 2016) | |||
### Bug fixes | |||
* Fix CSS for marker shadows when `max-width` is already set (by [@brunob](https://github.com/brunob), [#5046](https://github.com/Leaflet/Leaflet/pull/5046)). | |||
* Fix canvas redraw when style updates fill and/or weight (by [@perliedman](https://github.com/perliedman), [#5034](https://github.com/Leaflet/Leaflet/pull/5034)). | |||
* Prevent canvas from firing multiple `mouseover` events for same layer (by [@perliedman](https://github.com/perliedman), [#5033](https://github.com/Leaflet/Leaflet/pull/5033)). | |||
* Fixed a race condition when removing and adding `L.Canvas` vectors during a zoom animation (by [@ghybs](https://github.com/ghybs)) [#5011](https://github.com/Leaflet/Leaflet/pull/5011). | |||
* Fix zoom animation of ImageOverlay when CRS's Y axis is flipped (by [@perliedman](https://github.com/perliedman)), [#4993](https://github.com/Leaflet/Leaflet/pull/4993). | |||
* Fix encoding/decoding of GeoJSON `FeatureCollection`s (by [@IvanSanchez](https://github.com/IvanSanchez)), [#5045](https://github.com/Leaflet/Leaflet/issues/5045). | |||
* Fix `minZoom`/`maxZoom` late inizialization (by [@IvanSanchez](https://github.com/IvanSanchez)), [#4916](https://github.com/Leaflet/Leaflet/pull/4916). | |||
* Fix styling of custom SVG markers by making stricter CSS selectors (by [@jwoyame](https://github.com/jwoyame)) [#4597](https://github.com/Leaflet/Leaflet/pull/4597). | |||
* Fix order of `mouseover`/`mouseout` events on overlapping `L.Canvas` layers (by [@perliedman](https://github.com/perliedman)), [#5090](https://github.com/Leaflet/Leaflet/pull/5090). | |||
* Fix drag behaviour when a draggable marker is removed in mid-drag (by [@IvanSanchez](https://github.com/IvanSanchez), [#5063](https://github.com/Leaflet/Leaflet/pull/5063). | |||
* Fix `L.Control.Layers.collapse()` on initially uncollapsed layer controls (by [@perliedman](https://github.com/perliedman)), [#5131](https://github.com/Leaflet/Leaflet/pull/5131). | |||
* Fix blurriness of `L.Tooltip` by rounding up pixel coordinates (by [@ashmigelski](https://github.com/ashmigelski)), [#5089](https://github.com/Leaflet/Leaflet/pull/5089). | |||
* Fix click events on overlapping geometries when using `L.Canvas` (by [@perliedman](https://github.com/perliedman)), [#5100](https://github.com/Leaflet/Leaflet/pull/5100). | |||
### API changes | |||
* Add a `sortLayers` option to `L.Control.Layers` (by [@IvanSanchez](https://github.com/IvanSanchez), [#4711](https://github.com/Leaflet/Leaflet/pull/4711). | |||
* Implement `bringToFront` and `bringToBack` when using `L.Canvas`, plus preventing other canvas glitches (by [@perliedman](https://github.com/perliedman)), [#5115](https://github.com/Leaflet/Leaflet/pull/5115). | |||
* Add `minNativeZoom` option to `L.TileLayer`s. (by [@bb-juliogarcia](https://github.com/bb-juliogarcia)), [#5088](https://github.com/Leaflet/Leaflet/pull/5088). | |||
### Improvements | |||
* Improve performance when adding lots of `L.Path`s by refactoring away event logic (by [@IvanSanchez](https://github.com/IvanSanchez)) [#5054](https://github.com/Leaflet/Leaflet/pull/5054))]. | |||
* Several minor documentation improvements by [@Jmuccigr](https://github.com/Jmuccigr), [@serdarkacka](https://github.com/serdarkacka), [@erickzhao](https://github.com/erickzhao), [@IvanSanchez](https://github.com/IvanSanchez), [@perliedman](https://github.com/perliedman), [@joukewitteveen](https://github.com/joukewitteveen). | |||
* Code reorganization: Extensions for `L.Marker` and `L.Map` no longer have a separate file (by [@mourner](https://github.com/mourner)). | |||
* Removed a duplicated unit test ([@yohanboniface](https://github.com/yohanboniface)). | |||
* Accesibility improvements (ARIA/screenreader related) on map tiles (by [@patrickarlt](https://github.com/patrickarlt)) [#5092](https://github.com/Leaflet/Leaflet/pull/5092). | |||
## 1.0.1 (September 30, 2016) | |||
### Bug fixes | |||
* Fixed vector rendering regression in IE8 (by [@perliedman](https://github.com/perliedman)) [#4656](https://github.com/Leaflet/Leaflet/pull/4956). | |||
* Fixed Webpack error when bundling Leaflet's CSS (by [@jefbarn](https://github.com/jefbarn)) [#4679](https://github.com/Leaflet/Leaflet/pull/4979). | |||
## 1.0.0 (September 26, 2016) | |||
### API changes | |||
* Remove deprecated `zoomanimated` option for `L.Popup`s (by [@fnicollet](https://github.com/fnicollet)) [#4699](https://github.com/Leaflet/Leaflet/pull/4699) | |||
### Improvements | |||
* Several minor fixes to the documentation (by [@IvanSanchez](https://github.com/IvanSanchez), [@alejo90](https://github.com/alejo90), [@ghybs](https://github.com/ghybs), [@JonasDralle](https://github.com/JonasDralle)) | |||
* Add license to `bower.json` (by [@anotherredward](https://github.com/anotherredward)) [#4865](https://github.com/Leaflet/Leaflet/pull/4865) | |||
* Allow creating tooltips without a source layer (by [@yohanboniface](https://github.com/yohanboniface)) [#4836](https://github.com/Leaflet/Leaflet/pull/4836) | |||
* Detect `L.Icon` default path using CSS (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4605](https://github.com/Leaflet/Leaflet/pull/4605) | |||
### Bug fixes | |||
* Fix handling of `getScaleZoom` in some custom CRSs (by [@theashyster](https://github.com/theashyster)) [#4919](https://github.com/Leaflet/Leaflet/pull/4919) | |||
* Guard `L.Path` event handlers against race conditions (by [@perliedman](https://github.com/perliedman) and [@IvanSanchez](https://github.com/IvanSanchez)) [#4855](https://github.com/Leaflet/Leaflet/pull/4855) [#4929](https://github.com/Leaflet/Leaflet/pull/4929) [#4838](https://github.com/Leaflet/Leaflet/pull/4838) | |||
* In `L.GridLayer`s, wrap `tileBounds` when `noWrap` is false (by [@fyeah](https://github.com/fyeah)) [#4908](https://github.com/Leaflet/Leaflet/pull/4908) | |||
* Fix `L.Path`'s `bringToFront()` behaviour in the Edge browser (by [@nikolai-b](https://github.com/nikolai-b)) [#4848](https://github.com/Leaflet/Leaflet/pull/4848) | |||
* Remove spurious counting of event handlers (by [@perliedman](https://github.com/perliedman)) [#4842](https://github.com/Leaflet/Leaflet/pull/4842) | |||
* Throw error on `getCenter()` when a `L.Polygon` has no map and thus no CRS (by [@snkashis](https://github.com/snkashis)) [#4820](https://github.com/Leaflet/Leaflet/pull/4820) | |||
* Add a `_leaflet_id` to map containers to prevent error when removing a map twice (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4810](https://github.com/Leaflet/Leaflet/pull/4810) | |||
* Do not fail when closing a tooltip which is not in a map (by [@yohanboniface](https://github.com/yohanboniface)) [#4937](https://github.com/Leaflet/Leaflet/pull/4937) | |||
## 1.0-rc3 (August 5, 2016) | |||
### API changes | |||
- `L.Tooltip` `offset` option now defaults to `[0, 0]` (by [@yohanboniface](https://github.com/yohanboniface)) [#4773](https://github.com/Leaflet/Leaflet/pull/4773) | |||
- Event listeners are now always called in the order they have been registered, while until rc2 listeners with a context were all called before listeners without context (even if registered later), and the listeners with context were called in an unpredictable order (by [@yohanboniface](https://github.com/yohanboniface)) [#4769](https://github.com/Leaflet/Leaflet/pull/4769) | |||
### Improvements | |||
- Added `oldLatLng` in `L.Marker` `drag` event (by [@snkashis](https://github.com/snkashis)) [#4752](https://github.com/Leaflet/Leaflet/pull/4752) | |||
### Bug fixes | |||
- Fixed regression where event listeners where not always fired in the order of registration (by [@yohanboniface](https://github.com/yohanboniface)) [#4769](https://github.com/Leaflet/Leaflet/pull/4769) | |||
- Fixed `L.Tooltip` zoom animation (by [@yohanboniface](https://github.com/yohanboniface)) [#4744](https://github.com/Leaflet/Leaflet/pull/4744) | |||
- Fixed `layer.bindTooltip` crashing when called before adding the layer to the map (by [@yohanboniface](https://github.com/yohanboniface)) [#4779](https://github.com/Leaflet/Leaflet/pull/4779) | |||
- Fixed regression in `L.Popup` autopaning (by [@yohanboniface](https://github.com/yohanboniface)) [#4768](https://github.com/Leaflet/Leaflet/pull/4768) | |||
- Fixed non permanent `L.Tooltip` not being closed on touch when touching the map (by [@yohanboniface](https://github.com/yohanboniface)) [#4767](https://github.com/Leaflet/Leaflet/pull/4767) | |||
- Fixed `popupopen` and `popupclose` not being fired when clicking on path with an open popup (by [@yohanboniface](https://github.com/yohanboniface)) [#4788](https://github.com/Leaflet/Leaflet/pull/4788) | |||
## 1.0-rc2 (July 18, 2016) | |||
### API changes | |||
* Make `L.Handler.enable`/`disable` return `this` (by [@yohanboniface](https://github.com/yohanboniface)) [#4708](https://github.com/Leaflet/Leaflet/pull/4708) | |||
* Icon `size` option can now be initialised with a number (by [@rheh](https://github.com/rheh)) [#4608](https://github.com/Leaflet/Leaflet/pull/4608) | |||
* Add `classname` option to `L.GridLayer` (by [@jayvarner](https://github.com/jayvarner)) [#4553](https://github.com/Leaflet/Leaflet/pull/4553) | |||
* Consistent returns for `Map.addLayer` (by [@nathancahill](https://github.com/nathancahill)) [#4504](https://github.com/Leaflet/Leaflet/pull/4504) | |||
* Create points from objects with `x` and `y` properties (by [@nathancahill](https://github.com/nathancahill)) [#4465](https://github.com/Leaflet/Leaflet/pull/4465) | |||
* Add `updateWhenZooming` option to `L.GridLayer` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4462](https://github.com/Leaflet/Leaflet/pull/4462) | |||
### Improvements | |||
* Refactoring of events (by [@fab1an](https://github.com/fab1an) and [@perliedman](https://github.com/perliedman)) [#4697](https://github.com/Leaflet/Leaflet/pull/4697) | |||
* Do not alter `popup.options.offset` when computing popup offset (fix #4645) (by [@yohanboniface](https://github.com/yohanboniface)) [#4662](https://github.com/Leaflet/Leaflet/pull/4662) | |||
* Use different `L.Bounds` for "marking as prunable" and loading tiles (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4650](https://github.com/Leaflet/Leaflet/pull/4650) | |||
* Added `L.Tooltip` class to display small tooltips on the map (by [@yohanboniface](https://github.com/yohanboniface)) [#3952](https://github.com/Leaflet/Leaflet/pull/3952) | |||
### Bug fixes | |||
* Fixed `GridLayer`'s outer edge snapping to vertical center of map (fix #4702) (by [@yohanboniface](https://github.com/yohanboniface)) [#4704](https://github.com/Leaflet/Leaflet/pull/4704) | |||
* Fixed scrollwheel zoom too fast in MS Edge (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4694](https://github.com/Leaflet/Leaflet/pull/4694) | |||
* Use `pointer-events: visiblePainted` as fallback for IE <11 (by [@perliedman](https://github.com/perliedman)) [#4690](https://github.com/Leaflet/Leaflet/pull/4690) | |||
* Avoid double borders on `abbr` in website (by [@brunob](https://github.com/brunob)) [#4663](https://github.com/Leaflet/Leaflet/pull/4663) | |||
* Prevent firing map click when layer has popup (by [@jwoyame](https://github.com/jwoyame)) [#4603](https://github.com/Leaflet/Leaflet/pull/4603) | |||
* Disable pointer events on popup tip (by [@jwoyame](https://github.com/jwoyame)) [#4599](https://github.com/Leaflet/Leaflet/pull/4599) | |||
* Prevent `L.DomUtil.create()` from automatically setting a CSS class name (by [@MuellerMatthew](https://github.com/MuellerMatthew)) [#4563](https://github.com/Leaflet/Leaflet/pull/4563) | |||
* Fix off-by-one bug in `Control.Layers._getLayer` (by [@ValentinH](https://github.com/ValentinH)) [#4561](https://github.com/Leaflet/Leaflet/pull/4561) | |||
* Fix scrollwheel events zomming two levelz in Chrome by scaling down `getWheelDelta()` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4538](https://github.com/Leaflet/Leaflet/pull/4538) | |||
* Prevent event listeners from being called when all listeners are removed (by [@perliedman](https://github.com/perliedman)) [#4555](https://github.com/Leaflet/Leaflet/pull/4555) | |||
* Don't prevent browser's touch scroll and/or zoom unless handlers are enabled (by [@perliedman](https://github.com/perliedman)) [#4552](https://github.com/Leaflet/Leaflet/pull/4552) | |||
* Fixed `getBoundsZoom` with small size and padding (by [@dianjin](https://github.com/dianjin)) [#4532](https://github.com/Leaflet/Leaflet/pull/4532) | |||
* Fixed `L.Control.Layers` in IE8 (by [@jieter](https://github.com/jieter)) [#4509](https://github.com/Leaflet/Leaflet/pull/4509) | |||
* Fixed `TileLayer`'s retina logic when `zoomReverse` is enabled. (by [@perliedman](https://github.com/perliedman)) [#4503](https://github.com/Leaflet/Leaflet/pull/4503) | |||
* Fixed `setMaxBounds` not resetting `maxBounds` when passing `null` argument (by [@yohanboniface](https://github.com/yohanboniface)) [#4494](https://github.com/Leaflet/Leaflet/pull/4494) | |||
* Fixed canvas not filtering click event after drag (by [@yohanboniface](https://github.com/yohanboniface)) [#4493](https://github.com/Leaflet/Leaflet/pull/4493) | |||
* Fixed `L.Control.removeLayer()` raising an error when trying to remove a layer not yet added (by [@jieter](https://github.com/jieter)) [#4487](https://github.com/Leaflet/Leaflet/pull/4487) | |||
* Fixed disabling drag on click in IE11 (by [@perliedman](https://github.com/perliedman)) [#4479](https://github.com/Leaflet/Leaflet/pull/4479) | |||
* Fixed `L.Evented.listens()` on removed event handlers, #4474 (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4476](https://github.com/Leaflet/Leaflet/pull/4476) | |||
* Better handling of `markerZoomAnimation` event hooks (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4460](https://github.com/Leaflet/Leaflet/pull/4460) | |||
## 1.0-rc1 (April 18, 2016) | |||
### API changes | |||
* Make `L.Control.Layers.collapse`/`expand` public methods (by [@yohanboniface](https://github.com/yohanboniface)) [#4370](https://github.com/Leaflet/Leaflet/pull/4370) | |||
* Make `L.latLngBounds` factory return an empty bounds with no argument (by [@yohanboniface](https://github.com/yohanboniface)) [#4368](https://github.com/Leaflet/Leaflet/pull/4368) | |||
* `Map.fitBounds` now raises an error if bounds are not valid (by [@theotow](https://github.com/theotow)) [#4353](https://github.com/Leaflet/Leaflet/pull/4353) | |||
* Temporarily support legacy options on `L.Circle` (by [@JrFolk](https://github.com/JrFolk)) [#4290](https://github.com/Leaflet/Leaflet/pull/4290) | |||
* Throw error on `NaN` circle radius (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4237](https://github.com/Leaflet/Leaflet/pull/4237) | |||
* `L.Class.include()` & `mergeOptions()` now return `this` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4246](https://github.com/Leaflet/Leaflet/pull/4246) | |||
* Consistent GeoJSON casing (by [@yohanboniface](https://github.com/yohanboniface)) [#4108](https://github.com/Leaflet/Leaflet/pull/4108) | |||
* Move `L.LatLng.equals` to `L.CRS.equals`. (by [@perliedman](https://github.com/perliedman)) [#4074](https://github.com/Leaflet/Leaflet/pull/4074) | |||
* Make non-interactive markers not firing pointer events (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3937](https://github.com/Leaflet/Leaflet/pull/3937) | |||
### Improvements | |||
* Give popups an id (by [@tylercubell](https://github.com/tylercubell)) [#4355](https://github.com/Leaflet/Leaflet/pull/4355) | |||
* Support `{-y}` in tile layer urls (by [@jieter](https://github.com/jieter)) [#4337](https://github.com/Leaflet/Leaflet/pull/4337) | |||
* Support `dashArray` path option in canvas (by [@gommo](https://github.com/gommo)) [#4173](https://github.com/Leaflet/Leaflet/pull/4173) | |||
* Clean up `navigator.pointerEnabled` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4287](https://github.com/Leaflet/Leaflet/pull/4287) | |||
* Use array in `L.Control.Layers` internally (by [@jieter](https://github.com/jieter)) [#4227](https://github.com/Leaflet/Leaflet/pull/4227) | |||
* Implement `L.Browser.edge` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4143](https://github.com/Leaflet/Leaflet/pull/4143) | |||
* Optimized icons (by [@vtduncan](https://github.com/vtduncan)) [#4124](https://github.com/Leaflet/Leaflet/pull/4124) | |||
* Cast `L.DivIcon.bgPos` option to `L.Point` (by [@perliedman](https://github.com/perliedman)) [#4090](https://github.com/Leaflet/Leaflet/pull/4090) | |||
* Switch to wheel event where available (by [@mourner](https://github.com/mourner)) [#3653](https://github.com/Leaflet/Leaflet/pull/3653) | |||
* Fractional zoom controls (by [@IvanSanchez](https://github.com/IvanSanchez) and [@hyperknot](https://github.com/hyperknot)) [#3523](https://github.com/Leaflet/Leaflet/pull/3523) | |||
* Added click tolerance also for non-touch devices (by [DavidUv](https://github.com/DavidUv)) [#4396](https://github.com/Leaflet/Leaflet/pull/4396) | |||
### Bug fixes | |||
* Fixed an edge case on `Map.fitBounds` (by [@perliedman](https://github.com/perliedman)) [#4377](https://github.com/Leaflet/Leaflet/pull/4377) | |||
* Fixed an edge case bug in `flyTo` (by [@hyperknot](https://github.com/hyperknot)) [#4376](https://github.com/Leaflet/Leaflet/pull/4376) | |||
* Use mean earth radius for distance calculation in `L.CRS.Earth`. (by [@perliedman](https://github.com/perliedman)) [#4369](https://github.com/Leaflet/Leaflet/pull/4369) | |||
* Fixed zoom event fired twice (by [@perliedman](https://github.com/perliedman)) [#4367](https://github.com/Leaflet/Leaflet/pull/4367) | |||
* Initialize canvas dash on init. Check that canvas supports `setLineDash`. (by [@perliedman](https://github.com/perliedman)) [#4364](https://github.com/Leaflet/Leaflet/pull/4364) | |||
* Do not calculate inverted y coords for CRSes with infinite: true (by [@jieter](https://github.com/jieter)) [#4344](https://github.com/Leaflet/Leaflet/pull/4344) | |||
* Fixed zoom handling on `Map.TouchZoom` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4340](https://github.com/Leaflet/Leaflet/pull/4340) | |||
* Fixed `this._times.length` undefined in `Map.Drag.js` (by [@LucasMouraDeOliveira](https://github.com/LucasMouraDeOliveira)) [#4324](https://github.com/Leaflet/Leaflet/pull/4324) | |||
* Fixed simulated click handling in `L.Path` (by [@elkami12](https://github.com/elkami12)) [#4314](https://github.com/Leaflet/Leaflet/pull/4314) | |||
* Fixed attribution text not removed when Layer is removed from map (by [@dr-itz](https://github.com/dr-itz)) [#4293](https://github.com/Leaflet/Leaflet/pull/4293) | |||
* Fixed bug when adding/removing a layer from `L.Control.Layer` that is not on the map (by [@errebenito](https://github.com/errebenito)) [#4280](https://github.com/Leaflet/Leaflet/pull/4280) | |||
* Fixed `Map.attributionControl` only set on `addInitHook` (by [@snkashis](https://github.com/snkashis)) [#4263](https://github.com/Leaflet/Leaflet/pull/4263) | |||
* Check for `e.originalEvent` in `DomUtil._filterclick` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4256](https://github.com/Leaflet/Leaflet/pull/4256) | |||
* Stop drag propagation on `L.Draggable` (by [@turban](https://github.com/turban)) [#4250](https://github.com/Leaflet/Leaflet/pull/4250) | |||
* Fixed error when quickly removing a layer just added (by [@hyperknot](https://github.com/hyperknot)) [#4244](https://github.com/Leaflet/Leaflet/pull/4244) | |||
* Fixed not resetting properly on `Map.stop` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4229](https://github.com/Leaflet/Leaflet/pull/4229) | |||
* Fixed conflict between `Map.fadeAnimation` and `GridLayer.opacity` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4228](https://github.com/Leaflet/Leaflet/pull/4228) | |||
* Fix fractional zoom calculation (by [@hyperknot](https://github.com/hyperknot)) [#4224](https://github.com/Leaflet/Leaflet/pull/4224) | |||
* Better cleanup of L.Control.Layers, fixes [#4213](https://github.com/Leaflet/Leaflet/pull/4213) (plus unit tests) (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4214](https://github.com/Leaflet/Leaflet/pull/4214) | |||
* Fixed transform issue when not `L.Browser.any3d` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4212](https://github.com/Leaflet/Leaflet/pull/4212) | |||
* Fixed fractional zoom controls broken when initial zoom isn't specified (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4209](https://github.com/Leaflet/Leaflet/pull/4209) | |||
* Fix extra tiles usage (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4193](https://github.com/Leaflet/Leaflet/pull/4193) | |||
* Sanity check: test `pxBounds` validity before using it (by [@yohanboniface](https://github.com/yohanboniface)) [#4191](https://github.com/Leaflet/Leaflet/pull/4191) | |||
* Disable event defaults when disabling scroll propagation (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4160](https://github.com/Leaflet/Leaflet/pull/4160) | |||
* Fixed precision issues in `L.Circle` radius (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4133](https://github.com/Leaflet/Leaflet/pull/4133) | |||
* Workarounded some touch-capable browsers firing `dblclick` instead of touch events (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4131](https://github.com/Leaflet/Leaflet/pull/4131) | |||
* Use all projected coords when calculating `L.Polyline`'s pixel bounds. (by [@perliedman](https://github.com/perliedman)) [#4114](https://github.com/Leaflet/Leaflet/pull/4114) | |||
* Fixed removing all events when passing an `undefined` property (by [@robertleeplummerjr](https://github.com/robertleeplummerjr)) [#4113](https://github.com/Leaflet/Leaflet/pull/4113) | |||
* Fixed retina URL computation (by [@hyperknot](https://github.com/hyperknot)) [#4110](https://github.com/Leaflet/Leaflet/pull/4110) | |||
* Fire `tileunload` for all unloading of tiles (by [@tcoats](https://github.com/tcoats)) [#4099](https://github.com/Leaflet/Leaflet/pull/4099) | |||
* Fixed duplicated code in `L.GridLayer.retainParent()` (by [@jblarsen](https://github.com/jblarsen)) [#4094](https://github.com/Leaflet/Leaflet/pull/4094) | |||
* Make sure to always reset `_enforcingBounds`. (by [@perliedman](https://github.com/perliedman)) [#4089](https://github.com/Leaflet/Leaflet/pull/4089) | |||
* Fix bug with max bounds and custom projections (by [@OleLaursen](https://github.com/OleLaursen)) [#4078](https://github.com/Leaflet/Leaflet/pull/4078) | |||
* When limiting center to bounds, ignore offsets less than a pixel. (by [@perliedman](https://github.com/perliedman)) [#4077](https://github.com/Leaflet/Leaflet/pull/4077) | |||
* Fixed bug for hover event between circle overlapping polygon on canvas (by [@fimietta](https://github.com/fimietta)) [#4072](https://github.com/Leaflet/Leaflet/pull/4072) | |||
* Fixed but where `L.Control.Layers` where calling `map._size` instead of `getSize()` (by [@Brobin](https://github.com/Brobin)) [#4063](https://github.com/Leaflet/Leaflet/pull/4063) | |||
* Round new map position before animating pan (by [@RLRR](https://github.com/RLRR)) [#4046](https://github.com/Leaflet/Leaflet/pull/4046) | |||
* Fixed overlayed circles not responding to mouse events in canvas (by [@Deftwun](https://github.com/Deftwun)) [#4033](https://github.com/Leaflet/Leaflet/pull/4033) | |||
* Fixed GeoJSON `resetStyle` (by [@yohanboniface](https://github.com/yohanboniface)) [#4028](https://github.com/Leaflet/Leaflet/pull/4028) | |||
* Fixed popup toggle on marker click (by [@yohanboniface](https://github.com/yohanboniface)) [#4016](https://github.com/Leaflet/Leaflet/pull/4016) | |||
* Fixed event target fallbacking to map after marker drag (fix [#3971](https://github.com/Leaflet/Leaflet/pull/3971)) (by [@yohanboniface](https://github.com/yohanboniface)) [#4010](https://github.com/Leaflet/Leaflet/pull/4010) | |||
* Fixed `maxZoom` not honoring 0 (by [@simsibimsiwimsi](https://github.com/simsibimsiwimsi)) [#4000](https://github.com/Leaflet/Leaflet/pull/4000) | |||
* Skip `L.GridLayer._updateLevels()` when out of min/max zoom (prevents IE8 exceptions) (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3999](https://github.com/Leaflet/Leaflet/pull/3999) | |||
* `L.DomUtil.getPosition()` should return a fallback value (for VML in IE8) (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3998](https://github.com/Leaflet/Leaflet/pull/3998) | |||
* `L.Marker`: init interaction regardless of new icon or not (by [@celadevra](https://github.com/celadevra)) [#3978](https://github.com/Leaflet/Leaflet/pull/3978) | |||
* Fix `interactive=false` not taken into account for canvas (by [@yohanboniface](https://github.com/yohanboniface)) [#3956](https://github.com/Leaflet/Leaflet/pull/3956) | |||
* Fix canvas path disappearing on animation (by [@klaftertief](https://github.com/klaftertief)) [#3950](https://github.com/Leaflet/Leaflet/pull/3950) | |||
* Only check for moving draggable in canvas renderer when map is draggable (by [@klaftertief](https://github.com/klaftertief)) [#3942](https://github.com/Leaflet/Leaflet/pull/3942) | |||
* Fix SVG Dragging issues in IE and Edge (by [@perliedman](https://github.com/perliedman)) [#4382](https://github.com/Leaflet/Leaflet/pull/4382) | |||
* Fix click not working on inputs in controls in IE 11 (by [@perliedman](https://github.com/perliedman)) [#4371](https://github.com/Leaflet/Leaflet/pull/4371) | |||
* Make drag and touch zoom handlers insensitive to order of event handlers (by [@perliedman](https://github.com/perliedman)) [#4387](https://github.com/Leaflet/Leaflet/pull/4387) | |||
### Other | |||
* Added a Code of Conduct (by [@mourner](https://github.com/mourner)) [#4142](https://github.com/Leaflet/Leaflet/pull/4142) | |||
* Dual 1.0 & 0.7 docs to gh-pages (by [@IvanSanchez](https://github.com/IvanSanchez)) [#4085](https://github.com/Leaflet/Leaflet/pull/4085) | |||
* 🍂doc (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3916](https://github.com/Leaflet/Leaflet/pull/3916) | |||
* A lot of documentation improvements (by [@nathancahill](https://github.com/nathancahill)) [#4418](https://github.com/Leaflet/Leaflet/pull/4418), [#4419](https://github.com/Leaflet/Leaflet/pull/4419), [#4423](https://github.com/Leaflet/Leaflet/pull/4423), [#4425](https://github.com/Leaflet/Leaflet/pull/4425) and [a lot more](https://github.com/Leaflet/Leaflet/pulls?q=is%3Apr+author%3Anathancahill+is%3Aclosed) | |||
* Replace links to google groups with ones to GIS StackExchange (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3886](https://github.com/Leaflet/Leaflet/pull/3886) | |||
## 1.0-beta2 (October 14, 2015) | |||
Beta 2 fixes over 50 bugs that were reported by users trying out beta 1. The vast majority of changes are small fixes to problems that are triggered in very specific situations or conditions, a few API consolidation changes, and a few browser workarounds. | |||
### API changes | |||
* `L.circle` now accepts `radius` as an option (like `L.circleMarker`) rather than a second argument (by [@IvanSanchez](https://github.com/IvanSanchez)) | |||
### Improvements | |||
* Implemented canvas optimizations on mousehover interactions (by [@philippelatulippe](https://github.com/philippelatulippe)) [#3076](https://github.com/Leaflet/Leaflet/issues/3076) | |||
* Improved drag behaviour by preventing a `preclick` event during drag (by [@yohanboniface](https://github.com/yohanboniface)) [#3632](https://github.com/Leaflet/Leaflet/issues/3632) | |||
* Implemented `L.ImageOverlay.setBounds()` and fixed image overlay initialization (by [@fminuti](https://github.com/fminuti)) [#3680](https://github.com/Leaflet/Leaflet/pull/3680) | |||
* Implemented draggable items to fire `mousedown` events (by [@yohanboniface](https://github.com/yohanboniface)) [#3682](https://github.com/Leaflet/Leaflet/pull/3682) | |||
* Changed detection of browsers capable of `msPointer` events (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3684](https://github.com/Leaflet/Leaflet/pull/3684) | |||
* Implemented latitude truncation for spherical mercator projection (by [@perliedman](https://github.com/perliedman)) [#3700](https://github.com/Leaflet/Leaflet/issues/3700) | |||
* Armored against browsers not implementing `Geolocation.clearWatch()` [#3707](https://github.com/Leaflet/Leaflet/issues/3707) | |||
* Implemented generation of sourcemaps when building and minifying source files (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3723](https://github.com/Leaflet/Leaflet/pull/3723) | |||
* Added `bringToFront` and `bringToBack` to popups (by [@danzel](https://github.com/danzel)). [#3908](https://github.com/Leaflet/Leaflet/pull/3908) [#3307](https://github.com/Leaflet/Leaflet/issues/3813) | |||
* Multiply offset by 3 on keyboard pan when shift key is pressed (by [@yohanboniface](https://github.com/yohanboniface)) [#3921](https://github.com/Leaflet/Leaflet/pull/3921) | |||
### Bug fixes | |||
* Fixed event propagation on double finger tap (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3532](https://github.com/Leaflet/Leaflet/issues/3532) | |||
* Fixed style changes on re-added layers (by [@wpf500](https://github.com/wpf500)) [#3547](https://github.com/Leaflet/Leaflet/pull/3547) | |||
* Fixed `preventOutline` exceptions [#3625](https://github.com/Leaflet/Leaflet/issues/3625) | |||
* Fixed a box zoom regression bug [#3633](https://github.com/Leaflet/Leaflet/issues/3633) | |||
* Fixed `contextmenu` behaviour when there are no event listeners (by [@yohanboniface](https://github.com/yohanboniface)) [#3638](https://github.com/Leaflet/Leaflet/issues/3638) | |||
* Fixed map controls not showing on top of map layers (by [@patrickarlt](https://github.com/patrickarlt)) [#3644](https://github.com/Leaflet/Leaflet/pull/3644) | |||
* Fixed display of marker images with `max-width` (by [@davidjb](https://github.com/davidjb)) [#3647](https://github.com/Leaflet/Leaflet/pull/3647) | |||
* Fixed `mouseout` and `mouseover` event bubbling (by [@yohanboniface](https://github.com/yohanboniface)) [#3648](https://github.com/Leaflet/Leaflet/issues/3648) [#3797](https://github.com/Leaflet/Leaflet/issues/3797) [#3708](https://github.com/Leaflet/Leaflet/issues/3708) | |||
* Fixed a layer control bug when removing layers (by [@davidlukerice](https://github.com/davidlukerice)) [#3651](https://github.com/Leaflet/Leaflet/pull/3651) | |||
* Fixed pan and zoom animations interacting with each other [#3355](https://github.com/Leaflet/Leaflet/issues/3355) [#3655](https://github.com/Leaflet/Leaflet/issues/3655) | |||
* Fixed a regression bug in canvas renderer when removing layers [#3661](https://github.com/Leaflet/Leaflet/issues/3661) | |||
* Remove a workaround for legacy Android 2 browsers [#2282](https://github.com/Leaflet/Leaflet/issues/2282) | |||
* Fixed VML vector rendering in IE8 when removing and re-adding layers (by [@fminuti](https://github.com/fminuti)) [#2809](https://github.com/Leaflet/Leaflet/issues/2809) | |||
* Fixed `flyTo` animations when the map center doesn't change (by [@fminuti](https://github.com/fminuti)) [#3663](https://github.com/Leaflet/Leaflet/pull/3663) | |||
* Fixed fade animations for semitransparent tile layers (by [@w8r](https://github.com/w8r)) [#3671](https://github.com/Leaflet/Leaflet/pull/3671) | |||
* Fixed behaviour of the `baselayerchange` event (by [@yohanboniface](https://github.com/yohanboniface)) [#3677](https://github.com/Leaflet/Leaflet/issues/3677) | |||
* Fixed marker icon handling during a marker drag (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3687](https://github.com/Leaflet/Leaflet/issues/3687) | |||
* Fixed a IE 11 map container visibility bug (by [@fminuti](https://github.com/fminuti)) [#2788](https://github.com/Leaflet/Leaflet/issues/2788) | |||
* Prevented dragging interactions while a map zoom animation is running (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3692](https://github.com/Leaflet/Leaflet/issues/3692) | |||
* Implement disabling layers in the layer control when they are unavailable at the current zoom level (by [@IvanSanchez](https://github.com/IvanSanchez)) [#252](https://github.com/Leaflet/Leaflet/issues/252) | |||
* Refactored `L.Util.requestAnimFrame` definition (by [@fminuti](https://github.com/fminuti)) [#3703](https://github.com/Leaflet/Leaflet/issues/3703) | |||
* Fixed an edge case of `L.Circle.getBounds()` (by [@knabar](https://github.com/knabar)) [#3776](https://github.com/Leaflet/Leaflet/pull/3776) | |||
* Fixed `Rectangle.setBounds()` return value (by [@IvanSanchez](https://github.com/IvanSanchez)) https://github.com/Leaflet/Leaflet/commit/e698f641afadd4a0b412a6c9e065a6dbfbe16f44 | |||
* Fixed event firing order when opening a popup (by [@yohanboniface](https://github.com/yohanboniface)) [#3745](https://github.com/Leaflet/Leaflet/issues/3745) | |||
* Fixed tile layer loading when dragging then immediately pinch-zooming the map (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3814](https://github.com/Leaflet/Leaflet/issues/3814) | |||
* Work around browser limitations when panning the map too far away (by [@yohanboniface](https://github.com/yohanboniface) and [@IvanSanchez](https://github.com/IvanSanchez)) [#3608](https://github.com/Leaflet/Leaflet/issues/3608) | |||
* Fixed popup text selection and touch events for IE 10 (by [@danzel](https://github.com/danzel)) [#3804](https://github.com/Leaflet/Leaflet/issues/3804) | |||
* Fixed tile layer ordering when `maxZoom` is set (by [@patrickarlt](https://github.com/patrickarlt)) [#3721](https://github.com/Leaflet/Leaflet/issues/3721) | |||
* Fixed scale behaviour on non-standard CRSs (by [@javimolla](https://github.com/patrickarlt), special thanks to [Your First PR](https://yourfirstpr.github.io/)) [#2990](https://github.com/Leaflet/Leaflet/issues/2990) | |||
* Fixed rendering of off-screen vector layers (by [@yohanboniface](https://github.com/yohanboniface)) [#3836](https://github.com/Leaflet/Leaflet/issues/3836) | |||
* Fixed rendering of intersecting vector layers (by [@yohanboniface](https://github.com/yohanboniface)) [#3583](https://github.com/Leaflet/Leaflet/issues/3583) | |||
* Enforced stricter code linting | |||
* Fixed disabled drag handlers not being able to be re-enabled (by [@yohanboniface](https://github.com/yohanboniface)) [#3825](https://github.com/Leaflet/Leaflet/issues/3825) | |||
* Fixed panning outside the map bounds (by [@yohanboniface](https://github.com/yohanboniface)) [#3878](https://github.com/Leaflet/Leaflet/issues/3878) | |||
* Worked around IE 11 not focusing the map using keyboard (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3772](https://github.com/Leaflet/Leaflet/issues/3772) | |||
* Fixed vector layer positioning during a zoom animation in low zoom (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3769](https://github.com/Leaflet/Leaflet/issues/3769) | |||
* Implemented `noWrap` option in `L.GridLayer` (by [@IvanSanchez](https://github.com/IvanSanchez)) [#3691](https://github.com/Leaflet/Leaflet/issues/3691) | |||
* Fixed popups panning the map while running another pan animation (by [@yohanboniface](https://github.com/yohanboniface)) [#3744](https://github.com/Leaflet/Leaflet/issues/3744) | |||
* Fixed uncorrect length of scale control due to CSS styles (by [@yohanboniface](https://github.com/yohanboniface)) [#3668](https://github.com/Leaflet/Leaflet/issues/3668) | |||
* Fixed detection of default image path for icons (by [@ilfa](https://github.com/ilfa)) [#3770](https://github.com/Leaflet/Leaflet/pull/3770) | |||
* Various Canvas events fixes (by [@yohanboniface](https://github.com/yohanboniface)) [#3917](https://github.com/Leaflet/Leaflet/pull/3917) | |||
* Fix touch scroll in layers control (by [@yohanboniface](https://github.com/yohanboniface)) [#2882](https://github.com/Leaflet/Leaflet/issues/2882) | |||
* Fix duration not passed through from setView to panBy (by [@yohanboniface](https://github.com/yohanboniface)) [#3300](https://github.com/Leaflet/Leaflet/issues/3300) | |||
## 1.0-beta1 (July 14, 2015) | |||
The first beta of the huge, long-awaited Leaflet 1.0 release. | |||
This version contains a lot of beneficial but potentially breaking changes (especially if you're a plugin author), so please read through the changes carefully if your code breaks after upgrading. | |||
### Vectors API improvements | |||
Leaflet vector layers rendering got a major rewrite, making it possible to switch between rendering backends (Canvas, SVG) dynamically (and even use both for different layers at the same time), have more than one physical pane for vector layers, significantly improving performance, adding Canvas retina support, getting rid of ugly hacks and generally making the code much cleaner. Main PR [#2290](https://github.com/Leaflet/Leaflet/pull/2290). | |||
* Added `Renderer` layer (inherited by SVG/Canvas implementations) that handles renderer bounds and zoom animation. | |||
* Added `SVG` & `Canvas` classes that now contain all renderer-specific code for vector layers and can be added as layers to the map. | |||
* All vector layer classes (`Path`, `Polyline`, etc.) now don't contain any renderer-specific code and instead can be passed a renderer layer to use as `renderer` in options; | |||
* Removed `MultiPolyline` and `MultiPolygon` classes since multiple rings are now handled by `Polyline` and `Polygon` classes respectively. Layers with multiple rings now perform much better (since each is now physically a single path object instead of being a `FeatureGroup` of layers). | |||
* **Dramatically improved performance of interactive Canvas layers**. Mouse events work much faster (due to improved hit detection algorithms), and layers get updated many times faster (with partial redraws instead of redrawing the whole Canvas). | |||
* **Dramatically improved performance of interactive SVG layers** (e.g. creating a big GeoJSON layer and adding to a map got 3x faster while taking 2.5x less memory). [#2240](https://github.com/Leaflet/Leaflet/issues/2240) [#2315](https://github.com/Leaflet/Leaflet/issues/2315) | |||
* Added retina support for Canvas layers. | |||
* Improved default vector layer styles. | |||
* Added `Polyline` and `Polygon` `getCenter` for getting centroids. | |||
* Respectively, improved `Polyline` and `Polygon` popup positioning when calling `openPopup`. | |||
* Improved `Polyline`/`Polygon` `getBounds` to be cached (so it works much faster). | |||
* Changed `Circle` to inherit from `CircleMarker` and not the other way. | |||
* Fixed `GeoJSON` `resetStyle` to work properly in case `style` option wasn't set. | |||
* Fixed a bug where map fired `moveend` when updating Canvas layers. | |||
* Removed `Polyline` and `Polygon` `spliceLatLngs` method (just use `setLatLngs` instead). | |||
* Changed `Polygon` `getLatLngs` to always return an array of rings (nested array) (by [@yohanboniface](https://github.com/yohanboniface)). [#2618](https://github.com/Leaflet/Leaflet/issues/2618) [#3386](https://github.com/Leaflet/Leaflet/pull/3386) [Leaflet/Leaflet#3279](https://github.com/Leaflet/Leaflet/pull/3279) [#2648](https://github.com/Leaflet/Leaflet/issues/2648) | |||
* Added the ability to specify a custom pane for vector layers (making it possible to easily do stacks like vectors-tiles-vectors with proper z-index order) (by [@Jakobud](https://github.com/Jakobud)). [#3266](https://github.com/Leaflet/Leaflet/pull/3266) [#2786](https://github.com/Leaflet/Leaflet/pull/2786) | |||
* Added vector layers `fillRule` option (by [@bullgare](https://github.com/bullgare)). [#2834](https://github.com/Leaflet/Leaflet/pull/2834) | |||
* Removed `L_PREFER_CANVAS` global switch and added `Map` `preferCanvas` option instead (by [@yohanboniface](https://github.com/yohanboniface)). [#3623](https://github.com/Leaflet/Leaflet/pull/3623) | |||
### Layers API improvements | |||
All Leaflet layers (including markers, popups, tile and vector layers) have been refactored to have a common parent, `Layer` class, that shares the basic logic of adding and removing. The leads to the following changes (main PR [#2266](https://github.com/Leaflet/Leaflet/pull/2266)): | |||
* Added `Layer` class which all layers added to a map should inherit from. | |||
* Added `add` and `remove` events to all layers. | |||
* Added `remove` method to layers and controls (`marker.remove()` is now equivalent to `map.removeLayer(marker)`). | |||
* Improved performance of adding and removing layers. | |||
* Added `pane` option to all layers that can be changed (e.g. you can set `pane: 'overlayPane'` to a tile layer). | |||
* Added `map` `createPane` method for custom panes. [#1742](https://github.com/Leaflet/Leaflet/issues/1742) | |||
* Simplified map panes — removed `objectsPane`, all panes are on the same level now. | |||
* Added `shadowPane` option to markers as well. | |||
* Added `getEvents` method to all layers that returns an `{event: listener, ...}` hash; layers now manage its listeners automatically without having to do this in `onAdd`/`onRemove`. | |||
* Added `togglePopup`, `setPopupContent`, `getPopup`, `isPopupOpen` methods to all layers. [#2279](https://github.com/Leaflet/Leaflet/issues/2279) [#2292](https://github.com/Leaflet/Leaflet/issues/2292) | |||
* Improved performance of adding/removing layers with layers control present (instead of listening to any layer add/remove, the control only listens to layers added in configuration). | |||
* Fixed `FeatureGroup` `getBounds` to work correctly when containing circle markers. | |||
* Removed `Map` `tilelayersload` event. | |||
* Removed `Popup` `open` and `close` events in favor of `add` and `remove` for consistency. | |||
* Moved all layer-related logic in `Map.js` to `Layer.js`. | |||
* Improved `FeatureGroup` `bindPopup` to accept a function for generating popup content, significantly improving memory footprint when adding popups to a huge number of layers (by [@patrickarlt](https://github.com/patrickarlt)). [#3109](https://github.com/Leaflet/Leaflet/pull/3109) [#3059](https://github.com/Leaflet/Leaflet/pull/3059) | |||
* Added `ImageOverlay` interactivity (mouse events, etc.) (by [@snkashis](https://github.com/snkashis)). [#3009](https://github.com/Leaflet/Leaflet/pull/3009) [#1727](https://github.com/Leaflet/Leaflet/issues/1727) | |||
* Added `ImageOverlay` `getBounds` (by [@brunob](https://github.com/brunob)). [#2848](https://github.com/Leaflet/Leaflet/pull/2848) | |||
* Renamed `clickable` option to `interactive` (by [@AndriiHeonia](https://github.com/AndriiHeonia)). [#2838](https://github.com/Leaflet/Leaflet/pull/2838) [#2499](https://github.com/Leaflet/Leaflet/issues/2499) | |||
* Changed the default z-index of panes to be bigger, leaving more room for customization (by [@patrickarlt](https://github.com/patrickarlt)). [#3591](https://github.com/Leaflet/Leaflet/pull/3591) | |||
* Improved DOM event bubbling mechanism for layers (by [@yohanboniface](https://github.com/yohanboniface)). [Leaflet/Leaflet#3307](https://github.com/Leaflet/Leaflet/pull/3307) [#3450](https://github.com/Leaflet/Leaflet/pull/3450) [#3307](https://github.com/Leaflet/Leaflet/pull/3307) | |||
* Added `nonBubblingEvents` option to layers (by [@yohanboniface](https://github.com/yohanboniface)). [#3605](https://github.com/Leaflet/Leaflet/pull/3605) [#3307](https://github.com/Leaflet/Leaflet/pull/3307) [#3604](https://github.com/Leaflet/Leaflet/issues/3604) | |||
In addition, layer events implementation was rewritten to use **event delegation**, significantly improving add/remove performance and memory footprint. [#3032](https://github.com/Leaflet/Leaflet/pull/3032) [#46](https://github.com/Leaflet/Leaflet/issues/46) | |||
### TileLayer & Projections API improvements | |||
TileLayer code and everything projections-related has undergone a major refactoring, documented in PR [#2247](https://github.com/Leaflet/Leaflet/pull/2247). It includes the following changes (in addition to much cleaner and simpler code): | |||
#### TileLayer API improvements | |||
These changes make implementing custom grid-like layers for Leaflet much easier. | |||
* Moved most of the `TileLayer` logic into the new `GridLayer` class (which `TileLayer` now inherits, extending it with logic specific to tile servers). | |||
* Removed `TileLayer.Canvas` in favor of the much more flexible and powerful `GridLayer`. | |||
* Improved tile wrapping and bounding logic in `TileLayer` to work transparently and completely depent on the CRS used; removed the need for `TileLayer` hacks when using custom projections. | |||
* Added non-square tiles support (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3573](https://github.com/Leaflet/Leaflet/pull/3573) [#3570](https://github.com/Leaflet/Leaflet/issues/3570) | |||
* Removed `url` property in `tileload` and `tileloadstart` events (get it through `tile.src`). | |||
#### Projections API improvements | |||
These changes were targeted at removing any hardcoded projection-specific logic accross Leaflet classes, making it transparent and driven by the chosen CRS. They make using Leaflet with custom projections (including flat maps) much easier, and remove the need for ugly hacks in the [Proj4Leaflet](https://github.com/kartena/Proj4Leaflet) plugin. | |||
* Added `CRS.Earth` which serves as a base for all Earth-based CRS (`EPSG3857` etc.). [#2345](https://github.com/Leaflet/Leaflet/pull/2345) | |||
* Added `Projection` `bounds` property that defines bounds for different projections (`Mercator`, etc.) in projected coordinates (by [@perliedman](https://github.com/perliedman)). | |||
* Added `CRS` `wrapLat` and `wrapLng` properties which define whether the world wraps on a given axis and in what range. Set as `[-180, 180]` for `EPSG:3857`, `EPSG:4326`, `EPSG:3395` by default. | |||
* Added `CRS` and `Map` `wrapLatLng` (the latter depends on the chosen CRS). | |||
* Added `CRS` `infinite` property that disables boundaries (the world can go on infinitely in any direction), default for `CRS.Simple`. | |||
* Added `CRS` `getProjectedBounds` and `Map` `getPixelWorldBounds` methods that returns world bounds in projected coordinates depending on zoom (derived from `Projection` `bounds`) (by [@perliedman](https://github.com/perliedman)). | |||
* Added `CRS` `unproject` method that converts coordinates in CRS-dependent units into `LatLng` coordinates (by [@sowelie](https://github.com/sowelie)). | |||
* Added `Map` `distance(latlng1, latlng2)` method that takes CRS into account and works with flat projections. [#2345](https://github.com/Leaflet/Leaflet/pull/2345) [#1442](https://github.com/Leaflet/Leaflet/issues/1442) | |||
* Improved `Circle` to be approximated with an ellipse in Earth-based projections. [#2345](https://github.com/Leaflet/Leaflet/pull/2345) | |||
* Fixed `EPSG:4326` to have correct tile pyramid (2x1 tiles at root). | |||
* Fixed `Projection.SphericalMercator` to project to meter units (by [@calvinmetcalf](https://github.com/calvinmetcalf)). | |||
* Fixed `Map` `worldCopyJump` option to work for other projections. | |||
* Fixed `Circle` to work with flat projections. [#2345](https://github.com/Leaflet/Leaflet/pull/2345) [#1465](https://github.com/Leaflet/Leaflet/issues/1465) | |||
* Fixed scale control precision in non-EPSG:3857 projections. [#2345](https://github.com/Leaflet/Leaflet/pull/2345) | |||
* Fixed `ImageOverlay` not working properly in some non-standard projections. [#3011](https://github.com/Leaflet/Leaflet/issues/3011) | |||
### Animations improvements and fractional zoom | |||
Animation code in Leaflet had undergone a major rewrite (main PR: [#2382](https://github.com/Leaflet/Leaflet/pull/2382)), bringing improvements such as: | |||
- Multi-level tile buffering for more seamless zooming experience with less flickering | |||
- Optimal path animation (`map.flyTo`) for zooming to a particular place in a curve (simultaneously zooming and panning) | |||
- Fractional zoom support — now you can do things like `map.setZoom(12.45)` and it just works. | |||
- Layers now rely on `zoom` event in addition to `viewreset` for frame-by-frame zoom animations. [#3278](https://github.com/Leaflet/Leaflet/pull/3278) | |||
### UX improvements | |||
* Improved panning inertia behavior so that there are no tearing during animation when panning around quickly. [#2360](https://github.com/Leaflet/Leaflet/issues/2360) | |||
* Improved inertial scrolling to have a nicer, more natural feel (by [@RickMohr](https://github.com/RickMohr)). [Leaflet/Leaflet#3063](https://github.com/Leaflet/Leaflet/pull/3063) [#3063](https://github.com/Leaflet/Leaflet/pull/3063) [#3062](https://github.com/Leaflet/Leaflet/issues/3062) [#2987](https://github.com/Leaflet/Leaflet/issues/2987) | |||
* Added popup fade out animation. | |||
* Improved keyboard support to ignore keystrokes with modifier keys (Ctrl, Alt, Meta) to not interfere with OS shortcuts. | |||
* Made popup to close when pressing Escape (by [@snkashis](https://github.com/snkashis)). [#951](https://github.com/Leaflet/Leaflet/issues/951) [#3000](https://github.com/Leaflet/Leaflet/pull/3000) | |||
* Improved keyboard zoom to zoom by 3 levels if shift key is pressed (by [@yohanboniface](https://github.com/yohanboniface)). [#3024](https://github.com/Leaflet/Leaflet/pull/3024) | |||
* Improved layers control to become scrollable when there are too many layers (by [@rowanwins](https://github.com/rowanwins)). [#3571](https://github.com/Leaflet/Leaflet/pull/3571) [#3167](https://github.com/Leaflet/Leaflet/issues/3167) | |||
### Misc. performance improvements | |||
* Significantly [improved](http://jsperf.com/leaflet-parsefloat-in-latlng/2) `LatLng` creation performance (8x). | |||
* Improved performance of layer objects construction. | |||
* Significantly improved `FeatureGroup` (and correspondingly `GeoJSON`) layer adding and events performance (about 10x) by implementing a much better event propagation mechanism. [#2311](https://github.com/Leaflet/Leaflet/pull/2311) | |||
* Improved Leaflet events and DOM events memory footprint. | |||
* Improved `Evented` `off` performance by about 2 times. | |||
### Other breaking API changes | |||
* Changed `DomUtil` `off` to require `context` attribute if you remove a listener that was previously added with a particular context. | |||
* Removed `DomUtil.getViewportOffset` method as it is no longer necessary. | |||
* Removed `DomUtil` `getTranslateString` and `getScaleString` methods. | |||
* Removed `DomUtil` `documentIsLtr` method. | |||
* Removed `LatLng` `RAD_TO_DEG`, `DEG_TO_RAD` and `MAX_MARGIN` constants. | |||
* Renamed `Util.limitExecByInterval` to `Util.throttle`. | |||
### Other API improvements | |||
* Added `Evented` class that now many Leaflet classes inherit from (instead of mixing in events methods in each class), while keeping the old `includes: L.Mixin.Events` syntax available. [#2310](https://github.com/Leaflet/Leaflet/pull/2310) | |||
* Improved `Class` `options` to be prototypically inherited instead of copied over in children classes, which leads to more efficient memory use, faster object construction times and ability to change parent options that get propagated to all children automatically (by [@jfirebaugh](https://github.com/jfirebaugh)). [#2300](https://github.com/Leaflet/Leaflet/pull/2300) [#2294](https://github.com/Leaflet/Leaflet/issues/2294) | |||
* Added `{r}` variable to `TileLayer` `url` for adding `"@2x"` prefix on Retina-enabled devices (by [@urbaniak](https://github.com/urbaniak)). [#2296](https://github.com/Leaflet/Leaflet/pull/2296) | |||
* Added `Point` `ceil` method (by [@perliedman](https://github.com/perliedman)). | |||
* Added `Util.wrapNum` method for wrapping a number to lie in a certain range. | |||
* Improved `L.bind` to use native `Function` `bind` on modern browsers and prepend real arguments to bound ones. | |||
* Added `LatLng` `equals` second argument `maxMargin`. | |||
* Added `DomUtil` `setClass` and `getClass` methods. | |||
* Improved `Marker` `move` event to include `oldLatlng` (by [@danzel](https://github.com/danzel)). [#2412](https://github.com/Leaflet/Leaflet/pull/2412) | |||
* Added `Marker` `mousemove` event (by [@bullgare](https://github.com/bullgare)). [#2798](https://github.com/Leaflet/Leaflet/pull/2798) | |||
* Improved `DomEvent` `on`/`off` to accept space-separated events and object literals (`{type: fn}`). | |||
* Added `DomUtil` `toFront` and `toBack` methods. | |||
* Added `Evented` `listens` as a shortcut to `hasEventListeners`. | |||
* Added optional support for center-oriented scroll for `L.map` option `touchZoom` (by [@mtmail](https://github.com/mtmail)). [#2527](https://github.com/Leaflet/Leaflet/pull/2527) | |||
* Added `getElement` method to all layers that returns an associated DOM element. | |||
* Added `LatLng` `clone` method (by [@yohanboniface](https://github.com/yohanboniface)). [#3390](https://github.com/Leaflet/Leaflet/pull/3390) | |||
* Added `Map` `setMinZoom` and `setMaxZoom` methods (by [@nathancahill](https://github.com/nathancahill)). [#3383](https://github.com/Leaflet/Leaflet/pull/3383) [#3380](https://github.com/Leaflet/Leaflet/issues/3380) | |||
* Added `originalEvent` to `Map` and `Marker` `drag` and `move` event data (by [@yohanboniface](https://github.com/yohanboniface)). [#3264](https://github.com/Leaflet/Leaflet/pull/3264) | |||
* Added `Popup` `autoClose` option (by [@jfirebaugh](https://github.com/jfirebaugh)). [#3018](https://github.com/Leaflet/Leaflet/pull/3018) [#2716](https://github.com/Leaflet/Leaflet/issues/2716) [#1853](https://github.com/Leaflet/Leaflet/issues/1853) | |||
* Added `Control.Zoom` `enable` and `disable` methods. [#3172](https://github.com/Leaflet/Leaflet/issues/3172) | |||
* Added an argument to `L.PolyUtil.clipPolygon` that controls rounding (by [@aparshin](https://github.com/aparshin)). [#2926](https://github.com/Leaflet/Leaflet/pull/2926) [#2917](https://github.com/Leaflet/Leaflet/issues/2917) | |||
* Added `Map` `wheelDebounceTime` option (by [@AndriiHeonia](https://github.com/AndriiHeonia)). [#2836](https://github.com/Leaflet/Leaflet/pull/2836) [#2501](https://github.com/Leaflet/Leaflet/issues/2501) | |||
* Added `TileLayer.WMS` `uppercase` option (now `false` by default) (by [@kdeloach](https://github.com/kdeloach)). [#2831](https://github.com/Leaflet/Leaflet/pull/2831) [#1751](https://github.com/Leaflet/Leaflet/issues/1751) | |||
* Added `ImageOverlay` `alt` option (by [@francis-liberty](https://github.com/francis-liberty)). [#2767](https://github.com/Leaflet/Leaflet/pull/2767) [#2564](https://github.com/Leaflet/Leaflet/issues/2564) | |||
* Improved `L.Util.extend` performance (by [@fab1an](https://github.com/fab1an)). [#2746](https://github.com/Leaflet/Leaflet/pull/2746) | |||
* Added `Map` `stop` method for stopping panning or `flyTo` animation. | |||
* Added `Map` `maxBoundsViscosity` option that controls how much the map resits dragging out of max bounds (set to `1` for a hard limit) (by [@IvanSanchez](https://github.com/IvanSanchez)). [#2224](https://github.com/Leaflet/Leaflet/pull/2224) [#3510](https://github.com/Leaflet/Leaflet/pull/3510) [#1673](https://github.com/Leaflet/Leaflet/issues/1673) | |||
* Added `Bounds` and `LatLngBounds` `overlaps` method (by [@IvanSanchez](https://github.com/IvanSanchez)). [#2981](https://github.com/Leaflet/Leaflet/issues/2981) [#3508](https://github.com/Leaflet/Leaflet/pull/3508) | |||
* Added `ImageOverlay` `crossOrigin` option (by [@patrickarlt](https://github.com/patrickarlt)). [#3594](https://github.com/Leaflet/Leaflet/pull/3594) [#2621](https://github.com/Leaflet/Leaflet/pull/2621) | |||
### Bugfixes | |||
* Fixed `DomUtil` `on` to make it possible to add the same listener to the same element for multiple contexts. | |||
* Fixed a bug that thowed an error when attempting to reinitialize the map on unload (by [@gamb](https://github.com/gamb)). [#2410](https://github.com/Leaflet/Leaflet/pull/2410) | |||
* Fixed excessively blurry non-retina tiles on retina iOS devices. | |||
* Fixed a bug with popup close button in IE7/8. [#2351](https://github.com/Leaflet/Leaflet/issues/2351) | |||
* Fixed `ImageOverlay` mercator distortion on lower zoom levels. | |||
* Fixed a bug where layers didn't fire `popupopen` and `popupclose` events when manually creating a popup object and passing it to `bindPopup`. [#2354](https://github.com/Leaflet/Leaflet/issues/2354) | |||
* Fixed box-zoom overlay appearing under markers. [#1813](https://github.com/Leaflet/Leaflet/issues/1813) | |||
* Fixed `Map` `panInsideBounds` to accept array-form bounds (by [@RLRR](https://github.com/RLRR)). [#3489](https://github.com/Leaflet/Leaflet/pull/3489) | |||
* Fixed marker draggable state to persist when removing and adding back to the map (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3488](https://github.com/Leaflet/Leaflet/pull/3488) | |||
* Fixed inertia not working when parallel to axis (by [@rikvanmechelen](https://github.com/rikvanmechelen)). [#3432](https://github.com/Leaflet/Leaflet/issues/3432) | |||
* Fixed images and SVG inside popups having max-width property overriden (by [@yohanboniface](https://github.com/yohanboniface)). [#3452](https://github.com/Leaflet/Leaflet/pull/3452) | |||
* Fixed cursors when dragging is disabled (by [@juliensoret](https://github.com/juliensoret)). [#3219](https://github.com/Leaflet/Leaflet/issues/3219) [#3233](https://github.com/Leaflet/Leaflet/pull/3233) | |||
* Fixed `LatLng` `wrap` to not drop altitude (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3420](https://github.com/Leaflet/Leaflet/issues/3420) | |||
* Fixed Firefox for Android not being detected as mobile (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3419](https://github.com/Leaflet/Leaflet/pull/3419) | |||
* Fixed an infinite loop when calling `setMaxBounds` several times in a row (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3410](https://github.com/Leaflet/Leaflet/pull/3410) [#3320](https://github.com/Leaflet/Leaflet/issues/3320) | |||
* Fixed a WTF `Map` `locate` bug that could cause some unexpected effects (by [@sindre](https://github.com/sindre)). [Leaflet/Leaflet#3404](https://github.com/Leaflet/Leaflet/issues/3404) | |||
* Fixed broken zoom in Project Spartan browsers (by [@mitchless](https://github.com/mitchless)). [#3379](https://github.com/Leaflet/Leaflet/pull/3379) | |||
* Fixed broken `Polygon` `getCenter` when all points <area></area> in the same pixel (by [@yohanboniface](https://github.com/yohanboniface)). [#3372](https://github.com/Leaflet/Leaflet/pull/3372) | |||
* Fixed broken `Polyline` `getCenter` when the line is very small (by [@yohanboniface](https://github.com/yohanboniface)). [#3371](https://github.com/Leaflet/Leaflet/pull/3371) | |||
* Fixed keyboard zoom out not working on `azerty` keyboards. [#3362](https://github.com/Leaflet/Leaflet/issues/3362) | |||
* Fixed a bug where tabbing to an offscreen marker broke control positioning (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3340](https://github.com/Leaflet/Leaflet/pull/3340) [#3333](https://github.com/Leaflet/Leaflet/issues/3333) | |||
* Fixed `Map` `panBy` not always returning `this` (by [@Trufi](https://github.com/Trufi)). [#3303](https://github.com/Leaflet/Leaflet/pull/3303) | |||
* Fixed a bug where pushing a zoom control with a keyboard would switch focus to the map (by [@Jakobud](https://github.com/Jakobud)). [#3275](https://github.com/Leaflet/Leaflet/pull/3275) [#3159](https://github.com/Leaflet/Leaflet/issues/3159) | |||
* Fixed more race conditions leading to map freeze. [#3270](https://github.com/Leaflet/Leaflet/pull/3270) [#3268](https://github.com/Leaflet/Leaflet/issues/3268) [#2693](https://github.com/Leaflet/Leaflet/issues/2693) [#2478](https://github.com/Leaflet/Leaflet/issues/2478) | |||
* Fixed iOS race condition when doing a very small pan. [#2519](https://github.com/Leaflet/Leaflet/issues/2519) | |||
* Fixed `Polygon` `toGeoJSON` exporting a `MultiPolygon` in some cases (by [@yohanboniface](https://github.com/yohanboniface)). [#2977](https://github.com/Leaflet/Leaflet/pull/2977) | |||
* Fixed `TileLayer.WMS` passing all options as WMS params. [#2972](https://github.com/Leaflet/Leaflet/issues/2972) | |||
* Fixed a race condition that made `map.fitBounds(map.getBounds())` zoom out sometimes. [#2957](https://github.com/Leaflet/Leaflet/issues/2957) | |||
* Fixed a bug where a draggable marker stopped being draggable after `setIcon` (by [@jeffsmale90](https://github.com/jeffsmale90)). [#2578](https://github.com/Leaflet/Leaflet/issues/2578) | |||
* Fixed some IE11 touch performance and stability issues (by [@danzel](https://github.com/danzel)). [#3007](https://github.com/Leaflet/Leaflet/pull/3007) [#2820](https://github.com/Leaflet/Leaflet/issues/2820) | |||
* Fixed a race condition with `TileLayer` when `maxNativeZoom = 0`. [#3004](https://github.com/Leaflet/Leaflet/issues/3004) | |||
* Fixed `FeatureGroup` `setStyle` not affecting `ImageOverlay` `opacity` (by [@opie](https://github.com/opie)). [#3008](https://github.com/Leaflet/Leaflet/pull/3008) [#2246](https://github.com/Leaflet/Leaflet/issues/2246) | |||
* Fixed class init hooks not being called for parent classes (by [@jfirebaugh](https://github.com/jfirebaugh)). [#2545](https://github.com/Leaflet/Leaflet/issues/2545) | |||
* Fixed a bug when adding a control that's already added or removing a control that's not present (by [@jfirebaugh](https://github.com/jfirebaugh)). [#3020](https://github.com/Leaflet/Leaflet/issues/3020) [#2877](https://github.com/Leaflet/Leaflet/issues/2877) | |||
* Fixed buggy inertia on low zoom levels when `Map` `worldCopyJump` option is enabled (by [@flemenach](https://github.com/flemenach)). [#3038](https://github.com/Leaflet/Leaflet/pull/3038) [#2624](https://github.com/Leaflet/Leaflet/issues/2624) | |||
* Fixed a bug where `getMaxZoom` sometimes returned wrong result inside a `Control.Layers` `baselayerchange` event (by [@CloudNiner](https://github.com/CloudNiner)). [#3048](https://github.com/Leaflet/Leaflet/pull/3048) [#2318](https://github.com/Leaflet/Leaflet/issues/2318) | |||
* Fixed a bug where during zooming one map, dragging was disabled on all other maps on the page (by [@kdeloach](https://github.com/kdeloach)). [#3050](https://github.com/Leaflet/Leaflet/pull/3050) [#2539](https://github.com/Leaflet/Leaflet/issues/2539) | |||
* Fixed a `Map` `getSize` race condition where it could return a wrong result (by [@kshepard](https://github.com/kshepard)). [#3052](https://github.com/Leaflet/Leaflet/pull/3052) [#3031](https://github.com/Leaflet/Leaflet/issues/3031) | |||
* Fixed `L.latLng` factory to accept `altitude` as a third argument too (by [@lonelyelk](https://github.com/lonelyelk)). [#3070](https://github.com/Leaflet/Leaflet/pull/3070). | |||
* Fixed `L.latLng` factory to not throw error on empty array input (by [@lonelyelk](https://github.com/lonelyelk)). [#3080](https://github.com/Leaflet/Leaflet/pull/3080) [#3079](https://github.com/Leaflet/Leaflet/issues/3079) | |||
* Fixed popups to have a default color (by [@snkashis](https://github.com/snkashis)). [#3115](https://github.com/Leaflet/Leaflet/pull/3115) [#3112](https://github.com/Leaflet/Leaflet/issues/3112) [#333](https://github.com/Leaflet/Leaflet/issues/333) | |||
* Fixed `Map` `locate` not to mutate the given options object (by [@tmcw](https://github.com/tmcw)). [#3173](https://github.com/Leaflet/Leaflet/pull/3173) | |||
* Fixed Canvas polylines not to render if stroke is set to 0 (by [@optical](https://github.com/optical)). [#3203](https://github.com/Leaflet/Leaflet/pull/3203) | |||
* Prevented a Joomla bug that could lead to vector layers disappearing (by [@SniperSister](https://github.com/SniperSister)). [#2886](https://github.com/Leaflet/Leaflet/pull/2886) [#2881](https://github.com/Leaflet/Leaflet/issues/2881) [Leaflet/Leaflet#2881](https://github.com/Leaflet/Leaflet/issues/2881) | |||
* Fixed IE Metro touch events passing through objects on top of a Leaflet map (by [@nikgavalas](https://github.com/nikgavalas)). [#2954](https://github.com/Leaflet/Leaflet/pull/2954) | |||
* Fixed a bug where vector layers wouldn't display on websites with SVG max-width set to 100% (by [@SniperSister](https://github.com/SniperSister)). [#2886](https://github.com/Leaflet/Leaflet/pull/2886) [#2881](https://github.com/Leaflet/Leaflet/issues/2881) | |||
* Fixed `Marker` `setIcon` to not reset popup anchor offset (by [@bullgare](https://github.com/bullgare)). [#2872](https://github.com/Leaflet/Leaflet/pull/2872) | |||
* Fixed a case where you provide `zoom` in `Map` options and then set center (by [@AndriiHeonia](https://github.com/AndriiHeonia)). [#2849](https://github.com/Leaflet/Leaflet/pull/2849) [#1871](https://github.com/Leaflet/Leaflet/issues/1871) | |||
* Fixed a race condition with `TileLayer` `setUrl` where `loading` event didn't fire properly (by [@bennlich](https://github.com/bennlich)). [#2802](https://github.com/Leaflet/Leaflet/pull/2802) [#2675](https://github.com/Leaflet/Leaflet/issues/2675) [#2827](https://github.com/Leaflet/Leaflet/pull/2827) | |||
* Fixed a bug where a tile layer was not cleaned up properly after zooming past its max zoom (by [@francis-liberty](https://github.com/francis-liberty)). [#2764](https://github.com/Leaflet/Leaflet/pull/2764) [#1905](https://github.com/Leaflet/Leaflet/issues/1905) | |||
* Fixed a memory leak with `Marker` `setIcon` (by [@jfgodoy](https://github.com/jfgodoy)). [#2811](https://github.com/Leaflet/Leaflet/pull/2811) | |||
* Fixed `LatLng` `distanceTo` to not return `NaN` on equal locations. [#2705](https://github.com/Leaflet/Leaflet/issues/2705) | |||
* Fixed a bug where `TileLayer` `maxNativeZoom` didn't work properly with `bounds` option set (by [@mlegenhausen](https://github.com/mlegenhausen)). [#2725](https://github.com/Leaflet/Leaflet/pull/2725) [#2704](https://github.com/Leaflet/Leaflet/issues/2704) | |||
* Fixed a bug where tiles touching the edge of the bounds from outside where loaded (by [@IvanSanchez](https://github.com/IvanSanchez)). [#2981](https://github.com/Leaflet/Leaflet/issues/2981) [#3508](https://github.com/Leaflet/Leaflet/pull/3508) | |||
* Fixed a memory leak in `map.remove()` (by [@IvanSanchez](https://github.com/IvanSanchez)). [#3514](https://github.com/Leaflet/Leaflet/pull/3514) [#2718](https://github.com/Leaflet/Leaflet/issues/2718) | |||
* Fixed a bug where layers control collapsed when hovering over a disabled radio button (by [@rowanwins](https://github.com/rowanwins)). [#3564](https://github.com/Leaflet/Leaflet/pull/3564) [#2771](https://github.com/Leaflet/Leaflet/issues/2771) [Leaflet#2771](https://github.com/Leaflet/Leaflet/issues/2771) | |||
* Fixed GeoJSON not accepting null geometry (by [@pglotov](https://github.com/pglotov)). [#3585](https://github.com/Leaflet/Leaflet/pull/3585) | |||
* Fixed occasional popup 1px horizontal offset (by [@patrickarlt](https://github.com/patrickarlt)). [#3587](https://github.com/Leaflet/Leaflet/pull/3587) [#3526](https://github.com/Leaflet/Leaflet/pull/3526) [#3586](https://github.com/Leaflet/Leaflet/issues/3586) [#3525](https://github.com/Leaflet/Leaflet/issues/3525) | |||
* Fixed some inconsistencies in mouse events for Canvas vector layers (by [@wpf500](https://github.com/wpf500)). [#3590](https://github.com/Leaflet/Leaflet/pull/3590) [#3568](https://github.com/Leaflet/Leaflet/issues/3568) [#3618](https://github.com/Leaflet/Leaflet/pull/3618) | |||
* Fixed scale control for non-earth CRS (by [@cmulders](https://github.com/cmulders)). [#3614](https://github.com/Leaflet/Leaflet/pull/3614) | |||
### Misc improvements | |||
* Improved the build system (`jake build`) to report gzipped library size. | |||
* Added version name and commit number to Leaflet builds. [#2276](https://github.com/Leaflet/Leaflet/issues/2276) | |||
* Added Leaflet logo in vector format as `src/images/logo.svg`. | |||
* Added reference to Leaflet CSS in `package.json` (by [@bclinkinbeard](https://github.com/bclinkinbeard)). [#2432](https://github.com/Leaflet/Leaflet/pull/2432) | |||
* Switched from JSHint to ESLint for checking code style and made the checks more strict. [#3176](https://github.com/Leaflet/Leaflet/pull/3176) | |||
* Added a plugin guide section on module loaders and publishing plugins (by [@patrickarlt](https://github.com/patrickarlt)). [#2955](https://github.com/Leaflet/Leaflet/pull/2955) [Leaflet/Leaflet#2955](https://github.com/Leaflet/Leaflet/pull/2955) | |||
* Fixed the build system to work in non-git Leaflet folder (by [@cschwarz](https://github.com/cschwarz)). [#2758](https://github.com/Leaflet/Leaflet/pull/2758) | |||
## 0.7.7 (October 26, 2015) | |||
* Fixed a regression that could sometimes cause tiles to disappear when pinch-zooming on iOS devices. | |||
@@ -13,17 +557,19 @@ Leaflet Changelog | |||
Note tha we skipped 0.7.6 version for which we accidentally published a broken build to NPM. | |||
## 0.7.5 (September 2, 2015) | |||
* Fixed a regression that broke animation in Leaflet.markercluster. [#3796](https://github.com/Leaflet/Leaflet/issues/3796) | |||
## 0.7.4 (September 1, 2015) | |||
* Fixed a bug introduced by a recent Chrome update that caused the map not to react to interactions until all tiles are loaded. [#3689](https://github.com/Leaflet/Leaflet/issues/3689) | |||
* Fixed a bug where tile layers were not respecting their `minZoom` or `maxZoom` options (by [@ivansanchez](https://github.com/ivansanchez)) [#3778](https://github.com/Leaflet/Leaflet/pull/3778) | |||
* Improved detection of touch-capable web browsers, in particular fixing touch interactions in device emulation mode in Chrome and Firefox (by [@ivansanchez](https://github.com/ivansanchez)) [#3520](https://github.com/Leaflet/Leaflet/pull/3520) [#3710](https://github.com/Leaflet/Leaflet/pull/3710) | |||
* Fixed a bug where tile layers with `maxNativeZoom` were not checking bounds properly (by [@jlaxon](https://github.com/jlaxon)) [#3415](https://github.com/Leaflet/Leaflet/pull/3152) | |||
* Fixed a bug where popups were not remembering which layer originated them after calling `bindPopup(popup)` (by [@Eschon](https://github.com/Eschon)) [#3675](https://github.com/Leaflet/Leaflet/pull/3765) | |||
* Fixed a bug where popups were not remembering which layer originated them after calling `bindPopup(popup)` (by [@Eschon](https://github.com/Eschon)) [#3675](https://github.com/Leaflet/Leaflet/pull/3675) | |||
* Fixed a race condition between markers and zoom animation (by [@perliedman](https://github.com/perliedman)) [#3152](https://github.com/Leaflet/Leaflet/pull/3152) | |||
* Fixed a bug with `Map.fitBounds` padding (by [@bsstoner](https://github.com/bsstoner)). [#2489](https://github.com/Leaflet/Leaflet/issues/2489) | |||
* Allow canvas paths to fire `dblclick` and `contextmenu` events (by [@ivansanchez](https://github.com/ivansanchez)) [#3482](https://github.com/Leaflet/Leaflet/pull/3482) | |||
@@ -31,24 +577,27 @@ Note tha we skipped 0.7.6 version for which we accidentally published a broken b | |||
* Allow canvas lines to use `lineCap` and `lineJoin` options (by [@northerneyes](https://github.com/northerneyes)) [#3156](https://github.com/Leaflet/Leaflet/pull/3156) | |||
* Updated bower definitions to comply with best practices (by [@guptaso2](https://github.com/guptaso2)) [#2726](https://github.com/Leaflet/Leaflet/pull/2726) [#3448](https://github.com/Leaflet/Leaflet/pull/3448) | |||
## 0.7.3 (May 23, 2014) | |||
* Added proper **bower** and **component** support (by [@calvinmetcalf](https://github.com/calvinmetcalf)). [#2561](https://github.com/Leaflet/Leaflet/pull/2561) [#1903](https://github.com/Leaflet/Leaflet/issues/1903) | |||
* Fixed a bug where dragging the map outside the window caused an error on FF. [#2610](https://github.com/Leaflet/Leaflet/issues/2610) | |||
* Fixed a bug where some taps on Android where not working, often falsely perceived as drags (by [@axefrog](https://github.com/axefrog)). [#2503](https://github.com/Leaflet/Leaflet/pull/2503) | |||
* Fixed a bug where tapping too quickly on Android ignored most taps. [#2303](https://github.com/Leaflet/Leaflet/issues/2303) | |||
* Fixed a bug where clicks on Android were skipped when happened too fast. [#2303](https://github.com/Leaflet/Leaflet/issues/2303) | |||
* Fixed a bug where calling `setView` (or similar methods) several times in succession could freeze the map. [#2521](https://github.com/Leaflet/Leaflet/issues/2521) [#2236](https://github.com/Leaflet/Leaflet/issues/2236) [#2485](https://github.com/Leaflet/Leaflet/issues/2485) | |||
* Fixed a bug where `Control.Layers` wasn't properly removed (by [@jack-kerouac](https://github.com/jack-kerouac)). [#2569](https://github.com/Leaflet/Leaflet/pull/2569) | |||
* Fixed a bug that caused `TileLayer` `load` event not to fire properly. [#2510](https://github.com/Leaflet/Leaflet/issues/2510) | |||
* Fixed Canvas-based paths not triggering `remove` event when removed (by @adimitrov). [#2486](https://github.com/Leaflet/Leaflet/pull/2486) | |||
* Fixed a bug where you could end up with fractional zoom after pinch-zooming in some cases (by [@danzel](https://github.com/danzel). [#2400](https://github.com/Leaflet/Leaflet/pull/2400) [#1943](https://github.com/Leaflet/Leaflet/issues/1934) | |||
## 0.7.2 (January 17, 2013) | |||
## 0.7.2 (January 17, 2014) | |||
* Fixed a bug that appeared with **Chrome 32 update** that made all **mouse events shifted on scrolled pages**. [#2352](https://github.com/Leaflet/Leaflet/issues/2352) | |||
* Fixed a bug that could break tile loading when using non-standard tile sizes. [#2288](https://github.com/Leaflet/Leaflet/issues/2288) | |||
* Fixed a bug where `maxNativeZoom` option didn't work with TMS tile layers (by [@perliedman](https://github.com/perliedman)). [#2321](https://github.com/Leaflet/Leaflet/issues/2321) [#2314](https://github.com/Leaflet/Leaflet/issues/2314) | |||
## 0.7.1 (December 6, 2013) | |||
* Fixed a bug where pinch-zooming quickly could occasionally leave the map at a fractional zoom thus breaking tile loading (by [@danzel](https://github.com/danzel)). [#2269](https://github.com/Leaflet/Leaflet/pull/2269) [#2255](https://github.com/Leaflet/Leaflet/issues/2255) [#1934](https://github.com/Leaflet/Leaflet/issues/1934) |
@@ -5,17 +5,19 @@ Contributing to Leaflet | |||
2. [Reporting Bugs](#reporting-bugs) | |||
3. [Contributing Code](#contributing-code) | |||
4. [Improving Documentation](#improving-documentation) | |||
5. [Code of Conduct](#code-of-conduct) | |||
## Getting Involved | |||
Third-party patches are absolutely essential on our quest to create the best mapping library that will ever exist. | |||
However, they're not the only way to get involved with the development of Leaflet. | |||
You can help the project tremendously by discovering and [reporting bugs](#reporting-bugs), | |||
[improving documentation](#improving-documentation), | |||
helping others on the [Leaflet forum](https://groups.google.com/forum/#!forum/leaflet-js) | |||
and [GitHub issues](https://github.com/Leaflet/Leaflet/issues), | |||
showing your support for your favorite feature suggestions on [Leaflet UserVoice page](http://leaflet.uservoice.com), | |||
tweeting to [@LeafletJS](http://twitter.com/LeafletJS) | |||
However, they're not the only way to get involved with Leaflet development. | |||
You can help the project tremendously by discovering and [reporting bugs](#reporting-bugs); | |||
[improving documentation](#improving-documentation); | |||
helping others on [Stack Overflow](https://stackoverflow.com/questions/tagged/leaflet), | |||
[GIS Stack Exchange](https://gis.stackexchange.com/questions/tagged/leaflet) | |||
and [GitHub issues](https://github.com/Leaflet/Leaflet/issues); | |||
showing your support for your favorite feature suggestions on [Leaflet UserVoice page](http://leaflet.uservoice.com); | |||
tweeting to [@LeafletJS](http://twitter.com/LeafletJS); | |||
and spreading the word about Leaflet among your colleagues and friends. | |||
## Reporting Bugs | |||
@@ -26,34 +28,35 @@ first make sure that your issue is caused by Leaflet, not your application code | |||
Second, search the already reported issues for similar cases, | |||
and if it's already reported, just add any additional details in the comments. | |||
After you made sure that you've found a new Leaflet bug, | |||
After you've made sure that you've found a new Leaflet bug, | |||
here are some tips for creating a helpful report that will make fixing it much easier and quicker: | |||
* Write a **descriptive, specific title**. Bad: *Problem with polylines*. Good: *Doing X in IE9 causes Z*. | |||
* Include **browser, OS and Leaflet version** info in the description. | |||
* Create a **simple test case** that demonstrates the bug (e.g. using [JSFiddle](http://jsfiddle.net/)). | |||
* Create a **simple test case** that demonstrates the bug (e.g. using [Leaflet playground](http://playground-leaflet.rhcloud.com/)). | |||
* Check whether the bug can be reproduced in **other browsers**. | |||
* Check if the bug occurs in the stable version, master, or both. | |||
* *Bonus tip:* if the bug only appears in the master version but the stable version is fine, | |||
use `git bisect` to find the exact commit that introduced the bug. | |||
If you just want some help with your project, | |||
try asking [on the Leaflet forum](https://groups.google.com/forum/#!forum/leaflet-js) instead. | |||
try asking on [Stack Overflow](https://stackoverflow.com/questions/tagged/leaflet) | |||
or [GIS Stack Exchange](https://gis.stackexchange.com/questions/tagged/leaflet) instead. | |||
## Contributing Code | |||
### Considerations for Accepting Patches | |||
While we happily accept patches, we're also commited to keeping Leaflet simple, lightweight and blazingly fast. | |||
While we happily accept patches, we're also committed to keeping Leaflet simple, lightweight and blazingly fast. | |||
So bugfixes, performance optimizations and small improvements that don't add a lot of code | |||
are much more likely to get accepted quickly. | |||
Before sending a pull request with a new feature, first check if it's been discussed before already | |||
Before sending a pull request with a new feature, check if it's been discussed before already | |||
(either on [GitHub issues](https://github.com/Leaflet/Leaflet/issues) | |||
or [Leaflet UserVoice](http://leaflet.uservoice.com/)), | |||
and then ask yourself two questions: | |||
and ask yourself two questions: | |||
1. Are you sure that this new feature is important enough to justify its presense in the Leaflet core? | |||
1. Are you sure that this new feature is important enough to justify its presence in the Leaflet core? | |||
Or will it look better as a plugin in a separate repository? | |||
2. Is it written in a simple, concise way that doesn't add bulk to the codebase? | |||
@@ -62,8 +65,8 @@ please consider submitting another pull request with the corresponding [document | |||
### Setting up the Build System | |||
To set up the Leaflet build system, install [Node](http://nodejs.org/), | |||
then run the following commands in the project root: | |||
The Leaflet build system uses [Node](http://nodejs.org/), and the [Jake](http://jakejs.com/) Javascript build tool. | |||
To set up the Leaflet build system, install Node then run the following commands in the project root to install Jake: | |||
``` | |||
npm install -g jake | |||
@@ -85,7 +88,7 @@ Please do not commit to the `master` branch, or your unrelated changes will go i | |||
You should also follow the code style and whitespace conventions of the original codebase. | |||
In particular, use tabs for indentation and spaces for alignment. | |||
Before commiting your changes, run `jake lint` to catch any JS errors in the code and fix them. | |||
Before committing your changes, run `jake lint` to catch any JS errors in the code and fix them. | |||
If you add any new files to the Leaflet source, make sure to also add them to `build/deps.js` | |||
so that the build system knows about them. | |||
@@ -119,18 +122,18 @@ To generate a detailed report about test coverage (which helps tremendously when | |||
jake test --cov | |||
``` | |||
After that, open `spec/coverage/<environment>/index.html` in a browser to see the report. | |||
After that, open `coverage/<environment>/index.html` in a browser to see the report. | |||
From there you can click through folders/files to get details on their individual coverage. | |||
## Improving Documentation | |||
The code of the live Leaflet website that contains all documentation and examples is located in the `gh-pages` branch | |||
and is automatically generated from a set of HTML and Markdown files by [Jekyll](https://github.com/mojombo/jekyll). | |||
The code of the live Leaflet website that contains all documentation and examples is located in the `docs/` directory of the `master` branch | |||
and is automatically generated from a set of HTML and Markdown files by [Jekyll](http://jekyllrb.com/). | |||
The easiest way to make little improvements such as fixing typos without even leaving the browser | |||
is by editing one of the files with the online GitHub editor: | |||
browse the [gh-pages branch](https://github.com/Leaflet/Leaflet/tree/gh-pages), | |||
choose a certain file for editing (e.g. `reference.html` for API reference), | |||
browse the [`docs/ directory`](https://github.com/Leaflet/Leaflet/tree/master/docs), | |||
choose a certain file for editing (e.g. `plugins.html` for the list of Leaflet plugins), | |||
click the Edit button, make changes and follow instructions from there. | |||
Once it gets merged, the changes will immediately appear on the website. | |||
@@ -138,18 +141,45 @@ If you need to make edits in a local repository to see how it looks in the proce | |||
1. [Install Ruby](http://www.ruby-lang.org/en/) if don't have it yet. | |||
2. Run `gem install jekyll`. | |||
3. Run `jekyll serve --watch` in the root `Leaflet` folder. | |||
4. Open `localhost:4000` in your browser. | |||
3. Enter the directory where you cloned the Leaflet repository | |||
4. Make sure you are in the `master` branch by running `git checkout master` | |||
5. Enter the documentation subdirectory by running `cd docs` | |||
6. Run `jekyll serve --watch`. | |||
7. Open `localhost:4000` in your web browser. | |||
Now any file changes will be updated when you reload pages automatically. | |||
After commiting the changes, just send a pull request. | |||
After committing the changes, just send a pull request. | |||
If you need to update documentation according to a new feature that only appeared in the master version (not stable one), | |||
you need to make changes to `gh-pages-master` branch instead of `gh-pages`. | |||
It will get merged into the latter when released as stable. | |||
### API documentation | |||
Since Leaflet 1.0.0-rc1, the API documentation in `reference-1.0.0.html` is handled | |||
via [Leafdoc](https://github.com/Leaflet/Leafdoc). This means that next to the | |||
code for every method, option or property there is a special code comment documenting | |||
that feature. In order to edit the API documentation, just edit these comments in the | |||
source code. | |||
In order to generate the documentation, just run | |||
``` | |||
jake docs | |||
``` | |||
and you'll find a `.html` file in the `dist/` directory. | |||
On every release of a new Leaflet version, this file will be generated and copied | |||
over to `docs/reference.html` - there is no need to send pull requests with changes to this file to update the API documentation. | |||
## Code of Conduct | |||
Everyone is invited to participate in the Leaflet community and related projects: | |||
we want to create a welcoming and friendly environment. | |||
Harassment of participants or other unethical and unprofessional behavior will not be tolerated in our spaces. | |||
The [Contributor Covenant](http://contributor-covenant.org/version/1/3/0/) | |||
applies to all projects under the Leaflet organization. | |||
Report any issues to agafonkin@gmail.com. | |||
## Thank You | |||
Not only are we grateful for any contributions, — helping Leaflet and its community actually makes you AWESOME. | |||
Not only does your contribution to Leaflet and its community earn our gratitude, but it also makes you AWESOME. | |||
Join [this approved list of awesome people](https://github.com/Leaflet/Leaflet/graphs/contributors) | |||
and help us push the limits of what's possible with online maps! |
@@ -7,33 +7,52 @@ To use, install Node, then run the following commands in the project root: | |||
npm install | |||
To check the code for errors and build Leaflet from source, run "jake". | |||
To run the tests, run "jake test". | |||
To run the tests, run "jake test". To build the documentation, run "jake docs". | |||
For a custom build, open build/build.html in the browser and follow the instructions. | |||
*/ | |||
var build = require('./build/build.js'); | |||
var build = require('./build/build.js'), | |||
buildDocs = require('./build/docs'), | |||
git = require('git-rev'); | |||
function hint(msg, paths) { | |||
function hint(msg, args) { | |||
return function () { | |||
console.log(msg); | |||
jake.exec('node node_modules/jshint/bin/jshint -c ' + paths, | |||
jake.exec('node node_modules/eslint/bin/eslint.js ' + args, | |||
{printStdout: true}, function () { | |||
console.log('\tCheck passed.\n'); | |||
complete(); | |||
}); | |||
}; | |||
} | |||
// Returns the version string in package.json, plus a semver build metadata if | |||
// this is not an official release | |||
function calculateVersion(officialRelease, callback) { | |||
var version = require('./package.json').version; | |||
if (officialRelease) { | |||
callback(version); | |||
} else { | |||
git.short(function(str) { | |||
callback (version + '+' + str); | |||
}); | |||
} | |||
} | |||
desc('Check Leaflet source for errors with JSHint'); | |||
task('lint', {async: true}, hint('Checking for JS errors...', 'build/hintrc.js src')); | |||
desc('Check Leaflet source for errors with ESLint'); | |||
task('lint', {async: true}, hint('Checking for JS errors...', 'src')); | |||
desc('Check Leaflet specs source for errors with JSHint'); | |||
task('lintspec', {async: true}, hint('Checking for specs JS errors...', 'spec/spec.hintrc.js spec/suites')); | |||
desc('Check Leaflet specs source for errors with ESLint'); | |||
task('lintspec', {async: true}, hint('Checking for specs JS errors...', 'spec/suites')); | |||
desc('Combine and compress Leaflet source files'); | |||
task('build', {async: true}, function () { | |||
build.build(complete); | |||
task('build', {async: true}, function (compsBase32, buildName, officialRelease) { | |||
calculateVersion(officialRelease, function(v){ | |||
build.build(complete, v, compsBase32, buildName); | |||
}); | |||
}); | |||
desc('Run PhantomJS tests'); | |||
@@ -41,6 +60,11 @@ task('test', ['lint', 'lintspec'], {async: true}, function () { | |||
build.test(complete); | |||
}); | |||
desc('Build documentation'); | |||
task('docs', {}, function() { | |||
buildDocs(); | |||
}); | |||
task('default', ['test', 'build']); | |||
jake.addListener('complete', function () { |
@@ -1,4 +1,4 @@ | |||
Copyright (c) 2010-2013, Vladimir Agafonkin | |||
Copyright (c) 2010-2016, Vladimir Agafonkin | |||
Copyright (c) 2010-2011, CloudMade | |||
All rights reserved. | |||
@@ -15,6 +15,9 @@ This guide lists a number of best practices for publishing a Leaflet plugin that | |||
- [File Structure](#file-structure) | |||
- [Code Conventions](#code-conventions) | |||
- [Plugin API](#plugin-api) | |||
3. [Publishing on NPM](#publishing-on-npm) | |||
4. [Module Loaders](#module-loaders) | |||
5. [Adding to the plugins list](#adding-to-the-plugins-list) | |||
## Presentation | |||
@@ -42,7 +45,7 @@ after pushing, it'll be published as `http://<user>.github.io/<repo>`. | |||
### Readme | |||
The next thing you need to have is a descriptive `README.md` in the root of the repo (or a link to a website with a similar content). | |||
The next thing you need to have is a [good `README.md`](https://github.com/noffle/art-of-readme) in the root of the repo (or a link to a website with a similar content). | |||
At a minimum it should contain the following items: | |||
- name of the plugin | |||
@@ -105,13 +108,14 @@ and putting a space after the `function` keyword. | |||
Never expose global variables in your plugin.<br> | |||
If you have a new class, put it directly in the `L` namespace (`L.MyPlugin`).<br> | |||
If you inherit one of the existing classes, make it a sub-property (`L.TileLayer.Banana`).<br> | |||
Every class should have a factory function in camelCase, e.g. (`L.tileLayer.banana`).<br> | |||
If you want to add new methods to existing Leaflet classes, you can do it like this: `L.Marker.include({myPlugin: …})`. | |||
Function, method and property names should be in `camelCase`.<br> | |||
Function, method, property and factory names should be in `camelCase`.<br> | |||
Class names should be in `CapitalizedCamelCase`. | |||
If you have a lot of arguments in your function, consider accepting an options object instead | |||
(putting default values where possible so that users don't need specify all of them): | |||
(putting default values where possible so that users don't need to specify all of them): | |||
```js | |||
// bad | |||
@@ -125,3 +129,93 @@ marker.myPlugin('bla', { | |||
``` | |||
And most importantly, keep it simple. Leaflet is all about *simplicity*. | |||
## Publishing on NPM | |||
NPM (Node Packaged Modules) is a package manager and code repository for JavaScript. Publishing your module on NPM allows other developers to quickly find and install your plugin as well as any other plugins it depends on. | |||
NPM has an excellent [developers guide](https://www.npmjs.org/doc/misc/npm-developers.html) to help you through the process. | |||
When you publish your plugin you should add a dependency on `leaflet` to your `package.json` file. This will automatically install Leaflet when your package is installed. | |||
Here is an example of a `package.json` file for a Leaflet plugin. | |||
```json | |||
{ | |||
"name": "my-leaflet-plugin", | |||
"version": "1.0.0", | |||
"description": "A simple leaflet plugin.", | |||
"main": "my-plugin.js", | |||
"author": "You", | |||
"license": "IST", | |||
"peerDependencies": { | |||
"leaflet": "^1.0.0" | |||
} | |||
} | |||
``` | |||
If possible, do not commit your minified files (e.g. `dist`) to a repo; this can | |||
lead to confussion when trying to debug the wrong file. Instead, use `npm` to | |||
trigger a build/minification just before publishing your package with a | |||
[`prepublish` script](https://docs.npmjs.com/misc/scripts#common-uses), for example: | |||
```json | |||
{ | |||
"name": "my-leaflet-plugin", | |||
... | |||
"scripts": { | |||
"prepublish": "grunt build" | |||
} | |||
} | |||
``` | |||
You can then use the [`.gitignore`](https://help.github.com/articles/ignoring-files/) | |||
file to make sure the minified files are not versioned, and an | |||
[empty `.npmignore`](https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package) | |||
to ensure that they are published to NPM. | |||
## Module Loaders | |||
Module loaders such as [RequireJS](http://requirejs.org/) and [Browserify](http://browserify.org/) implement module systems like AMD (Asynchronous Module Definition) and CommonJS to allow developers to modularize and load their code. | |||
You can add support for AMD/CommonJS loaders to your Leaflet plugin by following this pattern based on the [Universal Module Definition](https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js) | |||
```js | |||
(function (factory, window) { | |||
// define an AMD module that relies on 'leaflet' | |||
if (typeof define === 'function' && define.amd) { | |||
define(['leaflet'], factory); | |||
// define a Common JS module that relies on 'leaflet' | |||
} else if (typeof exports === 'object') { | |||
module.exports = factory(require('leaflet')); | |||
} | |||
// attach your plugin to the global 'L' variable | |||
if (typeof window !== 'undefined' && window.L) { | |||
window.L.YourPlugin = factory(L); | |||
} | |||
}(function (L) { | |||
var MyLeafletPlugin = {}; | |||
// implement your plugin | |||
// return your plugin when you are done | |||
return MyLeafletPlugin; | |||
}, window)); | |||
``` | |||
Now your plugin is available as an AMD and CommonJS module and can used used in module loaders like Browserify and RequireJS. | |||
## Adding to the plugins list | |||
Once your plugin is published, it is a good idea to add it to the [Leaflet plugins list](http://leafletjs.com/plugins.html). To do so: | |||
* [Fork](https://help.github.com/articles/fork-a-repo/) the Leaflet repo. | |||
* In the `docs/plugins.md` file, find the section your plugin should go in, and add a table row with information and links about your plugin. | |||
* Commit the code to your fork. | |||
* [Open a pull request](https://help.github.com/articles/creating-a-pull-request/) from your fork to Leaflet's original repo. | |||
Once the pull request is done, a Leaflet maintainer will have a quick look at your | |||
plugin and, if everything looks right, your plugin will appear in the list shortly thereafter. |
@@ -1,8 +1,7 @@ | |||
<img src="http://leafletjs.com/docs/images/logo.png" alt="Leaflet" /> | |||
<img width="600" src="https://rawgit.com/Leaflet/Leaflet/master/src/images/logo.svg" alt="Leaflet" /> | |||
Leaflet is an open source JavaScript library for **mobile-friendly interactive maps**. | |||
It is developed by [Vladimir Agafonkin][] of [MapBox][] with a team of dedicated [contributors][]. | |||
Weighing just about 30 KB of gzipped JS code, it has all the [features][] most developers ever need for online maps. | |||
Leaflet is the leading open-source JavaScript library for **mobile-friendly interactive maps**. | |||
Weighing just about 37 KB of gzipped JS code, it has all the mapping [features][] most developers ever need. | |||
Leaflet is designed with *simplicity*, *performance* and *usability* in mind. | |||
It works efficiently across all major desktop and mobile platforms out of the box, | |||
@@ -19,11 +18,10 @@ If you want to **get involved** with Leaflet development, check out the [contrib | |||
Let's make the best mapping library that will ever exist, | |||
and push the limits of what's possible with online maps! | |||
[![Build Status](https://travis-ci.org/Leaflet/Leaflet.png?branch=master)](https://travis-ci.org/Leaflet/Leaflet) | |||
[![Build Status](https://travis-ci.org/Leaflet/Leaflet.svg?branch=master)](https://travis-ci.org/Leaflet/Leaflet) | |||
[Vladimir Agafonkin]: http://agafonkin.com/en | |||
[contributors]: https://github.com/Leaflet/Leaflet/graphs/contributors | |||
[features]: http://leafletjs.com/features.html | |||
[features]: http://leafletjs.com/#features | |||
[plugins]: http://leafletjs.com/plugins.html | |||
[well-documented]: http://leafletjs.com/reference.html "Leaflet API reference" | |||
[source code]: https://github.com/Leaflet/Leaflet "Leaflet GitHub repository" | |||
@@ -31,4 +29,4 @@ and push the limits of what's possible with online maps! | |||
[contribute]: https://github.com/Leaflet/Leaflet/blob/master/CONTRIBUTING.md "A guide to contributing to Leaflet" | |||
[official website]: http://leafletjs.com | |||
[download page]: http://leafletjs.com/download.html | |||
[MapBox]: https://mapbox.com | |||
@@ -1,17 +1,12 @@ | |||
{ | |||
"name": "leaflet", | |||
"version": "0.7.7", | |||
"description": "JavaScript library for mobile-friendly interactive maps", | |||
"license": "BSD-2-Clause", | |||
"main": [ | |||
"dist/leaflet.css", | |||
"dist/leaflet-src.js", | |||
"dist/images/layers-2x.png", | |||
"dist/images/layers.png", | |||
"dist/images/marker-icon-2x.png", | |||
"dist/images/marker-icon.png", | |||
"dist/images/marker-shadow.png" | |||
"dist/leaflet-src.js" | |||
], | |||
"ignore": [ | |||
"ignore": [ | |||
".*", | |||
"CHANGELOG.json", | |||
"FAQ.md", |
@@ -1,20 +0,0 @@ | |||
{ | |||
"name": "leaflet", | |||
"version": "0.7.7", | |||
"description": "JavaScript library for mobile-friendly interactive maps", | |||
"scripts": [ | |||
"dist/leaflet.js", | |||
"dist/leaflet-src.js" | |||
], | |||
"images": [ | |||
"dist/images/layers-2x.png", | |||
"dist/images/layers.png", | |||
"dist/images/marker-icon-2x.png", | |||
"dist/images/marker-icon.png", | |||
"dist/images/marker-shadow.png" | |||
], | |||
"styles": [ | |||
"dist/leaflet.css" | |||
], | |||
"main": "dist/leaflet-src.js" | |||
} |
@@ -1,16 +1,12 @@ | |||
/* required styles */ | |||
.leaflet-map-pane, | |||
.leaflet-pane, | |||
.leaflet-tile, | |||
.leaflet-marker-icon, | |||
.leaflet-marker-shadow, | |||
.leaflet-tile-pane, | |||
.leaflet-tile-container, | |||
.leaflet-overlay-pane, | |||
.leaflet-shadow-pane, | |||
.leaflet-marker-pane, | |||
.leaflet-popup-pane, | |||
.leaflet-overlay-pane svg, | |||
.leaflet-pane > svg, | |||
.leaflet-pane > canvas, | |||
.leaflet-zoom-box, | |||
.leaflet-image-layer, | |||
.leaflet-layer { | |||
@@ -20,8 +16,6 @@ | |||
} | |||
.leaflet-container { | |||
overflow: hidden; | |||
-ms-touch-action: none; | |||
touch-action: none; | |||
} | |||
.leaflet-tile, | |||
.leaflet-marker-icon, | |||
@@ -29,20 +23,43 @@ | |||
-webkit-user-select: none; | |||
-moz-user-select: none; | |||
user-select: none; | |||
-webkit-user-drag: none; | |||
-webkit-user-drag: none; | |||
} | |||
/* Safari renders non-retina tile on retina better with this, but Chrome is worse */ | |||
.leaflet-safari .leaflet-tile { | |||
image-rendering: -webkit-optimize-contrast; | |||
} | |||
/* hack that prevents hw layers "stretching" when loading new tiles */ | |||
.leaflet-safari .leaflet-tile-container { | |||
width: 1600px; | |||
height: 1600px; | |||
-webkit-transform-origin: 0 0; | |||
} | |||
.leaflet-marker-icon, | |||
.leaflet-marker-shadow { | |||
display: block; | |||
} | |||
/* map is broken in FF if you have max-width: 100% on tiles */ | |||
.leaflet-container img { | |||
/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ | |||
/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ | |||
.leaflet-container .leaflet-overlay-pane svg, | |||
.leaflet-container .leaflet-marker-pane img, | |||
.leaflet-container .leaflet-shadow-pane img, | |||
.leaflet-container .leaflet-tile-pane img, | |||
.leaflet-container img.leaflet-image-layer { | |||
max-width: none !important; | |||
} | |||
/* stupid Android 2 doesn't understand "max-width: none" properly */ | |||
.leaflet-container img.leaflet-image-layer { | |||
max-width: 15000px !important; | |||
.leaflet-container.leaflet-touch-zoom { | |||
-ms-touch-action: pan-x pan-y; | |||
touch-action: pan-x pan-y; | |||
} | |||
.leaflet-container.leaflet-touch-drag { | |||
-ms-touch-action: pinch-zoom; | |||
} | |||
.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { | |||
-ms-touch-action: none; | |||
touch-action: none; | |||
} | |||
.leaflet-tile { | |||
filter: inherit; | |||
visibility: hidden; | |||
@@ -53,18 +70,26 @@ | |||
.leaflet-zoom-box { | |||
width: 0; | |||
height: 0; | |||
-moz-box-sizing: border-box; | |||
box-sizing: border-box; | |||
z-index: 800; | |||
} | |||
/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ | |||
.leaflet-overlay-pane svg { | |||
-moz-user-select: none; | |||
} | |||
.leaflet-tile-pane { z-index: 2; } | |||
.leaflet-objects-pane { z-index: 3; } | |||
.leaflet-overlay-pane { z-index: 4; } | |||
.leaflet-shadow-pane { z-index: 5; } | |||
.leaflet-marker-pane { z-index: 6; } | |||
.leaflet-popup-pane { z-index: 7; } | |||
.leaflet-pane { z-index: 400; } | |||
.leaflet-tile-pane { z-index: 200; } | |||
.leaflet-overlay-pane { z-index: 400; } | |||
.leaflet-shadow-pane { z-index: 500; } | |||
.leaflet-marker-pane { z-index: 600; } | |||
.leaflet-tooltip-pane { z-index: 650; } | |||
.leaflet-popup-pane { z-index: 700; } | |||
.leaflet-map-pane canvas { z-index: 100; } | |||
.leaflet-map-pane svg { z-index: 200; } | |||
.leaflet-vml-shape { | |||
width: 1px; | |||
@@ -81,7 +106,8 @@ | |||
.leaflet-control { | |||
position: relative; | |||
z-index: 7; | |||
z-index: 800; | |||
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ | |||
pointer-events: auto; | |||
} | |||
.leaflet-top, | |||
@@ -125,7 +151,9 @@ | |||
/* zoom and fade animations */ | |||
.leaflet-fade-anim .leaflet-tile, | |||
.leaflet-fade-anim .leaflet-tile { | |||
will-change: opacity; | |||
} | |||
.leaflet-fade-anim .leaflet-popup { | |||
opacity: 0; | |||
-webkit-transition: opacity 0.2s linear; | |||
@@ -133,11 +161,17 @@ | |||
-o-transition: opacity 0.2s linear; | |||
transition: opacity 0.2s linear; | |||
} | |||
.leaflet-fade-anim .leaflet-tile-loaded, | |||
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { | |||
opacity: 1; | |||
} | |||
.leaflet-zoom-animated { | |||
-webkit-transform-origin: 0 0; | |||
-ms-transform-origin: 0 0; | |||
transform-origin: 0 0; | |||
} | |||
.leaflet-zoom-anim .leaflet-zoom-animated { | |||
will-change: transform; | |||
} | |||
.leaflet-zoom-anim .leaflet-zoom-animated { | |||
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); | |||
-moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); | |||
@@ -145,8 +179,7 @@ | |||
transition: transform 0.25s cubic-bezier(0,0,0.25,1); | |||
} | |||
.leaflet-zoom-anim .leaflet-tile, | |||
.leaflet-pan-anim .leaflet-tile, | |||
.leaflet-touching .leaflet-zoom-animated { | |||
.leaflet-pan-anim .leaflet-tile { | |||
-webkit-transition: none; | |||
-moz-transition: none; | |||
-o-transition: none; | |||
@@ -160,24 +193,44 @@ | |||
/* cursors */ | |||
.leaflet-clickable { | |||
.leaflet-interactive { | |||
cursor: pointer; | |||
} | |||
.leaflet-container { | |||
.leaflet-grab { | |||
cursor: -webkit-grab; | |||
cursor: -moz-grab; | |||
} | |||
.leaflet-crosshair, | |||
.leaflet-crosshair .leaflet-interactive { | |||
cursor: crosshair; | |||
} | |||
.leaflet-popup-pane, | |||
.leaflet-control { | |||
cursor: auto; | |||
} | |||
.leaflet-dragging .leaflet-container, | |||
.leaflet-dragging .leaflet-clickable { | |||
.leaflet-dragging .leaflet-grab, | |||
.leaflet-dragging .leaflet-grab .leaflet-interactive, | |||
.leaflet-dragging .leaflet-marker-draggable { | |||
cursor: move; | |||
cursor: -webkit-grabbing; | |||
cursor: -moz-grabbing; | |||
} | |||
/* marker & overlays interactivity */ | |||
.leaflet-marker-icon, | |||
.leaflet-marker-shadow, | |||
.leaflet-image-layer, | |||
.leaflet-pane > svg path, | |||
.leaflet-tile-container { | |||
pointer-events: none; | |||
} | |||
.leaflet-marker-icon.leaflet-interactive, | |||
.leaflet-image-layer.leaflet-interactive, | |||
.leaflet-pane > svg path.leaflet-interactive { | |||
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ | |||
pointer-events: auto; | |||
} | |||
/* visual tweaks */ | |||
@@ -304,6 +357,10 @@ | |||
color: #333; | |||
background: #fff; | |||
} | |||
.leaflet-control-layers-scrollbar { | |||
overflow-y: scroll; | |||
padding-right: 5px; | |||
} | |||
.leaflet-control-layers-selector { | |||
margin-top: 2px; | |||
position: relative; | |||
@@ -318,6 +375,11 @@ | |||
margin: 5px -10px 5px -6px; | |||
} | |||
/* Default icon URLs */ | |||
.leaflet-default-icon-path { | |||
background-image: url(images/marker-icon.png); | |||
} | |||
/* attribution and scale controls */ | |||
@@ -355,8 +417,8 @@ | |||
font-size: 11px; | |||
white-space: nowrap; | |||
overflow: hidden; | |||
-moz-box-sizing: content-box; | |||
box-sizing: content-box; | |||
-moz-box-sizing: border-box; | |||
box-sizing: border-box; | |||
background: #fff; | |||
background: rgba(255, 255, 255, 0.5); | |||
@@ -387,6 +449,7 @@ | |||
.leaflet-popup { | |||
position: absolute; | |||
text-align: center; | |||
margin-bottom: 20px; | |||
} | |||
.leaflet-popup-content-wrapper { | |||
padding: 1px; | |||
@@ -401,11 +464,13 @@ | |||
margin: 18px 0; | |||
} | |||
.leaflet-popup-tip-container { | |||
margin: 0 auto; | |||
width: 40px; | |||
height: 20px; | |||
position: relative; | |||
position: absolute; | |||
left: 50%; | |||
margin-left: -20px; | |||
overflow: hidden; | |||
pointer-events: none; | |||
} | |||
.leaflet-popup-tip { | |||
width: 17px; | |||
@@ -423,7 +488,7 @@ | |||
.leaflet-popup-content-wrapper, | |||
.leaflet-popup-tip { | |||
background: white; | |||
color: #333; | |||
box-shadow: 0 3px 14px rgba(0,0,0,0.4); | |||
} | |||
.leaflet-container a.leaflet-popup-close-button { | |||
@@ -431,6 +496,7 @@ | |||
top: 0; | |||
right: 0; | |||
padding: 4px 4px 0 0; | |||
border: none; | |||
text-align: center; | |||
width: 18px; | |||
height: 14px; | |||
@@ -477,3 +543,82 @@ | |||
background: #fff; | |||
border: 1px solid #666; | |||
} | |||
/* Tooltip */ | |||
/* Base styles for the element that has a tooltip */ | |||
.leaflet-tooltip { | |||
position: absolute; | |||
padding: 6px; | |||
background-color: #fff; | |||
border: 1px solid #fff; | |||
border-radius: 3px; | |||
color: #222; | |||
white-space: nowrap; | |||
-webkit-user-select: none; | |||
-moz-user-select: none; | |||
-ms-user-select: none; | |||
user-select: none; | |||
pointer-events: none; | |||
box-shadow: 0 1px 3px rgba(0,0,0,0.4); | |||
} | |||
.leaflet-tooltip.leaflet-clickable { | |||
cursor: pointer; | |||
pointer-events: auto; | |||
} | |||
.leaflet-tooltip-top:before, | |||
.leaflet-tooltip-bottom:before, | |||
.leaflet-tooltip-left:before, | |||
.leaflet-tooltip-right:before { | |||
position: absolute; | |||
pointer-events: none; | |||
border: 6px solid transparent; | |||
background: transparent; | |||
content: ""; | |||
} | |||
/* Directions */ | |||
.leaflet-tooltip-bottom { | |||
margin-top: 6px; | |||
} | |||
.leaflet-tooltip-top { | |||
margin-top: -6px; | |||
} | |||
.leaflet-tooltip-bottom:before, | |||
.leaflet-tooltip-top:before { | |||
left: 50%; | |||
margin-left: -6px; | |||
} | |||
.leaflet-tooltip-top:before { | |||
bottom: 0; | |||
margin-bottom: -12px; | |||
border-top-color: #fff; | |||
} | |||
.leaflet-tooltip-bottom:before { | |||
top: 0; | |||
margin-top: -12px; | |||
margin-left: -6px; | |||
border-bottom-color: #fff; | |||
} | |||
.leaflet-tooltip-left { | |||
margin-left: -6px; | |||
} | |||
.leaflet-tooltip-right { | |||
margin-left: 6px; | |||
} | |||
.leaflet-tooltip-left:before, | |||
.leaflet-tooltip-right:before { | |||
top: 50%; | |||
margin-top: -6px; | |||
} | |||
.leaflet-tooltip-left:before { | |||
right: 0; | |||
margin-right: -12px; | |||
border-left-color: #fff; | |||
} | |||
.leaflet-tooltip-right:before { | |||
left: 0; | |||
margin-left: -12px; | |||
border-right-color: #fff; | |||
} |
@@ -1,27 +1,65 @@ | |||
{ | |||
"name": "leaflet", | |||
"version": "0.7.7", | |||
"version": "1.0.3", | |||
"description": "JavaScript library for mobile-friendly interactive maps", | |||
"devDependencies": { | |||
"copyfiles": "^0.2.1", | |||
"happen": "~0.2.0", | |||
"eslint": "^3.5.0 <3.6.0", | |||
"eslint-config-mourner": "^2.0.1", | |||
"git-rev": "^0.2.1", | |||
"happen": "~0.3.1", | |||
"jake": "~8.0.12", | |||
"jshint": "~2.8.0", | |||
"karma": "~0.13.14", | |||
"karma-chrome-launcher": "^0.2.1", | |||
"karma-coverage": "~0.5.3", | |||
"karma-mocha": "~0.2.0", | |||
"karma-phantomjs-launcher": "^0.2.1", | |||
"mocha": "~2.3.3", | |||
"tin": "^0.5.0", | |||
"uglify-js": "~2.5.0" | |||
"karma": "^1.3.0", | |||
"karma-chrome-launcher": "^2.0.0", | |||
"karma-coverage": "~1.1.1", | |||
"karma-firefox-launcher": "~1.0.0", | |||
"karma-mocha": "^1.2.0", | |||
"karma-phantomjs-launcher": "^1.0.2", | |||
"karma-safari-launcher": "~1.0.0", | |||
"leafdoc": "^1.4.1", | |||
"mocha": "^3.1.0", | |||
"phantomjs-prebuilt": "^2.1.12", | |||
"prosthetic-hand": "^1.3.1", | |||
"source-map": "^0.5.6", | |||
"uglify-js": "~2.7.3" | |||
}, | |||
"main": "dist/leaflet-src.js", | |||
"style": "dist/leaflet.css", | |||
"scripts": { | |||
"test": "jake test", | |||
"build": "jake build", | |||
"release": "./build/publish.sh" | |||
}, | |||
"eslintConfig": { | |||
"root": true, | |||
"globals": { | |||
"L": true | |||
}, | |||
"env": { | |||
"commonjs": true, | |||
"amd": true, | |||
"node": false | |||
}, | |||
"extends": "mourner", | |||
"rules": { | |||
"no-mixed-spaces-and-tabs": [ | |||
2, | |||
"smart-tabs" | |||
], | |||
"indent": [ | |||
2, | |||
"tab", | |||
{ | |||
"VariableDeclarator": 0 | |||
} | |||
], | |||
"curly": 2, | |||
"spaced-comment": 2, | |||
"strict": 0, | |||
"wrap-iife": 0, | |||
"key-spacing": 0, | |||
"consistent-return": 0 | |||
} | |||
}, | |||
"repository": { | |||
"type": "git", | |||
"url": "git://github.com/Leaflet/Leaflet.git" | |||
@@ -29,5 +67,6 @@ | |||
"keywords": [ | |||
"gis", | |||
"map" | |||
] | |||
], | |||
"license": "BSD-2-Clause" | |||
} |
@@ -6,6 +6,7 @@ $vendorDir = dirname(dirname(__FILE__)); | |||
$baseDir = dirname($vendorDir); | |||
return array( | |||
'yii\\image\\' => array($vendorDir . '/yurkinx/yii2-image'), | |||
'HTMLPurifier' => array($vendorDir . '/ezyang/htmlpurifier/library'), | |||
'Diff' => array($vendorDir . '/phpspec/php-diff/lib'), | |||
); |
@@ -78,110 +78,6 @@ | |||
}, | |||
"installation-source": "dist" | |||
}, | |||
{ | |||
"name": "yiisoft/yii2-composer", | |||
"version": "2.0.4", | |||
"version_normalized": "2.0.4.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/yiisoft/yii2-composer.git", | |||
"reference": "7452fd908a5023b8bb5ea1b123a174ca080de464" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/7452fd908a5023b8bb5ea1b123a174ca080de464", | |||
"reference": "7452fd908a5023b8bb5ea1b123a174ca080de464", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"composer-plugin-api": "^1.0" | |||
}, | |||
"time": "2016-02-06 00:49:24", | |||
"type": "composer-plugin", | |||
"extra": { | |||
"class": "yii\\composer\\Plugin", | |||
"branch-alias": { | |||
"dev-master": "2.0.x-dev" | |||
} | |||
}, | |||
"installation-source": "dist", | |||
"autoload": { | |||
"psr-4": { | |||
"yii\\composer\\": "" | |||
} | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"BSD-3-Clause" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Qiang Xue", | |||
"email": "qiang.xue@gmail.com" | |||
} | |||
], | |||
"description": "The composer plugin for Yii extension installer", | |||
"keywords": [ | |||
"composer", | |||
"extension installer", | |||
"yii2" | |||
] | |||
}, | |||
{ | |||
"name": "swiftmailer/swiftmailer", | |||
"version": "v5.4.3", | |||
"version_normalized": "5.4.3.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/swiftmailer/swiftmailer.git", | |||
"reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/4cc92842069c2bbc1f28daaaf1d2576ec4dfe153", | |||
"reference": "4cc92842069c2bbc1f28daaaf1d2576ec4dfe153", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"php": ">=5.3.3" | |||
}, | |||
"require-dev": { | |||
"mockery/mockery": "~0.9.1" | |||
}, | |||
"time": "2016-07-08 11:51:25", | |||
"type": "library", | |||
"extra": { | |||
"branch-alias": { | |||
"dev-master": "5.4-dev" | |||
} | |||
}, | |||
"installation-source": "dist", | |||
"autoload": { | |||
"files": [ | |||
"lib/swift_required.php" | |||
] | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"MIT" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Chris Corbyn" | |||
}, | |||
{ | |||
"name": "Fabien Potencier", | |||
"email": "fabien@symfony.com" | |||
} | |||
], | |||
"description": "Swiftmailer, free feature-rich PHP mailer", | |||
"homepage": "http://swiftmailer.org", | |||
"keywords": [ | |||
"email", | |||
"mail", | |||
"mailer" | |||
] | |||
}, | |||
{ | |||
"name": "bower-asset/jquery", | |||
"version": "2.2.4", | |||
@@ -702,55 +598,6 @@ | |||
"yii2" | |||
] | |||
}, | |||
{ | |||
"name": "yiisoft/yii2-debug", | |||
"version": "2.0.6", | |||
"version_normalized": "2.0.6.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/yiisoft/yii2-debug.git", | |||
"reference": "55ed2e853ed8050a34415f63a4da84f88a56f895" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/55ed2e853ed8050a34415f63a4da84f88a56f895", | |||
"reference": "55ed2e853ed8050a34415f63a4da84f88a56f895", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"yiisoft/yii2": ">=2.0.4", | |||
"yiisoft/yii2-bootstrap": "*" | |||
}, | |||
"time": "2016-03-17 03:50:19", | |||
"type": "yii2-extension", | |||
"extra": { | |||
"branch-alias": { | |||
"dev-master": "2.0.x-dev" | |||
} | |||
}, | |||
"installation-source": "dist", | |||
"autoload": { | |||
"psr-4": { | |||
"yii\\debug\\": "" | |||
} | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"BSD-3-Clause" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Qiang Xue", | |||
"email": "qiang.xue@gmail.com" | |||
} | |||
], | |||
"description": "The debugger extension for the Yii framework", | |||
"keywords": [ | |||
"debug", | |||
"debugger", | |||
"yii2" | |||
] | |||
}, | |||
{ | |||
"name": "bower-asset/typeahead.js", | |||
"version": "v0.11.1", | |||
@@ -925,107 +772,6 @@ | |||
"fixtures" | |||
] | |||
}, | |||
{ | |||
"name": "bower-asset/leaflet", | |||
"version": "v0.7.7", | |||
"version_normalized": "0.7.7.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/Leaflet/Leaflet.git", | |||
"reference": "197f9d43b7bbc73c0492bf62cd666a5a98038098" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/Leaflet/Leaflet/zipball/197f9d43b7bbc73c0492bf62cd666a5a98038098", | |||
"reference": "197f9d43b7bbc73c0492bf62cd666a5a98038098", | |||
"shasum": "" | |||
}, | |||
"type": "bower-asset-library", | |||
"extra": { | |||
"bower-asset-main": [ | |||
"dist/leaflet.css", | |||
"dist/leaflet-src.js", | |||
"dist/images/layers-2x.png", | |||
"dist/images/layers.png", | |||
"dist/images/marker-icon-2x.png", | |||
"dist/images/marker-icon.png", | |||
"dist/images/marker-shadow.png" | |||
], | |||
"bower-asset-ignore": [ | |||
".*", | |||
"CHANGELOG.json", | |||
"FAQ.md", | |||
"debug", | |||
"spec", | |||
"src", | |||
"build" | |||
] | |||
}, | |||
"installation-source": "dist", | |||
"description": "JavaScript library for mobile-friendly interactive maps" | |||
}, | |||
{ | |||
"name": "2amigos/yii2-leaflet-extension", | |||
"version": "1.0.2", | |||
"version_normalized": "1.0.2.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/2amigos/yii2-leaflet-extension.git", | |||
"reference": "05ac1496b0b7a5c7bdeec110a02f0e36d0a91e88" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/2amigos/yii2-leaflet-extension/zipball/05ac1496b0b7a5c7bdeec110a02f0e36d0a91e88", | |||
"reference": "05ac1496b0b7a5c7bdeec110a02f0e36d0a91e88", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"bower-asset/leaflet": "0.7.*@stable", | |||
"yiisoft/yii2": "~2.0.0" | |||
}, | |||
"require-dev": { | |||
"phpunit/phpunit": "4.*" | |||
}, | |||
"time": "2016-02-05 23:47:38", | |||
"type": "yii2-extension", | |||
"extra": { | |||
"branch-alias": { | |||
"dev-master": "1.0-dev" | |||
}, | |||
"asset-installer-paths": { | |||
"bower-asset-library": "vendor/bower" | |||
} | |||
}, | |||
"installation-source": "dist", | |||
"autoload": { | |||
"psr-4": { | |||
"dosamigos\\leaflet\\": "src" | |||
} | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"BSD-3-Clause" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "2amigOS! Consulting Group", | |||
"email": "hola@2amigos.us", | |||
"homepage": "http://2amigos.us", | |||
"role": "Developer" | |||
} | |||
], | |||
"description": "LeafLet Mobile-Friendly Interactive Maps Extension Library for Yii2.", | |||
"homepage": "http://yiiwheels.com/extension/leaflet-extension-library", | |||
"keywords": [ | |||
"2amigos", | |||
"extension", | |||
"leaflet", | |||
"maps", | |||
"widget", | |||
"yii", | |||
"yii2" | |||
] | |||
}, | |||
{ | |||
"name": "setasign/fpdi", | |||
"version": "1.6.1", | |||
@@ -1078,96 +824,43 @@ | |||
] | |||
}, | |||
{ | |||
"name": "mpdf/mpdf", | |||
"version": "v6.1.2", | |||
"version_normalized": "6.1.2.0", | |||
"name": "yiisoft/yii2", | |||
"version": "2.0.10", | |||
"version_normalized": "2.0.10.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/mpdf/mpdf.git", | |||
"reference": "da078bc2669d3f98553ac41f920ead4c17c951ad" | |||
"url": "https://github.com/yiisoft/yii2-framework.git", | |||
"reference": "5bfcb7a6dfa9771e2248eb8c4448613330f343ff" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/mpdf/mpdf/zipball/da078bc2669d3f98553ac41f920ead4c17c951ad", | |||
"reference": "da078bc2669d3f98553ac41f920ead4c17c951ad", | |||
"url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/5bfcb7a6dfa9771e2248eb8c4448613330f343ff", | |||
"reference": "5bfcb7a6dfa9771e2248eb8c4448613330f343ff", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", | |||
"bower-asset/jquery.inputmask": "~3.2.2", | |||
"bower-asset/punycode": "1.3.*", | |||
"bower-asset/yii2-pjax": "~2.0.1", | |||
"cebe/markdown": "~1.0.0 | ~1.1.0", | |||
"ext-ctype": "*", | |||
"ext-mbstring": "*", | |||
"ezyang/htmlpurifier": "~4.6", | |||
"lib-pcre": "*", | |||
"php": ">=5.4.0", | |||
"setasign/fpdi": "1.6.*" | |||
}, | |||
"require-dev": { | |||
"phpunit/phpunit": "^4.7" | |||
}, | |||
"suggest": { | |||
"ext-zlib": "Needed for compression of embedded resources, such as fonts" | |||
"yiisoft/yii2-composer": "~2.0.4" | |||
}, | |||
"time": "2016-07-20 12:31:58", | |||
"time": "2016-10-20 12:02:50", | |||
"bin": [ | |||
"yii" | |||
], | |||
"type": "library", | |||
"installation-source": "dist", | |||
"autoload": { | |||
"classmap": [ | |||
"mpdf.php", | |||
"classes" | |||
] | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"GPL-2.0" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Ian Back", | |||
"role": "Developer" | |||
} | |||
], | |||
"description": "A PHP class to generate PDF files from HTML with Unicode/UTF-8 and CJK support", | |||
"homepage": "http://mpdf.github.io", | |||
"keywords": [ | |||
"pdf", | |||
"php", | |||
"utf-8" | |||
] | |||
}, | |||
{ | |||
"name": "yiisoft/yii2", | |||
"version": "2.0.10", | |||
"version_normalized": "2.0.10.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/yiisoft/yii2-framework.git", | |||
"reference": "5bfcb7a6dfa9771e2248eb8c4448613330f343ff" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/5bfcb7a6dfa9771e2248eb8c4448613330f343ff", | |||
"reference": "5bfcb7a6dfa9771e2248eb8c4448613330f343ff", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", | |||
"bower-asset/jquery.inputmask": "~3.2.2", | |||
"bower-asset/punycode": "1.3.*", | |||
"bower-asset/yii2-pjax": "~2.0.1", | |||
"cebe/markdown": "~1.0.0 | ~1.1.0", | |||
"ext-ctype": "*", | |||
"ext-mbstring": "*", | |||
"ezyang/htmlpurifier": "~4.6", | |||
"lib-pcre": "*", | |||
"php": ">=5.4.0", | |||
"yiisoft/yii2-composer": "~2.0.4" | |||
}, | |||
"time": "2016-10-20 12:02:50", | |||
"bin": [ | |||
"yii" | |||
], | |||
"type": "library", | |||
"extra": { | |||
"branch-alias": { | |||
"dev-master": "2.0.x-dev" | |||
} | |||
}, | |||
"extra": { | |||
"branch-alias": { | |||
"dev-master": "2.0.x-dev" | |||
} | |||
}, | |||
"installation-source": "dist", | |||
"autoload": { | |||
"psr-4": { | |||
@@ -1227,97 +920,451 @@ | |||
] | |||
}, | |||
{ | |||
"name": "kartik-v/yii2-mpdf", | |||
"name": "c006/yii2-paypal-ipn", | |||
"version": "dev-master", | |||
"version_normalized": "9999999-dev", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/kartik-v/yii2-mpdf.git", | |||
"reference": "94de4fd901036bb086bf86e10509649345b462a0" | |||
"url": "https://github.com/c006/yii2-paypal-ipn.git", | |||
"reference": "992cb6fc6b2beeb8dd61095a7ead7276de328686" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/c006/yii2-paypal-ipn/zipball/992cb6fc6b2beeb8dd61095a7ead7276de328686", | |||
"reference": "992cb6fc6b2beeb8dd61095a7ead7276de328686", | |||
"shasum": "" | |||
}, | |||
"time": "2015-08-08 18:07:32", | |||
"type": "yii2-extension", | |||
"installation-source": "source", | |||
"autoload": { | |||
"psr-4": { | |||
"c006\\paypal_ipn\\": "" | |||
} | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"MIT" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Jon Chambers", | |||
"email": "jchambers.dev@gmail.com" | |||
} | |||
], | |||
"description": "This is a simple PayPal IPN listener, no other files required.", | |||
"keywords": [ | |||
"extension", | |||
"ipn", | |||
"paypal", | |||
"yii2" | |||
] | |||
}, | |||
{ | |||
"name": "yiisoft/yii2-composer", | |||
"version": "2.0.5", | |||
"version_normalized": "2.0.5.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/yiisoft/yii2-composer.git", | |||
"reference": "3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/kartik-v/yii2-mpdf/zipball/94de4fd901036bb086bf86e10509649345b462a0", | |||
"reference": "94de4fd901036bb086bf86e10509649345b462a0", | |||
"url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2", | |||
"reference": "3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"mpdf/mpdf": "<7.0" | |||
"composer-plugin-api": "^1.0" | |||
}, | |||
"require-dev": { | |||
"composer/composer": "^1.0" | |||
}, | |||
"time": "2016-12-20 13:26:02", | |||
"type": "composer-plugin", | |||
"extra": { | |||
"class": "yii\\composer\\Plugin", | |||
"branch-alias": { | |||
"dev-master": "2.0.x-dev" | |||
} | |||
}, | |||
"installation-source": "dist", | |||
"autoload": { | |||
"psr-4": { | |||
"yii\\composer\\": "" | |||
} | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"BSD-3-Clause" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Qiang Xue", | |||
"email": "qiang.xue@gmail.com" | |||
} | |||
], | |||
"description": "The composer plugin for Yii extension installer", | |||
"keywords": [ | |||
"composer", | |||
"extension installer", | |||
"yii2" | |||
] | |||
}, | |||
{ | |||
"name": "bower-asset/leaflet", | |||
"version": "v1.0.3", | |||
"version_normalized": "1.0.3.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/Leaflet/Leaflet.git", | |||
"reference": "ed36a04aefd12cb92c78074fe63a8e460db1d464" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/Leaflet/Leaflet/zipball/ed36a04aefd12cb92c78074fe63a8e460db1d464", | |||
"reference": "ed36a04aefd12cb92c78074fe63a8e460db1d464", | |||
"shasum": "" | |||
}, | |||
"type": "bower-asset-library", | |||
"extra": { | |||
"bower-asset-main": [ | |||
"dist/leaflet.css", | |||
"dist/leaflet-src.js" | |||
], | |||
"bower-asset-ignore": [ | |||
".*", | |||
"CHANGELOG.json", | |||
"FAQ.md", | |||
"debug", | |||
"spec", | |||
"src", | |||
"build" | |||
] | |||
}, | |||
"installation-source": "dist", | |||
"license": [ | |||
"BSD-2-Clause" | |||
], | |||
"description": "JavaScript library for mobile-friendly interactive maps" | |||
}, | |||
{ | |||
"name": "2amigos/yii2-leaflet-extension", | |||
"version": "1.0.3", | |||
"version_normalized": "1.0.3.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/2amigos/yii2-leaflet-extension.git", | |||
"reference": "acaea5a6c33db1e4d9dbed040d7ad87c915928d4" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/2amigos/yii2-leaflet-extension/zipball/acaea5a6c33db1e4d9dbed040d7ad87c915928d4", | |||
"reference": "acaea5a6c33db1e4d9dbed040d7ad87c915928d4", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"bower-asset/leaflet": "^1.0", | |||
"yiisoft/yii2": "^2.0" | |||
}, | |||
"require-dev": { | |||
"phpunit/phpunit": "4.*" | |||
}, | |||
"time": "2016-11-03 17:25:48", | |||
"time": "2016-12-06 14:54:20", | |||
"type": "yii2-extension", | |||
"extra": { | |||
"branch-alias": { | |||
"dev-master": "1.0.x-dev" | |||
"dev-master": "1.0-dev" | |||
}, | |||
"asset-installer-paths": { | |||
"bower-asset-library": "vendor/bower" | |||
} | |||
}, | |||
"installation-source": "source", | |||
"installation-source": "dist", | |||
"autoload": { | |||
"psr-4": { | |||
"kartik\\mpdf\\": "" | |||
"dosamigos\\leaflet\\": "src" | |||
} | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"BSD 3-Clause" | |||
"BSD-3-Clause" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Kartik Visweswaran", | |||
"email": "kartikv2@gmail.com", | |||
"homepage": "http://www.krajee.com/" | |||
"name": "2amigOS! Consulting Group", | |||
"email": "hola@2amigos.us", | |||
"homepage": "http://2amigos.us", | |||
"role": "Developer" | |||
} | |||
], | |||
"description": "A Yii2 wrapper component for the mPDF library which generates PDF files from UTF-8 encoded HTML.", | |||
"homepage": "https://github.com/kartik-v/yii2-mpdf", | |||
"description": "LeafLet Mobile-Friendly Interactive Maps Extension Library for Yii2.", | |||
"homepage": "http://yiiwheels.com/extension/leaflet-extension-library", | |||
"keywords": [ | |||
"component", | |||
"2amigos", | |||
"extension", | |||
"html", | |||
"mpdf", | |||
"leaflet", | |||
"maps", | |||
"widget", | |||
"yii", | |||
"yii2" | |||
] | |||
}, | |||
{ | |||
"name": "yiisoft/yii2-debug", | |||
"version": "2.0.7", | |||
"version_normalized": "2.0.7.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/yiisoft/yii2-debug.git", | |||
"reference": "a74a2433ad1dfda30a253a92f6db52c131807432" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/a74a2433ad1dfda30a253a92f6db52c131807432", | |||
"reference": "a74a2433ad1dfda30a253a92f6db52c131807432", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"yiisoft/yii2": "~2.0.4", | |||
"yiisoft/yii2-bootstrap": "~2.0.0" | |||
}, | |||
"time": "2016-11-24 09:42:29", | |||
"type": "yii2-extension", | |||
"extra": { | |||
"branch-alias": { | |||
"dev-master": "2.0.x-dev" | |||
} | |||
}, | |||
"installation-source": "dist", | |||
"autoload": { | |||
"psr-4": { | |||
"yii\\debug\\": "" | |||
} | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"BSD-3-Clause" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Qiang Xue", | |||
"email": "qiang.xue@gmail.com" | |||
} | |||
], | |||
"description": "The debugger extension for the Yii framework", | |||
"keywords": [ | |||
"debug", | |||
"debugger", | |||
"yii2" | |||
] | |||
}, | |||
{ | |||
"name": "swiftmailer/swiftmailer", | |||
"version": "v5.4.5", | |||
"version_normalized": "5.4.5.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/swiftmailer/swiftmailer.git", | |||
"reference": "cd142238a339459b10da3d8234220963f392540c" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/cd142238a339459b10da3d8234220963f392540c", | |||
"reference": "cd142238a339459b10da3d8234220963f392540c", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"php": ">=5.3.3" | |||
}, | |||
"require-dev": { | |||
"mockery/mockery": "~0.9.1", | |||
"symfony/phpunit-bridge": "~3.2" | |||
}, | |||
"time": "2016-12-29 10:02:40", | |||
"type": "library", | |||
"extra": { | |||
"branch-alias": { | |||
"dev-master": "5.4-dev" | |||
} | |||
}, | |||
"installation-source": "dist", | |||
"autoload": { | |||
"files": [ | |||
"lib/swift_required.php" | |||
] | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"MIT" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Chris Corbyn" | |||
}, | |||
{ | |||
"name": "Fabien Potencier", | |||
"email": "fabien@symfony.com" | |||
} | |||
], | |||
"description": "Swiftmailer, free feature-rich PHP mailer", | |||
"homepage": "http://swiftmailer.org", | |||
"keywords": [ | |||
"email", | |||
"mail", | |||
"mailer" | |||
] | |||
}, | |||
{ | |||
"name": "mpdf/mpdf", | |||
"version": "v6.1.3", | |||
"version_normalized": "6.1.3.0", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/mpdf/mpdf.git", | |||
"reference": "7f138bf7508eac895ac2c13d2509b056ac7e7e97" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/mpdf/mpdf/zipball/7f138bf7508eac895ac2c13d2509b056ac7e7e97", | |||
"reference": "7f138bf7508eac895ac2c13d2509b056ac7e7e97", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"ext-mbstring": "*", | |||
"php": ">=5.4.0", | |||
"setasign/fpdi": "1.6.*" | |||
}, | |||
"require-dev": { | |||
"phpunit/phpunit": "^4.7" | |||
}, | |||
"suggest": { | |||
"ext-zlib": "Needed for compression of embedded resources, such as fonts" | |||
}, | |||
"time": "2016-12-12 10:42:18", | |||
"type": "library", | |||
"installation-source": "dist", | |||
"autoload": { | |||
"classmap": [ | |||
"mpdf.php", | |||
"classes" | |||
] | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"GPL-2.0" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Ian Back", | |||
"role": "Developer" | |||
} | |||
], | |||
"description": "A PHP class to generate PDF files from HTML with Unicode/UTF-8 and CJK support", | |||
"homepage": "http://mpdf.github.io", | |||
"keywords": [ | |||
"pdf", | |||
"utf8", | |||
"php", | |||
"utf-8" | |||
] | |||
}, | |||
{ | |||
"name": "yurkinx/yii2-image", | |||
"version": "dev-master", | |||
"version_normalized": "9999999-dev", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/yurkinx/yii2-image.git", | |||
"reference": "2737b1ef4cefbc4c664892c6b9f29847fcf72c56" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/yurkinx/yii2-image/zipball/2737b1ef4cefbc4c664892c6b9f29847fcf72c56", | |||
"reference": "2737b1ef4cefbc4c664892c6b9f29847fcf72c56", | |||
"shasum": "" | |||
}, | |||
"require": { | |||
"php": ">=5.4.0", | |||
"yiisoft/yii2": "*" | |||
}, | |||
"time": "2016-12-08 19:34:11", | |||
"type": "yii2-extension", | |||
"installation-source": "source", | |||
"autoload": { | |||
"psr-0": { | |||
"yii\\image\\": "" | |||
} | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"BSD-3-Clause" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Yuri Kileev", | |||
"email": "kileev@gmail.com" | |||
} | |||
], | |||
"description": "Yii2 extension for image manipulating using Kohana Image Library.", | |||
"homepage": "https://github.com/yurkinx/yii2-image", | |||
"keywords": [ | |||
"extension", | |||
"image", | |||
"yii2" | |||
] | |||
}, | |||
{ | |||
"name": "c006/yii2-paypal-ipn", | |||
"name": "kartik-v/yii2-mpdf", | |||
"version": "dev-master", | |||
"version_normalized": "9999999-dev", | |||
"source": { | |||
"type": "git", | |||
"url": "https://github.com/c006/yii2-paypal-ipn.git", | |||
"reference": "992cb6fc6b2beeb8dd61095a7ead7276de328686" | |||
"url": "https://github.com/kartik-v/yii2-mpdf.git", | |||
"reference": "17fda1cb084c58fee6014026d35af5faf73316ef" | |||
}, | |||
"dist": { | |||
"type": "zip", | |||
"url": "https://api.github.com/repos/c006/yii2-paypal-ipn/zipball/992cb6fc6b2beeb8dd61095a7ead7276de328686", | |||
"reference": "992cb6fc6b2beeb8dd61095a7ead7276de328686", | |||
"url": "https://api.github.com/repos/kartik-v/yii2-mpdf/zipball/17fda1cb084c58fee6014026d35af5faf73316ef", | |||
"reference": "17fda1cb084c58fee6014026d35af5faf73316ef", | |||
"shasum": "" | |||
}, | |||
"time": "2015-08-08 18:07:32", | |||
"require": { | |||
"mpdf/mpdf": "<7.0" | |||
}, | |||
"time": "2017-01-14 11:51:12", | |||
"type": "yii2-extension", | |||
"extra": { | |||
"branch-alias": { | |||
"dev-master": "1.0.x-dev" | |||
} | |||
}, | |||
"installation-source": "source", | |||
"autoload": { | |||
"psr-4": { | |||
"c006\\paypal_ipn\\": "" | |||
"kartik\\mpdf\\": "" | |||
} | |||
}, | |||
"notification-url": "https://packagist.org/downloads/", | |||
"license": [ | |||
"MIT" | |||
"BSD 3-Clause" | |||
], | |||
"authors": [ | |||
{ | |||
"name": "Jon Chambers", | |||
"email": "jchambers.dev@gmail.com" | |||
"name": "Kartik Visweswaran", | |||
"email": "kartikv2@gmail.com", | |||
"homepage": "http://www.krajee.com/" | |||
} | |||
], | |||
"description": "This is a simple PayPal IPN listener, no other files required.", | |||
"description": "A Yii2 wrapper component for the mPDF library which generates PDF files from UTF-8 encoded HTML.", | |||
"homepage": "https://github.com/kartik-v/yii2-mpdf", | |||
"keywords": [ | |||
"component", | |||
"extension", | |||
"ipn", | |||
"paypal", | |||
"html", | |||
"mpdf", | |||
"pdf", | |||
"utf8", | |||
"yii2" | |||
] | |||
} |
@@ -1 +1 @@ | |||
Subproject commit 94de4fd901036bb086bf86e10509649345b462a0 | |||
Subproject commit 17fda1cb084c58fee6014026d35af5faf73316ef |
@@ -1 +1,2 @@ | |||
vendor/* | |||
composer.lock |
@@ -1293,6 +1293,7 @@ class cssmgr | |||
{ | |||
$p = array(); | |||
$zp = array(); | |||
if (empty($attr)) $attr = array(); | |||
$classes = array(); | |||
if (isset($attr['CLASS'])) { |
@@ -81,15 +81,6 @@ $this->fonttrans = array( | |||
*/ | |||
$this->fontdata = array( | |||
"comfortaaregular" => array( | |||
"R" => "comfortaa-regular-webfont.ttf", | |||
), | |||
"comfortaalight" => array( | |||
"R" => "comfortaa-light-webfont.ttf", | |||
), | |||
"myriadpro-regular" => array( | |||
"R" => "myriadpro-regular.ttf", | |||
), | |||
"dejavusanscondensed" => array( | |||
'R' => "DejaVuSansCondensed.ttf", | |||
'B' => "DejaVuSansCondensed-Bold.ttf", |
@@ -1,3 +1,4 @@ | |||
/tests/acceptance.conf.php | |||
/tests/smoke.conf.php | |||
/build/* | |||
/vendor/ |
@@ -1,6 +1,17 @@ | |||
Changelog | |||
========= | |||
5.4.5 (2016-XX-XX) | |||
------------------ | |||
* fixed CVE-2016-10033 and CVE-2016-10045 | |||
* deprecated the mail transport | |||
5.4.4 (2016-11-23) | |||
------------------ | |||
* reverted escaping command-line args to mail (PHP mail() function already does it) | |||
5.4.3 (2016-07-08) | |||
------------------ | |||
@@ -23,7 +34,7 @@ Changelog | |||
* added return-path header to the ignoredHeaders list of DKIMSigner | |||
* fixed crlf for subject using mail | |||
* fixed add soft line break only when necessary | |||
* fixed escaping command-line args to Sendmail | |||
* fixed escaping command-line args to mail | |||
5.4.1 (2015-06-06) | |||
------------------ |
@@ -1 +1 @@ | |||
Swift-5.4.3 | |||
Swift-5.4.5-DEV |
@@ -18,7 +18,8 @@ | |||
"php": ">=5.3.3" | |||
}, | |||
"require-dev": { | |||
"mockery/mockery": "~0.9.1" | |||
"mockery/mockery": "~0.9.1", | |||
"symfony/phpunit-bridge": "~3.2" | |||
}, | |||
"autoload": { | |||
"files": ["lib/swift_required.php"] |
@@ -1038,13 +1038,14 @@ priority will not change the way your email is sent -- it is purely an | |||
indicative setting for the recipient. | |||
The priority of a message is an indication to the recipient what significance | |||
it has. Swift Mailer allows you to set the priority by calling the ``setPriority`` method. This method takes an integer value between 1 and 5: | |||
it has. Swift Mailer allows you to set the priority by calling the | |||
``setPriority`` method. This method takes an integer value between 1 and 5: | |||
* Highest | |||
* High | |||
* Normal | |||
* Low | |||
* Lowest | |||
* `Swift_Mime_SimpleMessage::PRIORITY_HIGHEST`: 1 | |||
* `Swift_Mime_SimpleMessage::PRIORITY_HIGH`: 2 | |||
* `Swift_Mime_SimpleMessage::PRIORITY_NORMAL`: 3 | |||
* `Swift_Mime_SimpleMessage::PRIORITY_LOW`: 4 | |||
* `Swift_Mime_SimpleMessage::PRIORITY_LOWEST`: 5 | |||
To set the message priority: | |||
@@ -1055,3 +1056,6 @@ To set the message priority: | |||
// Indicate "High" priority | |||
$message->setPriority(2); | |||
// Or use the constant to be more explicit | |||
$message->setPriority(Swift_Mime_SimpleMessage::PRIORITY_HIGH); |
@@ -84,8 +84,6 @@ use for your environment. | |||
+---------------------------------+---------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ | |||
| ``Swift_SendmailTransport`` | Communicates with a locally installed ``sendmail`` executable (Linux/UNIX) | Quick time-to-run; Provides less-accurate feedback than SMTP; Requires ``sendmail`` installation | | |||
+---------------------------------+---------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ | |||
| ``Swift_MailTransport`` | Uses PHP's built-in ``mail()`` function | Very portable; Potentially unpredictable results; Provides extremely weak feedback | | |||
+---------------------------------+---------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ | |||
| ``Swift_LoadBalancedTransport`` | Cycles through a collection of the other Transports to manage load-reduction | Provides graceful fallback if one Transport fails (e.g. an SMTP server is down); Keeps the load on remote services down by spreading the work | | |||
+---------------------------------+---------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------+ | |||
| ``Swift_FailoverTransport`` | Works in conjunction with a collection of the other Transports to provide high-availability | Provides graceful fallback if one Transport fails (e.g. an SMTP server is down) | |
@@ -10,7 +10,7 @@ create the Mailer, then you use the Mailer to send the message. | |||
To send a Message: | |||
* Create a Transport from one of the provided Transports -- | |||
``Swift_SmtpTransport``, ``Swift_SendmailTransport``, ``Swift_MailTransport`` | |||
``Swift_SmtpTransport``, ``Swift_SendmailTransport`` | |||
or one of the aggregate Transports. | |||
* Create an instance of the ``Swift_Mailer`` class, using the Transport as | |||
@@ -46,13 +46,10 @@ recipients are delivered to successfully then the value 5 will be returned. | |||
; | |||
/* | |||
You could alternatively use a different transport such as Sendmail or Mail: | |||
You could alternatively use a different transport such as Sendmail: | |||
// Sendmail | |||
$transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs'); | |||
$transport = Swift_MailTransport::newInstance(); | |||
*/ | |||
// Create the Mailer using your created Transport | |||
@@ -350,39 +347,6 @@ Serious drawbacks when using this Transport are: | |||
It's a last resort, and we say that with a passion! | |||
Using the Mail Transport | |||
^^^^^^^^^^^^^^^^^^^^^^^^ | |||
To use the Mail Transport you simply need to call | |||
``Swift_MailTransport::newInstance()``. It's unlikely you'll need to configure | |||
the Transport. | |||
To use the Mail Transport: | |||
* Call ``Swift_MailTransport::newInstance()``. | |||
* Use the returned object to create the Mailer. | |||
Messages will be sent using the ``mail()`` function. | |||
.. note:: | |||
The ``mail()`` function can take a ``$additional_parameters`` parameter. | |||
Swift Mailer sets this to "``-f%s``" by default, where the "``%s``" is | |||
substituted with the address of the sender (via a ``sprintf()``) at send | |||
time. You may override this default by passing an argument to | |||
``newInstance()``. | |||
.. code-block:: php | |||
require_once 'lib/swift_required.php'; | |||
// Create the Transport | |||
$transport = Swift_MailTransport::newInstance(); | |||
// Create the Mailer using your created Transport | |||
$mailer = Swift_Mailer::newInstance($transport); | |||
Available Methods for Sending Messages | |||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |||
@@ -414,7 +378,7 @@ To send a Message with ``send()``: | |||
* Create a Transport from one of the provided Transports -- | |||
``Swift_SmtpTransport``, ``Swift_SendmailTransport``, | |||
``Swift_MailTransport`` or one of the aggregate Transports. | |||
or one of the aggregate Transports. | |||
* Create an instance of the ``Swift_Mailer`` class, using the Transport as | |||
it's constructor parameter. | |||
@@ -474,7 +438,7 @@ own address shows up in the ``To:`` field, follow the following recipe: | |||
* Create a Transport from one of the provided Transports -- | |||
``Swift_SmtpTransport``, ``Swift_SendmailTransport``, | |||
``Swift_MailTransport`` or one of the aggregate Transports. | |||
or one of the aggregate Transports. | |||
* Create an instance of the ``Swift_Mailer`` class, using the Transport as | |||
it's constructor parameter. |
@@ -12,6 +12,8 @@ | |||
* Sends Messages using the mail() function. | |||
* | |||
* @author Chris Corbyn | |||
* | |||
* @deprecated since 5.4.5 (to be removed in 6.0) | |||
*/ | |||
class Swift_MailTransport extends Swift_Transport_MailTransport | |||
{ |
@@ -68,7 +68,7 @@ class Swift_Message extends Swift_Mime_SimpleMessage | |||
* @param string $contentType | |||
* @param string $charset | |||
* | |||
* @return Swift_Message | |||
* @return $this | |||
*/ | |||
public static function newInstance($subject = null, $body = null, $contentType = null, $charset = null) | |||
{ | |||
@@ -82,7 +82,7 @@ class Swift_Message extends Swift_Mime_SimpleMessage | |||
* @param string $contentType | |||
* @param string $charset | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function addPart($body, $contentType = null, $charset = null) | |||
{ | |||
@@ -92,11 +92,11 @@ class Swift_Message extends Swift_Mime_SimpleMessage | |||
} | |||
/** | |||
* Attach a new signature handler to the message. | |||
* Detach a signature handler from a message. | |||
* | |||
* @param Swift_Signer $signer | |||
* | |||
* @return Swift_Message | |||
* @return $this | |||
*/ | |||
public function attachSigner(Swift_Signer $signer) | |||
{ | |||
@@ -114,7 +114,7 @@ class Swift_Message extends Swift_Mime_SimpleMessage | |||
* | |||
* @param Swift_Signer $signer | |||
* | |||
* @return Swift_Message | |||
* @return $this | |||
*/ | |||
public function detachSigner(Swift_Signer $signer) | |||
{ | |||
@@ -281,11 +281,11 @@ class Swift_Message extends Swift_Mime_SimpleMessage | |||
{ | |||
parent::__clone(); | |||
foreach ($this->bodySigners as $key => $bodySigner) { | |||
$this->bodySigners[$key] = clone($bodySigner); | |||
$this->bodySigners[$key] = clone $bodySigner; | |||
} | |||
foreach ($this->headerSigners as $key => $headerSigner) { | |||
$this->headerSigners[$key] = clone($headerSigner); | |||
$this->headerSigners[$key] = clone $headerSigner; | |||
} | |||
} | |||
} |
@@ -298,7 +298,7 @@ class Swift_Mime_Headers_MailboxHeader extends Swift_Mime_Headers_AbstractHeader | |||
* Redefine the encoding requirements for mailboxes. | |||
* | |||
* All "specials" must be encoded as the full header value will not be quoted | |||
* | |||
* | |||
* @see RFC 2822 3.2.1 | |||
* | |||
* @param string $token |
@@ -30,11 +30,7 @@ class Swift_Mime_Headers_OpenDKIMHeader implements Swift_Mime_Header | |||
private $_fieldName; | |||
/** | |||
* Creates a new SimpleHeader with $name. | |||
* | |||
* @param string $name | |||
* @param Swift_Mime_HeaderEncoder $encoder | |||
* @param Swift_Mime_Grammar $grammar | |||
* @param string $name | |||
*/ | |||
public function __construct($name) | |||
{ |
@@ -15,6 +15,12 @@ | |||
*/ | |||
class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime_Message | |||
{ | |||
const PRIORITY_HIGHEST = 1; | |||
const PRIORITY_HIGH = 2; | |||
const PRIORITY_NORMAL = 3; | |||
const PRIORITY_LOW = 4; | |||
const PRIORITY_LOWEST = 5; | |||
/** | |||
* Create a new SimpleMessage with $headers, $encoder and $cache. | |||
* | |||
@@ -67,7 +73,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* | |||
* @param string $subject | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function setSubject($subject) | |||
{ | |||
@@ -93,7 +99,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* | |||
* @param int $date | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function setDate($date) | |||
{ | |||
@@ -119,7 +125,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* | |||
* @param string $address | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function setReturnPath($address) | |||
{ | |||
@@ -148,7 +154,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* @param string $address | |||
* @param string $name optional | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function setSender($address, $name = null) | |||
{ | |||
@@ -181,7 +187,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* @param string $address | |||
* @param string $name optional | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function addFrom($address, $name = null) | |||
{ | |||
@@ -202,7 +208,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* @param string|array $addresses | |||
* @param string $name optional | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function setFrom($addresses, $name = null) | |||
{ | |||
@@ -235,7 +241,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* @param string $address | |||
* @param string $name optional | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function addReplyTo($address, $name = null) | |||
{ | |||
@@ -256,7 +262,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* @param mixed $addresses | |||
* @param string $name optional | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function setReplyTo($addresses, $name = null) | |||
{ | |||
@@ -289,7 +295,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* @param string $address | |||
* @param string $name optional | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function addTo($address, $name = null) | |||
{ | |||
@@ -311,7 +317,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* @param mixed $addresses | |||
* @param string $name optional | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function setTo($addresses, $name = null) | |||
{ | |||
@@ -344,7 +350,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* @param string $address | |||
* @param string $name optional | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function addCc($address, $name = null) | |||
{ | |||
@@ -363,7 +369,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* @param mixed $addresses | |||
* @param string $name optional | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function setCc($addresses, $name = null) | |||
{ | |||
@@ -396,7 +402,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* @param string $address | |||
* @param string $name optional | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function addBcc($address, $name = null) | |||
{ | |||
@@ -415,7 +421,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* @param mixed $addresses | |||
* @param string $name optional | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function setBcc($addresses, $name = null) | |||
{ | |||
@@ -447,16 +453,16 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* | |||
* @param int $priority | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function setPriority($priority) | |||
{ | |||
$priorityMap = array( | |||
1 => 'Highest', | |||
2 => 'High', | |||
3 => 'Normal', | |||
4 => 'Low', | |||
5 => 'Lowest', | |||
self::PRIORITY_HIGHEST => 'Highest', | |||
self::PRIORITY_HIGH => 'High', | |||
self::PRIORITY_NORMAL => 'Normal', | |||
self::PRIORITY_LOW => 'Low', | |||
self::PRIORITY_LOWEST => 'Lowest', | |||
); | |||
$pMapKeys = array_keys($priorityMap); | |||
if ($priority > max($pMapKeys)) { | |||
@@ -495,7 +501,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* | |||
* @param array $addresses | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function setReadReceiptTo($addresses) | |||
{ | |||
@@ -522,7 +528,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* | |||
* @param Swift_Mime_MimeEntity $entity | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function attach(Swift_Mime_MimeEntity $entity) | |||
{ | |||
@@ -536,7 +542,7 @@ class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart implements Swift_Mime | |||
* | |||
* @param Swift_Mime_MimeEntity $entity | |||
* | |||
* @return Swift_Mime_SimpleMessage | |||
* @return $this | |||
*/ | |||
public function detach(Swift_Mime_MimeEntity $entity) | |||
{ |
@@ -161,7 +161,7 @@ class Swift_Mime_SimpleMimeEntity implements Swift_Mime_MimeEntity | |||
* | |||
* @param string $type | |||
* | |||
* @return Swift_Mime_SimpleMimeEntity | |||
* @return $this | |||
*/ | |||
public function setContentType($type) | |||
{ | |||
@@ -192,7 +192,7 @@ class Swift_Mime_SimpleMimeEntity implements Swift_Mime_MimeEntity | |||
* | |||
* @param string $id | |||
* | |||
* @return Swift_Mime_SimpleMimeEntity | |||
* @return $this | |||
*/ | |||
public function setId($id) | |||
{ | |||
@@ -223,7 +223,7 @@ class Swift_Mime_SimpleMimeEntity implements Swift_Mime_MimeEntity | |||
* | |||
* @param string $description | |||
* | |||
* @return Swift_Mime_SimpleMimeEntity | |||
* @return $this | |||
*/ | |||
public function setDescription($description) | |||
{ | |||
@@ -251,7 +251,7 @@ class Swift_Mime_SimpleMimeEntity implements Swift_Mime_MimeEntity | |||
* | |||
* @param int $length | |||
* | |||
* @return Swift_Mime_SimpleMimeEntity | |||
* @return $this | |||
*/ | |||
public function setMaxLineLength($length) | |||
{ | |||
@@ -276,7 +276,7 @@ class Swift_Mime_SimpleMimeEntity implements Swift_Mime_MimeEntity | |||
* @param Swift_Mime_MimeEntity[] $children | |||
* @param int $compoundLevel For internal use only | |||
* | |||
* @return Swift_Mime_SimpleMimeEntity | |||
* @return $this | |||
*/ | |||
public function setChildren(array $children, $compoundLevel = null) | |||
{ | |||
@@ -355,7 +355,7 @@ class Swift_Mime_SimpleMimeEntity implements Swift_Mime_MimeEntity | |||
* @param mixed $body | |||
* @param string $contentType optional | |||
* | |||
* @return Swift_Mime_SimpleMimeEntity | |||
* @return $this | |||
*/ | |||
public function setBody($body, $contentType = null) | |||
{ | |||
@@ -386,7 +386,7 @@ class Swift_Mime_SimpleMimeEntity implements Swift_Mime_MimeEntity | |||
* | |||
* @param Swift_Mime_ContentEncoder $encoder | |||
* | |||
* @return Swift_Mime_SimpleMimeEntity | |||
* @return $this | |||
*/ | |||
public function setEncoder(Swift_Mime_ContentEncoder $encoder) | |||
{ | |||
@@ -422,7 +422,7 @@ class Swift_Mime_SimpleMimeEntity implements Swift_Mime_MimeEntity | |||
* | |||
* @throws Swift_RfcComplianceException | |||
* | |||
* @return Swift_Mime_SimpleMimeEntity | |||
* @return $this | |||
*/ | |||
public function setBoundary($boundary) | |||
{ |
@@ -98,16 +98,16 @@ class Swift_Plugins_ThrottlerPlugin extends Swift_Plugins_BandwidthMonitorPlugin | |||
$duration = $time - $this->_start; | |||
switch ($this->_mode) { | |||
case self::BYTES_PER_MINUTE : | |||
case self::BYTES_PER_MINUTE: | |||
$sleep = $this->_throttleBytesPerMinute($duration); | |||
break; | |||
case self::MESSAGES_PER_SECOND : | |||
case self::MESSAGES_PER_SECOND: | |||
$sleep = $this->_throttleMessagesPerSecond($duration); | |||
break; | |||
case self::MESSAGES_PER_MINUTE : | |||
case self::MESSAGES_PER_MINUTE: | |||
$sleep = $this->_throttleMessagesPerMinute($duration); | |||
break; | |||
default : | |||
default: | |||
$sleep = 0; | |||
break; | |||
} |
@@ -432,10 +432,10 @@ class Swift_Signers_DKIMSigner implements Swift_Signers_HeaderSigner | |||
{ | |||
// Init | |||
switch ($this->_hashAlgorithm) { | |||
case 'rsa-sha256' : | |||
case 'rsa-sha256': | |||
$this->_bodyHashHandler = hash_init('sha256'); | |||
break; | |||
case 'rsa-sha1' : | |||
case 'rsa-sha1': | |||
$this->_bodyHashHandler = hash_init('sha1'); | |||
break; | |||
} | |||
@@ -567,14 +567,14 @@ class Swift_Signers_DKIMSigner implements Swift_Signers_HeaderSigner | |||
protected function _addHeader($header, $is_sig = false) | |||
{ | |||
switch ($this->_headerCanon) { | |||
case 'relaxed' : | |||
case 'relaxed': | |||
// Prepare Header and cascade | |||
$exploded = explode(':', $header, 2); | |||
$name = strtolower(trim($exploded[0])); | |||
$value = str_replace("\r\n", '', $exploded[1]); | |||
$value = preg_replace("/[ \t][ \t]+/", ' ', $value); | |||
$header = $name.':'.trim($value).($is_sig ? '' : "\r\n"); | |||
case 'simple' : | |||
case 'simple': | |||
// Nothing to do | |||
} | |||
$this->_addToHeaderHash($header); | |||
@@ -600,10 +600,10 @@ class Swift_Signers_DKIMSigner implements Swift_Signers_HeaderSigner | |||
continue; | |||
} | |||
switch ($string[$i]) { | |||
case "\r" : | |||
case "\r": | |||
$this->_bodyCanonLastChar = "\r"; | |||
break; | |||
case "\n" : | |||
case "\n": | |||
if ($this->_bodyCanonLastChar == "\r") { | |||
if ($method) { | |||
$this->_bodyCanonSpace = false; | |||
@@ -619,13 +619,13 @@ class Swift_Signers_DKIMSigner implements Swift_Signers_HeaderSigner | |||
// todo handle it but should never happen | |||
} | |||
break; | |||
case ' ' : | |||
case "\t" : | |||
case ' ': | |||
case "\t": | |||
if ($method) { | |||
$this->_bodyCanonSpace = true; | |||
break; | |||
} | |||
default : | |||
default: | |||
if ($this->_bodyCanonEmptyCounter > 0) { | |||
$canon .= str_repeat("\r\n", $this->_bodyCanonEmptyCounter); | |||
$this->_bodyCanonEmptyCounter = 0; |
@@ -413,14 +413,14 @@ class Swift_Signers_DomainKeySigner implements Swift_Signers_HeaderSigner | |||
protected function _addHeader($header) | |||
{ | |||
switch ($this->_canon) { | |||
case 'nofws' : | |||
case 'nofws': | |||
// Prepare Header and cascade | |||
$exploded = explode(':', $header, 2); | |||
$name = strtolower(trim($exploded[0])); | |||
$value = str_replace("\r\n", '', $exploded[1]); | |||
$value = preg_replace("/[ \t][ \t]+/", ' ', $value); | |||
$header = $name.':'.trim($value)."\r\n"; | |||
case 'simple' : | |||
case 'simple': | |||
// Nothing to do | |||
} | |||
$this->_addToHash($header); | |||
@@ -442,10 +442,10 @@ class Swift_Signers_DomainKeySigner implements Swift_Signers_HeaderSigner | |||
continue; | |||
} | |||
switch ($string[$i]) { | |||
case "\r" : | |||
case "\r": | |||
$this->_bodyCanonLastChar = "\r"; | |||
break; | |||
case "\n" : | |||
case "\n": | |||
if ($this->_bodyCanonLastChar == "\r") { | |||
if ($nofws) { | |||
$this->_bodyCanonSpace = false; | |||
@@ -461,14 +461,14 @@ class Swift_Signers_DomainKeySigner implements Swift_Signers_HeaderSigner | |||
throw new Swift_SwiftException('Invalid new line sequence in mail found \n without preceding \r'); | |||
} | |||
break; | |||
case ' ' : | |||
case "\t" : | |||
case ' ': | |||
case "\t": | |||
case "\x09": //HTAB | |||
if ($nofws) { | |||
$this->_bodyCanonSpace = true; | |||
break; | |||
} | |||
default : | |||
default: | |||
if ($this->_bodyCanonEmptyCounter > 0) { | |||
$canon .= str_repeat("\r\n", $this->_bodyCanonEmptyCounter); | |||
$this->_bodyCanonEmptyCounter = 0; | |||
@@ -498,7 +498,7 @@ class Swift_Signers_DomainKeySigner implements Swift_Signers_HeaderSigner | |||
{ | |||
// Init | |||
switch ($this->_hashAlgorithm) { | |||
case 'rsa-sha1' : | |||
case 'rsa-sha1': | |||
$this->_hashHandler = hash_init('sha1'); | |||
break; | |||
} |
@@ -124,6 +124,7 @@ class Swift_StreamFilters_ByteArrayReplacementFilter implements Swift_StreamFilt | |||
$newBuffer = array(); | |||
$buf_size = count($buffer); | |||
$last_size = 0; | |||
for ($i = 0; $i < $buf_size; ++$i) { | |||
$search_pos = $this->_tree; | |||
$last_found = PHP_INT_MAX; |
@@ -46,7 +46,7 @@ class Swift_Transport_Esmtp_Auth_NTLMAuthenticator implements Swift_Transport_Es | |||
} | |||
if (!function_exists('bcmul')) { | |||
throw new LogicException('The BCMatch functions must be enabled to use the NTLM authenticator.'); | |||
throw new LogicException('The BCMath functions must be enabled to use the NTLM authenticator.'); | |||
} | |||
try { |
@@ -140,7 +140,7 @@ class Swift_Transport_EsmtpTransport extends Swift_Transport_AbstractSmtpTranspo | |||
*/ | |||
public function setEncryption($encryption) | |||
{ | |||
$encryption = strtolower($encryption); | |||
$encryption = strtolower($encryption); | |||
if ('tls' == $encryption) { | |||
$this->_params['protocol'] = 'tcp'; | |||
$this->_params['tls'] = true; |
@@ -20,6 +20,8 @@ | |||
* all-or-nothing result from sending. | |||
* | |||
* @author Chris Corbyn | |||
* | |||
* @deprecated since 5.4.5 (to be removed in 6.0) | |||
*/ | |||
class Swift_Transport_MailTransport implements Swift_Transport | |||
{ | |||
@@ -40,6 +42,8 @@ class Swift_Transport_MailTransport implements Swift_Transport | |||
*/ | |||
public function __construct(Swift_Transport_MailInvoker $invoker, Swift_Events_EventDispatcher $eventDispatcher) | |||
{ | |||
@trigger_error(sprintf('The %s class is deprecated since version 5.4.5 and will be removed in 6.0. Use the Sendmail or SMTP transport instead.', __CLASS__), E_USER_DEPRECATED); | |||
$this->_invoker = $invoker; | |||
$this->_eventDispatcher = $eventDispatcher; | |||
} | |||
@@ -238,6 +242,36 @@ class Swift_Transport_MailTransport implements Swift_Transport | |||
return $path; | |||
} | |||
/** | |||
* Fix CVE-2016-10074 by disallowing potentially unsafe shell characters. | |||
* | |||
* Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows. | |||
* | |||
* @param string $string The string to be validated | |||
* | |||
* @return bool | |||
*/ | |||
private function _isShellSafe($string) | |||
{ | |||
// Future-proof | |||
if (escapeshellcmd($string) !== $string || !in_array(escapeshellarg($string), array("'$string'", "\"$string\""))) { | |||
return false; | |||
} | |||
$length = strlen($string); | |||
for ($i = 0; $i < $length; ++$i) { | |||
$c = $string[$i]; | |||
// All other characters have a special meaning in at least one common shell, including = and +. | |||
// Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here. | |||
// Note that this does permit non-Latin alphanumeric characters based on the current locale. | |||
if (!ctype_alnum($c) && strpos('@_-.', $c) === false) { | |||
return false; | |||
} | |||
} | |||
return true; | |||
} | |||
/** | |||
* Return php mail extra params to use for invoker->mail. | |||
* | |||
@@ -249,7 +283,11 @@ class Swift_Transport_MailTransport implements Swift_Transport | |||
private function _formatExtraParams($extraParams, $reversePath) | |||
{ | |||
if (false !== strpos($extraParams, '-f%s')) { | |||
$extraParams = empty($reversePath) ? str_replace('-f%s', '', $extraParams) : sprintf($extraParams, escapeshellarg($reversePath)); | |||
if (empty($reversePath) || false === $this->_isShellSafe($reversePath)) { | |||
$extraParams = str_replace('-f%s', '', $extraParams); | |||
} else { | |||
$extraParams = sprintf($extraParams, $reversePath); | |||
} | |||
} | |||
return !empty($extraParams) ? $extraParams : null; |
@@ -14,6 +14,7 @@ | |||
<ini name="intl.default_locale" value="en"/> | |||
<ini name="intl.error_level" value="0"/> | |||
<ini name="memory_limit" value="-1"/> | |||
<ini name="error_reporting" value="-1" /> | |||
</php> | |||
<testsuites> | |||
@@ -32,6 +33,7 @@ | |||
</testsuites> | |||
<listeners> | |||
<listener class="Mockery\Adapter\Phpunit\TestListener"/> | |||
<listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener" /> | |||
<listener class="Mockery\Adapter\Phpunit\TestListener" /> | |||
</listeners> | |||
</phpunit> |
@@ -164,7 +164,7 @@ class Swift_ByteStream_FileByteStreamAcceptanceTest extends \PHPUnit_Framework_T | |||
private function _createMockInputStream() | |||
{ | |||
return $this->getMock('Swift_InputByteStream'); | |||
return $this->getMockBuilder('Swift_InputByteStream')->getMock(); | |||
} | |||
private function _createFileStream($file, $writable = false) |
@@ -11,6 +11,10 @@ class Swift_DependencyContainerAcceptanceTest extends \PHPUnit_Framework_TestCas | |||
$di = Swift_DependencyContainer::getInstance(); | |||
foreach ($di->listItems() as $itemName) { | |||
try { | |||
// to be removed in 6.0 | |||
if ('transport.mail' === $itemName) { | |||
continue; | |||
} | |||
$di->lookup($itemName); | |||
} catch (Swift_DependencyException $e) { | |||
$this->fail($e->getMessage()); |
@@ -1,7 +1,6 @@ | |||
<?php | |||
abstract class Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest | |||
extends \PHPUnit_Framework_TestCase | |||
abstract class Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest extends \PHPUnit_Framework_TestCase | |||
{ | |||
protected $_buffer; | |||
@@ -17,7 +16,7 @@ abstract class Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest | |||
} | |||
$this->_buffer = new Swift_Transport_StreamBuffer( | |||
$this->getMock('Swift_ReplacementFilterFactory') | |||
$this->getMockBuilder('Swift_ReplacementFilterFactory')->getMock() | |||
); | |||
} | |||
@@ -129,6 +128,6 @@ abstract class Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest | |||
private function _createMockInputStream() | |||
{ | |||
return $this->getMock('Swift_InputByteStream'); | |||
return $this->getMockBuilder('Swift_InputByteStream')->getMock(); | |||
} | |||
} |
@@ -2,8 +2,7 @@ | |||
require_once __DIR__.'/AbstractStreamBufferAcceptanceTest.php'; | |||
class Swift_Transport_StreamBuffer_BasicSocketAcceptanceTest | |||
extends Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest | |||
class Swift_Transport_StreamBuffer_BasicSocketAcceptanceTest extends Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest | |||
{ | |||
public function setUp() | |||
{ |
@@ -2,8 +2,7 @@ | |||
require_once __DIR__.'/AbstractStreamBufferAcceptanceTest.php'; | |||
class Swift_Transport_StreamBuffer_ProcessAcceptanceTest | |||
extends Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest | |||
class Swift_Transport_StreamBuffer_ProcessAcceptanceTest extends Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest | |||
{ | |||
public function setUp() | |||
{ |
@@ -27,7 +27,7 @@ class Swift_Transport_StreamBuffer_SocketTimeoutTest extends \PHPUnit_Framework_ | |||
} | |||
$this->_buffer = new Swift_Transport_StreamBuffer( | |||
$this->getMock('Swift_ReplacementFilterFactory') | |||
$this->getMockBuilder('Swift_ReplacementFilterFactory')->getMock() | |||
); | |||
} | |||
@@ -2,8 +2,7 @@ | |||
require_once __DIR__.'/AbstractStreamBufferAcceptanceTest.php'; | |||
class Swift_Transport_StreamBuffer_SslSocketAcceptanceTest | |||
extends Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest | |||
class Swift_Transport_StreamBuffer_SslSocketAcceptanceTest extends Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest | |||
{ | |||
public function setUp() | |||
{ |
@@ -2,8 +2,7 @@ | |||
require_once __DIR__.'/AbstractStreamBufferAcceptanceTest.php'; | |||
class Swift_Transport_StreamBuffer_TlsSocketAcceptanceTest | |||
extends Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest | |||
class Swift_Transport_StreamBuffer_TlsSocketAcceptanceTest extends Swift_Transport_StreamBuffer_AbstractStreamBufferAcceptanceTest | |||
{ | |||
public function setUp() | |||
{ |
@@ -1,7 +1,7 @@ | |||
<?php | |||
class Swift_FileByteStreamConsecutiveReadCalls extends \PHPUnit_Framework_TestCase | |||
class Swift_FileByteStreamConsecutiveReadCalls extends \PHPUnit_Framework_TestCase | |||
{ | |||
/** | |||
* @test |
@@ -54,7 +54,8 @@ class Swift_ByteStream_ArrayByteStreamTest extends \PHPUnit_Framework_TestCase | |||
public function testResettingPointerAfterExhaustion() | |||
{ | |||
$input = array('a', 'b', 'c'); | |||
$bs = $this->_createArrayStream($input); while (false !== $bs->read(1)); | |||
$bs = $this->_createArrayStream($input); | |||
while (false !== $bs->read(1)); | |||
$bs->setReadPointer(0); | |||
$this->assertEquals('a', $bs->read(1), | |||
@@ -79,7 +80,7 @@ class Swift_ByteStream_ArrayByteStreamTest extends \PHPUnit_Framework_TestCase | |||
$bs = $this->_createArrayStream($input); | |||
$bs->setReadPointer(3); | |||
$this->assertSame(false, $bs->read(1), | |||
$this->assertFalse($bs->read(1), | |||
'%s: Stream should be at end and thus return false' | |||
); | |||
} | |||
@@ -107,7 +108,7 @@ class Swift_ByteStream_ArrayByteStreamTest extends \PHPUnit_Framework_TestCase | |||
$bs->flushBuffers(); | |||
$this->assertSame(false, $bs->read(1), | |||
$this->assertFalse($bs->read(1), | |||
'%s: Contents have been flushed so read() should return false' | |||
); | |||
} | |||
@@ -127,8 +128,8 @@ class Swift_ByteStream_ArrayByteStreamTest extends \PHPUnit_Framework_TestCase | |||
public function testBindingOtherStreamsMirrorsWriteOperations() | |||
{ | |||
$bs = $this->_createArrayStream(''); | |||
$is1 = $this->getMock('Swift_InputByteStream'); | |||
$is2 = $this->getMock('Swift_InputByteStream'); | |||
$is1 = $this->getMockBuilder('Swift_InputByteStream')->getMock(); | |||
$is2 = $this->getMockBuilder('Swift_InputByteStream')->getMock(); | |||
$is1->expects($this->at(0)) | |||
->method('write') | |||
@@ -153,8 +154,8 @@ class Swift_ByteStream_ArrayByteStreamTest extends \PHPUnit_Framework_TestCase | |||
public function testBindingOtherStreamsMirrorsFlushOperations() | |||
{ | |||
$bs = $this->_createArrayStream(''); | |||
$is1 = $this->getMock('Swift_InputByteStream'); | |||
$is2 = $this->getMock('Swift_InputByteStream'); | |||
$is1 = $this->getMockBuilder('Swift_InputByteStream')->getMock(); | |||
$is2 = $this->getMockBuilder('Swift_InputByteStream')->getMock(); | |||
$is1->expects($this->once()) | |||
->method('flushBuffers'); | |||
@@ -170,8 +171,8 @@ class Swift_ByteStream_ArrayByteStreamTest extends \PHPUnit_Framework_TestCase | |||
public function testUnbindingStreamPreventsFurtherWrites() | |||
{ | |||
$bs = $this->_createArrayStream(''); | |||
$is1 = $this->getMock('Swift_InputByteStream'); | |||
$is2 = $this->getMock('Swift_InputByteStream'); | |||
$is1 = $this->getMockBuilder('Swift_InputByteStream')->getMock(); | |||
$is2 = $this->getMockBuilder('Swift_InputByteStream')->getMock(); | |||
$is1->expects($this->at(0)) | |||
->method('write') |
@@ -103,7 +103,7 @@ class Swift_CharacterStream_ArrayCharacterStreamTest extends \SwiftMailerTestCas | |||
); | |||
$this->assertIdenticalBinary(pack('C*', 0xD1, 0x85), $stream->read(1)); | |||
$this->assertSame(false, $stream->read(1)); | |||
$this->assertFalse($stream->read(1)); | |||
} | |||
public function testCharactersCanBeReadAsByteArrays() | |||
@@ -146,7 +146,7 @@ class Swift_CharacterStream_ArrayCharacterStreamTest extends \SwiftMailerTestCas | |||
); | |||
$this->assertEquals(array(0xD1, 0x85), $stream->readBytes(1)); | |||
$this->assertSame(false, $stream->readBytes(1)); | |||
$this->assertFalse($stream->readBytes(1)); | |||
} | |||
public function testRequestingLargeCharCountPastEndOfStream() | |||
@@ -169,7 +169,7 @@ class Swift_CharacterStream_ArrayCharacterStreamTest extends \SwiftMailerTestCas | |||
$stream->read(100) | |||
); | |||
$this->assertSame(false, $stream->read(1)); | |||
$this->assertFalse($stream->read(1)); | |||
} | |||
public function testRequestingByteArrayCountPastEndOfStream() | |||
@@ -192,7 +192,7 @@ class Swift_CharacterStream_ArrayCharacterStreamTest extends \SwiftMailerTestCas | |||
$stream->readBytes(100) | |||
); | |||
$this->assertSame(false, $stream->readBytes(1)); | |||
$this->assertFalse($stream->readBytes(1)); | |||
} | |||
public function testPointerOffsetCanBeSet() | |||
@@ -240,7 +240,7 @@ class Swift_CharacterStream_ArrayCharacterStreamTest extends \SwiftMailerTestCas | |||
$stream->flushContents(); | |||
$this->assertSame(false, $stream->read(1)); | |||
$this->assertFalse($stream->read(1)); | |||
} | |||
public function testByteStreamCanBeImportingUsesValidator() | |||
@@ -308,7 +308,7 @@ class Swift_CharacterStream_ArrayCharacterStreamTest extends \SwiftMailerTestCas | |||
$this->assertIdenticalBinary(pack('C*', 0xD0, 0xB6), $stream->read(1)); | |||
$this->assertIdenticalBinary(pack('C*', 0xD0, 0xBE), $stream->read(1)); | |||
$this->assertSame(false, $stream->read(1)); | |||
$this->assertFalse($stream->read(1)); | |||
} | |||
public function testAlgorithmWithFixedWidthCharsets() | |||
@@ -332,7 +332,7 @@ class Swift_CharacterStream_ArrayCharacterStreamTest extends \SwiftMailerTestCas | |||
$this->assertIdenticalBinary(pack('C*', 0xD0, 0xBB), $stream->read(1)); | |||
$this->assertIdenticalBinary(pack('C*', 0xD0, 0xB0), $stream->read(1)); | |||
$this->assertSame(false, $stream->read(1)); | |||
$this->assertFalse($stream->read(1)); | |||
} | |||
// -- Creation methods |
@@ -2,7 +2,8 @@ | |||
class One | |||
{ | |||
public $arg1, $arg2; | |||
public $arg1; | |||
public $arg2; | |||
public function __construct($arg1 = null, $arg2 = null) | |||
{ | |||
$this->arg1 = $arg1; |
@@ -31,6 +31,6 @@ class Swift_Events_CommandEventTest extends \PHPUnit_Framework_TestCase | |||
private function _createTransport() | |||
{ | |||
return $this->getMock('Swift_Transport'); | |||
return $this->getMockBuilder('Swift_Transport')->getMock(); | |||
} | |||
} |
@@ -35,6 +35,6 @@ class Swift_Events_ResponseEventTest extends \PHPUnit_Framework_TestCase | |||
private function _createTransport() | |||
{ | |||
return $this->getMock('Swift_Transport'); | |||
return $this->getMockBuilder('Swift_Transport')->getMock(); | |||
} | |||
} |
@@ -89,11 +89,11 @@ class Swift_Events_SendEventTest extends \PHPUnit_Framework_TestCase | |||
private function _createTransport() | |||
{ | |||
return $this->getMock('Swift_Transport'); | |||
return $this->getMockBuilder('Swift_Transport')->getMock(); | |||
} | |||
private function _createMessage() | |||
{ | |||
return $this->getMock('Swift_Mime_Message'); | |||
return $this->getMockBuilder('Swift_Mime_Message')->getMock(); | |||
} | |||
} |
@@ -11,8 +11,8 @@ class Swift_Events_SimpleEventDispatcherTest extends \PHPUnit_Framework_TestCase | |||
public function testSendEventCanBeCreated() | |||
{ | |||
$transport = $this->getMock('Swift_Transport'); | |||
$message = $this->getMock('Swift_Mime_Message'); | |||
$transport = $this->getMockBuilder('Swift_Transport')->getMock(); | |||
$message = $this->getMockBuilder('Swift_Mime_Message')->getMock(); | |||
$evt = $this->_dispatcher->createSendEvent($transport, $message); | |||
$this->assertInstanceof('Swift_Events_SendEvent', $evt); | |||
$this->assertSame($message, $evt->getMessage()); | |||
@@ -21,7 +21,7 @@ class Swift_Events_SimpleEventDispatcherTest extends \PHPUnit_Framework_TestCase | |||
public function testCommandEventCanBeCreated() | |||
{ | |||
$buf = $this->getMock('Swift_Transport'); | |||
$buf = $this->getMockBuilder('Swift_Transport')->getMock(); | |||
$evt = $this->_dispatcher->createCommandEvent($buf, "FOO\r\n", array(250)); | |||
$this->assertInstanceof('Swift_Events_CommandEvent', $evt); | |||
$this->assertSame($buf, $evt->getSource()); | |||
@@ -31,7 +31,7 @@ class Swift_Events_SimpleEventDispatcherTest extends \PHPUnit_Framework_TestCase | |||
public function testResponseEventCanBeCreated() | |||
{ | |||
$buf = $this->getMock('Swift_Transport'); | |||
$buf = $this->getMockBuilder('Swift_Transport')->getMock(); | |||
$evt = $this->_dispatcher->createResponseEvent($buf, "250 Ok\r\n", true); | |||
$this->assertInstanceof('Swift_Events_ResponseEvent', $evt); | |||
$this->assertSame($buf, $evt->getSource()); | |||
@@ -41,7 +41,7 @@ class Swift_Events_SimpleEventDispatcherTest extends \PHPUnit_Framework_TestCase | |||
public function testTransportChangeEventCanBeCreated() | |||
{ | |||
$transport = $this->getMock('Swift_Transport'); | |||
$transport = $this->getMockBuilder('Swift_Transport')->getMock(); | |||
$evt = $this->_dispatcher->createTransportChangeEvent($transport); | |||
$this->assertInstanceof('Swift_Events_TransportChangeEvent', $evt); | |||
$this->assertSame($transport, $evt->getSource()); | |||
@@ -49,7 +49,7 @@ class Swift_Events_SimpleEventDispatcherTest extends \PHPUnit_Framework_TestCase | |||
public function testTransportExceptionEventCanBeCreated() | |||
{ | |||
$transport = $this->getMock('Swift_Transport'); | |||
$transport = $this->getMockBuilder('Swift_Transport')->getMock(); | |||
$ex = new Swift_TransportException(''); | |||
$evt = $this->_dispatcher->createTransportExceptionEvent($transport, $ex); | |||
$this->assertInstanceof('Swift_Events_TransportExceptionEvent', $evt); | |||
@@ -59,12 +59,12 @@ class Swift_Events_SimpleEventDispatcherTest extends \PHPUnit_Framework_TestCase | |||
public function testListenersAreNotifiedOfDispatchedEvent() | |||
{ | |||
$transport = $this->getMock('Swift_Transport'); | |||
$transport = $this->getMockBuilder('Swift_Transport')->getMock(); | |||
$evt = $this->_dispatcher->createTransportChangeEvent($transport); | |||
$listenerA = $this->getMock('Swift_Events_TransportChangeListener'); | |||
$listenerB = $this->getMock('Swift_Events_TransportChangeListener'); | |||
$listenerA = $this->getMockBuilder('Swift_Events_TransportChangeListener')->getMock(); | |||
$listenerB = $this->getMockBuilder('Swift_Events_TransportChangeListener')->getMock(); | |||
$this->_dispatcher->bindEventListener($listenerA); | |||
$this->_dispatcher->bindEventListener($listenerB); | |||
@@ -81,13 +81,13 @@ class Swift_Events_SimpleEventDispatcherTest extends \PHPUnit_Framework_TestCase | |||
public function testListenersAreOnlyCalledIfImplementingCorrectInterface() | |||
{ | |||
$transport = $this->getMock('Swift_Transport'); | |||
$message = $this->getMock('Swift_Mime_Message'); | |||
$transport = $this->getMockBuilder('Swift_Transport')->getMock(); | |||
$message = $this->getMockBuilder('Swift_Mime_Message')->getMock(); | |||
$evt = $this->_dispatcher->createSendEvent($transport, $message); | |||
$targetListener = $this->getMock('Swift_Events_SendListener'); | |||
$otherListener = $this->getMock('DummyListener'); | |||
$targetListener = $this->getMockBuilder('Swift_Events_SendListener')->getMock(); | |||
$otherListener = $this->getMockBuilder('DummyListener')->getMock(); | |||
$this->_dispatcher->bindEventListener($targetListener); | |||
$this->_dispatcher->bindEventListener($otherListener); | |||
@@ -103,13 +103,13 @@ class Swift_Events_SimpleEventDispatcherTest extends \PHPUnit_Framework_TestCase | |||
public function testListenersCanCancelBubblingOfEvent() | |||
{ | |||
$transport = $this->getMock('Swift_Transport'); | |||
$message = $this->getMock('Swift_Mime_Message'); | |||
$transport = $this->getMockBuilder('Swift_Transport')->getMock(); | |||
$message = $this->getMockBuilder('Swift_Mime_Message')->getMock(); | |||
$evt = $this->_dispatcher->createSendEvent($transport, $message); | |||
$listenerA = $this->getMock('Swift_Events_SendListener'); | |||
$listenerB = $this->getMock('Swift_Events_SendListener'); | |||
$listenerA = $this->getMockBuilder('Swift_Events_SendListener')->getMock(); | |||
$listenerB = $this->getMockBuilder('Swift_Events_SendListener')->getMock(); | |||
$this->_dispatcher->bindEventListener($listenerA); | |||
$this->_dispatcher->bindEventListener($listenerB); |
@@ -27,6 +27,6 @@ class Swift_Events_TransportChangeEventTest extends \PHPUnit_Framework_TestCase | |||
private function _createTransport() | |||
{ | |||
return $this->getMock('Swift_Transport'); | |||
return $this->getMockBuilder('Swift_Transport')->getMock(); | |||
} | |||
} |
@@ -33,7 +33,7 @@ class Swift_Events_TransportExceptionEventTest extends \PHPUnit_Framework_TestCa | |||
private function _createTransport() | |||
{ | |||
return $this->getMock('Swift_Transport'); | |||
return $this->getMockBuilder('Swift_Transport')->getMock(); | |||
} | |||
private function _createException() |
@@ -227,16 +227,16 @@ class Swift_KeyCache_ArrayKeyCacheTest extends \PHPUnit_Framework_TestCase | |||
private function _createKeyCacheInputStream() | |||
{ | |||
return $this->getMock('Swift_KeyCache_KeyCacheInputStream'); | |||
return $this->getMockBuilder('Swift_KeyCache_KeyCacheInputStream')->getMock(); | |||
} | |||
private function _createOutputStream() | |||
{ | |||
return $this->getMock('Swift_OutputByteStream'); | |||
return $this->getMockBuilder('Swift_OutputByteStream')->getMock(); | |||
} | |||
private function _createInputStream() | |||
{ | |||
return $this->getMock('Swift_InputByteStream'); | |||
return $this->getMockBuilder('Swift_InputByteStream')->getMock(); | |||
} | |||
} |
@@ -6,7 +6,7 @@ class Swift_KeyCache_SimpleKeyCacheInputStreamTest extends \PHPUnit_Framework_Te | |||
public function testStreamWritesToCacheInAppendMode() | |||
{ | |||
$cache = $this->getMock('Swift_KeyCache'); | |||
$cache = $this->getMockBuilder('Swift_KeyCache')->getMock(); | |||
$cache->expects($this->at(0)) | |||
->method('setString') | |||
->with($this->_nsKey, 'foo', 'a', Swift_KeyCache::MODE_APPEND); | |||
@@ -29,7 +29,7 @@ class Swift_KeyCache_SimpleKeyCacheInputStreamTest extends \PHPUnit_Framework_Te | |||
public function testFlushContentClearsKey() | |||
{ | |||
$cache = $this->getMock('Swift_KeyCache'); | |||
$cache = $this->getMockBuilder('Swift_KeyCache')->getMock(); | |||
$cache->expects($this->once()) | |||
->method('clearKey') | |||
->with($this->_nsKey, 'foo'); | |||
@@ -44,7 +44,7 @@ class Swift_KeyCache_SimpleKeyCacheInputStreamTest extends \PHPUnit_Framework_Te | |||
public function testClonedStreamStillReferencesSameCache() | |||
{ | |||
$cache = $this->getMock('Swift_KeyCache'); | |||
$cache = $this->getMockBuilder('Swift_KeyCache')->getMock(); | |||
$cache->expects($this->at(0)) | |||
->method('setString') | |||
->with($this->_nsKey, 'foo', 'a', Swift_KeyCache::MODE_APPEND); |
@@ -123,7 +123,7 @@ class Swift_MessageTest extends \PHPUnit_Framework_TestCase | |||
$arr2_value = $array2[$key]; | |||
$arr1_clone_value = $array1_clone[$key]; | |||
return $this->_recursiveArrayCloningCheck($obj1_value, $obj2_value, $obj1_clone_value); | |||
return $this->_recursiveArrayCloningCheck($arr1_value, $arr2_value, $arr1_clone_value); | |||
} | |||
} | |||
} |
@@ -969,7 +969,7 @@ abstract class Swift_Mime_AbstractMimeEntityTest extends \SwiftMailerTestCase | |||
protected function _createEncoder($name = 'quoted-printable', $stub = true) | |||
{ | |||
$encoder = $this->getMock('Swift_Mime_ContentEncoder'); | |||
$encoder = $this->getMockBuilder('Swift_Mime_ContentEncoder')->getMock(); | |||
$encoder->expects($this->any()) | |||
->method('getName') | |||
->will($this->returnValue($name)); | |||
@@ -1049,6 +1049,6 @@ abstract class Swift_Mime_AbstractMimeEntityTest extends \SwiftMailerTestCase | |||
protected function _createInputStream($stub = true) | |||
{ | |||
return $this->getMock('Swift_InputByteStream'); | |||
return $this->getMockBuilder('Swift_InputByteStream')->getMock(); | |||
} | |||
} |
@@ -181,7 +181,7 @@ class Swift_Mime_MimePartTest extends Swift_Mime_AbstractMimeEntityTest | |||
'Content-Type' => $cType, )), | |||
$this->_createEncoder(), $this->_createCache() | |||
); | |||
$this->assertSame(false, $part->getDelSp()); | |||
$this->assertFalse($part->getDelSp()); | |||
} | |||
public function testDelSpIsSetInHeader() |
@@ -158,11 +158,11 @@ class Swift_Mime_SimpleHeaderFactoryTest extends \PHPUnit_Framework_TestCase | |||
private function _createHeaderEncoder() | |||
{ | |||
return $this->getMock('Swift_Mime_HeaderEncoder'); | |||
return $this->getMockBuilder('Swift_Mime_HeaderEncoder')->getMock(); | |||
} | |||
private function _createParamEncoder() | |||
{ | |||
return $this->getMock('Swift_Encoder'); | |||
return $this->getMockBuilder('Swift_Encoder')->getMock(); | |||
} | |||
} |
@@ -718,12 +718,12 @@ class Swift_Mime_SimpleHeaderSetTest extends \PHPUnit_Framework_TestCase | |||
private function _createFactory() | |||
{ | |||
return $this->getMock('Swift_Mime_HeaderFactory'); | |||
return $this->getMockBuilder('Swift_Mime_HeaderFactory')->getMock(); | |||
} | |||
private function _createHeader($name, $body = '') | |||
{ | |||
$header = $this->getMock('Swift_Mime_Header'); | |||
$header = $this->getMockBuilder('Swift_Mime_Header')->getMock(); | |||
$header->expects($this->any()) | |||
->method('getFieldName') | |||
->will($this->returnValue($name)); |
@@ -652,7 +652,7 @@ class Swift_Mime_SimpleMessageTest extends Swift_Mime_MimePartTest | |||
$this->_createHeaderSet(array('X-Priority' => $prio)), | |||
$this->_createEncoder(), $this->_createCache() | |||
); | |||
$message->setPriority(5); | |||
$message->setPriority($message::PRIORITY_LOWEST); | |||
} | |||
public function testPriorityHeaderIsAddedIfNoneSet() | |||
@@ -667,7 +667,7 @@ class Swift_Mime_SimpleMessageTest extends Swift_Mime_MimePartTest | |||
$message = $this->_createMessage($headers, $this->_createEncoder(), | |||
$this->_createCache() | |||
); | |||
$message->setPriority(4); | |||
$message->setPriority($message::PRIORITY_LOW); | |||
} | |||
public function testReadReceiptAddressReadFromHeader() | |||
@@ -802,7 +802,7 @@ class Swift_Mime_SimpleMessageTest extends Swift_Mime_MimePartTest | |||
->setTo(array('chris@site.tld', 'mark@site.tld')) | |||
->setCc('john@somewhere.tld') | |||
->setBcc(array('one@site', 'two@site' => 'Two')) | |||
->setPriority(4) | |||
->setPriority($message::PRIORITY_LOW) | |||
->setReadReceiptTo('a@b') | |||
->attach($child) | |||
->detach($child) |
@@ -52,7 +52,7 @@ class Swift_Plugins_AntiFloodPluginTest extends \PHPUnit_Framework_TestCase | |||
public function testPluginCanSleepDuringRestart() | |||
{ | |||
$sleeper = $this->getMock('Swift_Plugins_Sleeper'); | |||
$sleeper = $this->getMockBuilder('Swift_Plugins_Sleeper')->getMock(); | |||
$sleeper->expects($this->once()) | |||
->method('sleep') | |||
->with(10); | |||
@@ -75,7 +75,7 @@ class Swift_Plugins_AntiFloodPluginTest extends \PHPUnit_Framework_TestCase | |||
private function _createTransport() | |||
{ | |||
return $this->getMock('Swift_Transport'); | |||
return $this->getMockBuilder('Swift_Transport')->getMock(); | |||
} | |||
private function _createSendEvent($transport) |
@@ -110,7 +110,7 @@ class Swift_Plugins_BandwidthMonitorPluginTest extends \PHPUnit_Framework_TestCa | |||
private function _createMessageWithByteCount($bytes) | |||
{ | |||
$this->_bytes = $bytes; | |||
$msg = $this->getMock('Swift_Mime_Message'); | |||
$msg = $this->getMockBuilder('Swift_Mime_Message')->getMock(); | |||
$msg->expects($this->any()) | |||
->method('toByteStream') | |||
->will($this->returnCallback(array($this, '_write'))); |
@@ -127,7 +127,7 @@ class Swift_Plugins_LoggerPluginTest extends \SwiftMailerTestCase | |||
private function _createLogger() | |||
{ | |||
return $this->getMock('Swift_Plugins_Logger'); | |||
return $this->getMockBuilder('Swift_Plugins_Logger')->getMock(); | |||
} | |||
private function _createPlugin($logger) | |||
@@ -161,7 +161,7 @@ class Swift_Plugins_LoggerPluginTest extends \SwiftMailerTestCase | |||
private function _createTransport() | |||
{ | |||
return $this->getMock('Swift_Transport'); | |||
return $this->getMockBuilder('Swift_Transport')->getMock(); | |||
} | |||
private function _createTransportChangeEvent() |
@@ -73,7 +73,7 @@ class Swift_Plugins_PopBeforeSmtpPluginTest extends \PHPUnit_Framework_TestCase | |||
private function _createTransport() | |||
{ | |||
return $this->getMock('Swift_Transport'); | |||
return $this->getMockBuilder('Swift_Transport')->getMock(); | |||
} | |||
private function _createTransportChangeEvent($transport) | |||
@@ -93,7 +93,7 @@ class Swift_Plugins_PopBeforeSmtpPluginTest extends \PHPUnit_Framework_TestCase | |||
public function _createConnection() | |||
{ | |||
return $this->getMock('Swift_Plugins_Pop_Pop3Connection'); | |||
return $this->getMockBuilder('Swift_Plugins_Pop_Pop3Connection')->getMock(); | |||
} | |||
public function _createPlugin($host, $port, $crypto = null) |
@@ -8,7 +8,7 @@ class Swift_Plugins_Reporters_HitReporterTest extends \PHPUnit_Framework_TestCas | |||
public function setUp() | |||
{ | |||
$this->_hitReporter = new Swift_Plugins_Reporters_HitReporter(); | |||
$this->_message = $this->getMock('Swift_Mime_Message'); | |||
$this->_message = $this->getMockBuilder('Swift_Mime_Message')->getMock(); | |||
} | |||
public function testReportingFail() |
@@ -8,7 +8,7 @@ class Swift_Plugins_Reporters_HtmlReporterTest extends \PHPUnit_Framework_TestCa | |||
public function setUp() | |||
{ | |||
$this->_html = new Swift_Plugins_Reporters_HtmlReporter(); | |||
$this->_message = $this->getMock('Swift_Mime_Message'); | |||
$this->_message = $this->getMockBuilder('Swift_Mime_Message')->getMock(); | |||
} | |||
public function testReportingPass() |
@@ -1,7 +1,6 @@ | |||
<?php | |||
class Swift_Transport_EsmtpTransportTest | |||
extends Swift_Transport_AbstractSmtpEventSupportTest | |||
class Swift_Transport_EsmtpTransportTest extends Swift_Transport_AbstractSmtpEventSupportTest | |||
{ | |||
protected function _getTransport($buf, $dispatcher = null) | |||
{ |
@@ -682,7 +682,7 @@ class Swift_Transport_LoadBalancedTransportTest extends \SwiftMailerTestCase | |||
$t1->shouldReceive('send') | |||
->once() | |||
->with($message, \Mockery::on(function (&$var) use (&$failures, $testCase) { | |||
return $testCase->varsAreReferences($var, $failures); | |||
return $testCase->varsAreReferences($var, $failures); | |||
})) | |||
->andReturnUsing(function () use (&$connectionState) { | |||
if ($connectionState) { |
@@ -1,5 +1,8 @@ | |||
<?php | |||
/** | |||
* @group legacy | |||
*/ | |||
class Swift_Transport_MailTransportTest extends \SwiftMailerTestCase | |||
{ | |||
public function testTransportInvokesMailOncePerMessage() | |||
@@ -100,7 +103,7 @@ class Swift_Transport_MailTransportTest extends \SwiftMailerTestCase | |||
); | |||
$invoker->shouldReceive('mail') | |||
->once() | |||
->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), '-f\'foo@bar\''); | |||
->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), '-ffoo@bar'); | |||
$transport->send($message); | |||
} | |||
@@ -153,7 +156,7 @@ class Swift_Transport_MailTransportTest extends \SwiftMailerTestCase | |||
->andReturn(null); | |||
$invoker->shouldReceive('mail') | |||
->once() | |||
->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), '-x\'foo\' -f\'foo@bar\''); | |||
->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), '-x\'foo\' -ffoo@bar'); | |||
$transport->send($message); | |||
} | |||
@@ -186,6 +189,33 @@ class Swift_Transport_MailTransportTest extends \SwiftMailerTestCase | |||
$transport->send($message); | |||
} | |||
public function testTransportSettingInvalidFromEmail() | |||
{ | |||
$invoker = $this->_createInvoker(); | |||
$dispatcher = $this->_createEventDispatcher(); | |||
$transport = $this->_createTransport($invoker, $dispatcher); | |||
$headers = $this->_createHeaders(); | |||
$message = $this->_createMessageWithRecipient($headers); | |||
$message->shouldReceive('getReturnPath') | |||
->zeroOrMoreTimes() | |||
->andReturn( | |||
'"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php "@email.com' | |||
); | |||
$message->shouldReceive('getSender') | |||
->zeroOrMoreTimes() | |||
->andReturn(null); | |||
$message->shouldReceive('getFrom') | |||
->zeroOrMoreTimes() | |||
->andReturn(null); | |||
$invoker->shouldReceive('mail') | |||
->once() | |||
->with(\Mockery::any(), \Mockery::any(), \Mockery::any(), \Mockery::any(), null); | |||
$transport->send($message); | |||
} | |||
public function testTransportUsesHeadersFromMessage() | |||
{ | |||
$invoker = $this->_createInvoker(); |
@@ -1,7 +1,6 @@ | |||
<?php | |||
class Swift_Transport_SendmailTransportTest | |||
extends Swift_Transport_AbstractSmtpEventSupportTest | |||
class Swift_Transport_SendmailTransportTest extends Swift_Transport_AbstractSmtpEventSupportTest | |||
{ | |||
protected function _getTransport($buf, $dispatcher = null, $command = '/usr/sbin/sendmail -bs') | |||
{ |
@@ -35,11 +35,11 @@ class Swift_Transport_StreamBufferTest extends \PHPUnit_Framework_TestCase | |||
private function _createFactory() | |||
{ | |||
return $this->getMock('Swift_ReplacementFilterFactory'); | |||
return $this->getMockBuilder('Swift_ReplacementFilterFactory')->getMock(); | |||
} | |||
public function _createFilter() | |||
{ | |||
return $this->getMock('Swift_StreamFilter'); | |||
return $this->getMockBuilder('Swift_StreamFilter')->getMock(); | |||
} | |||
} |
@@ -48,49 +48,58 @@ return array ( | |||
'@yii/bootstrap' => $vendorDir . '/yiisoft/yii2-bootstrap', | |||
), | |||
), | |||
'yiisoft/yii2-debug' => | |||
'yiisoft/yii2-gii' => | |||
array ( | |||
'name' => 'yiisoft/yii2-debug', | |||
'version' => '2.0.6.0', | |||
'name' => 'yiisoft/yii2-gii', | |||
'version' => '2.0.5.0', | |||
'alias' => | |||
array ( | |||
'@yii/debug' => $vendorDir . '/yiisoft/yii2-debug', | |||
'@yii/gii' => $vendorDir . '/yiisoft/yii2-gii', | |||
), | |||
), | |||
'yiisoft/yii2-gii' => | |||
'c006/yii2-paypal-ipn' => | |||
array ( | |||
'name' => 'yiisoft/yii2-gii', | |||
'version' => '2.0.5.0', | |||
'name' => 'c006/yii2-paypal-ipn', | |||
'version' => '9999999-dev', | |||
'alias' => | |||
array ( | |||
'@yii/gii' => $vendorDir . '/yiisoft/yii2-gii', | |||
'@c006/paypal_ipn' => $vendorDir . '/c006/yii2-paypal-ipn', | |||
), | |||
), | |||
'2amigos/yii2-leaflet-extension' => | |||
array ( | |||
'name' => '2amigos/yii2-leaflet-extension', | |||
'version' => '1.0.2.0', | |||
'version' => '1.0.3.0', | |||
'alias' => | |||
array ( | |||
'@dosamigos/leaflet' => $vendorDir . '/2amigos/yii2-leaflet-extension/src', | |||
), | |||
), | |||
'kartik-v/yii2-mpdf' => | |||
'yiisoft/yii2-debug' => | |||
array ( | |||
'name' => 'kartik-v/yii2-mpdf', | |||
'name' => 'yiisoft/yii2-debug', | |||
'version' => '2.0.7.0', | |||
'alias' => | |||
array ( | |||
'@yii/debug' => $vendorDir . '/yiisoft/yii2-debug', | |||
), | |||
), | |||
'yurkinx/yii2-image' => | |||
array ( | |||
'name' => 'yurkinx/yii2-image', | |||
'version' => '9999999-dev', | |||
'alias' => | |||
array ( | |||
'@kartik/mpdf' => $vendorDir . '/kartik-v/yii2-mpdf', | |||
'@yii/image' => $vendorDir . '/yurkinx/yii2-image/yii/image', | |||
), | |||
), | |||
'c006/yii2-paypal-ipn' => | |||
'kartik-v/yii2-mpdf' => | |||
array ( | |||
'name' => 'c006/yii2-paypal-ipn', | |||
'name' => 'kartik-v/yii2-mpdf', | |||
'version' => '9999999-dev', | |||
'alias' => | |||
array ( | |||
'@c006/paypal_ipn' => $vendorDir . '/c006/yii2-paypal-ipn', | |||
'@kartik/mpdf' => $vendorDir . '/kartik-v/yii2-mpdf', | |||
), | |||
), | |||
); |
@@ -1 +0,0 @@ | |||
/composer.lock |
@@ -1,6 +1,15 @@ | |||
Yii Framework 2 composer extension Change Log | |||
============================================= | |||
2.0.5 December 20, 2016 | |||
----------------------- | |||
- Bug #11: `generateCookieValidationKey()` now saves config file only when `cookieValidationKey` was generated (rob006) | |||
- Enh #10: Added `yii\composer\Installer::postInstall()` method (rob006) | |||
- Enh #12: Added `yii\composer\Installer::copyFiles()` method (rob006) | |||
- Enh #14: A note about yii UPGRADE notes file is shown after upgrading Yii to make user aware of it (cebe) | |||
2.0.4 February 06, 2016 | |||
----------------------- | |||
@@ -11,6 +11,7 @@ use Composer\Package\PackageInterface; | |||
use Composer\Installer\LibraryInstaller; | |||
use Composer\Repository\InstalledRepositoryInterface; | |||
use Composer\Script\CommandEvent; | |||
use Composer\Script\Event; | |||
use Composer\Util\Filesystem; | |||
/** | |||
@@ -228,12 +229,40 @@ EOF | |||
rmdir($yiiDir); | |||
} | |||
} | |||
/** | |||
* Special method to run tasks defined in `[extra][yii\composer\Installer::postCreateProject]` key in `composer.json` | |||
* | |||
* @param Event $event | |||
*/ | |||
public static function postCreateProject($event) | |||
{ | |||
static::runCommands($event, __METHOD__); | |||
} | |||
/** | |||
* Special method to run tasks defined in `[extra][yii\composer\Installer::postInstall]` key in `composer.json` | |||
* | |||
* @param Event $event | |||
* @since 2.0.5 | |||
*/ | |||
public static function postInstall($event) | |||
{ | |||
static::runCommands($event, __METHOD__); | |||
} | |||
/** | |||
* Special method to run tasks defined in `[extra][$extraKey]` key in `composer.json` | |||
* | |||
* @param Event $event | |||
* @param string $extraKey | |||
* @since 2.0.5 | |||
*/ | |||
protected static function runCommands($event, $extraKey) | |||
{ | |||
$params = $event->getComposer()->getPackage()->getExtra(); | |||
if (isset($params[__METHOD__]) && is_array($params[__METHOD__])) { | |||
foreach ($params[__METHOD__] as $method => $args) { | |||
if (isset($params[$extraKey]) && is_array($params[$extraKey])) { | |||
foreach ($params[$extraKey] as $method => $args) { | |||
call_user_func_array([__CLASS__, $method], (array) $args); | |||
} | |||
} | |||
@@ -271,8 +300,10 @@ EOF | |||
$key = self::generateRandomString(); | |||
foreach ($configs as $config) { | |||
if (is_file($config)) { | |||
$content = preg_replace('/(("|\')cookieValidationKey("|\')\s*=>\s*)(""|\'\')/', "\\1'$key'", file_get_contents($config)); | |||
file_put_contents($config, $content); | |||
$content = preg_replace('/(("|\')cookieValidationKey("|\')\s*=>\s*)(""|\'\')/', "\\1'$key'", file_get_contents($config), -1, $count); | |||
if ($count > 0) { | |||
file_put_contents($config, $content); | |||
} | |||
} | |||
} | |||
} | |||
@@ -286,4 +317,44 @@ EOF | |||
$bytes = openssl_random_pseudo_bytes($length); | |||
return strtr(substr(base64_encode($bytes), 0, $length), '+/=', '_-.'); | |||
} | |||
/** | |||
* Copy files to specified locations. | |||
* @param array $paths The source files paths (keys) and the corresponding target locations | |||
* for copied files (values). Location can be specified as an array - first element is target | |||
* location, second defines whether file can be overwritten (by default method don't overwrite | |||
* existing files). | |||
* @since 2.0.5 | |||
*/ | |||
public static function copyFiles(array $paths) | |||
{ | |||
foreach ($paths as $source => $target) { | |||
// handle file target as array [path, overwrite] | |||
$target = (array) $target; | |||
echo "Copying file $source to $target[0] - "; | |||
if (!is_file($source)) { | |||
echo "source file not found.\n"; | |||
continue; | |||
} | |||
if (is_file($target[0]) && empty($target[1])) { | |||
echo "target file exists - skip.\n"; | |||
continue; | |||
} elseif (is_file($target[0]) && !empty($target[1])) { | |||
echo "target file exists - overwrite - "; | |||
} | |||
try { | |||
if (!is_dir(dirname($target[0]))) { | |||
mkdir(dirname($target[0]), 0777, true); | |||
} | |||
if (copy($source, $target[0])) { | |||
echo "done.\n"; | |||
} | |||
} catch (\Exception $e) { | |||
echo $e->getMessage() . "\n"; | |||
} | |||
} | |||
} | |||
} |
@@ -8,8 +8,14 @@ | |||
namespace yii\composer; | |||
use Composer\Composer; | |||
use Composer\DependencyResolver\Operation\UpdateOperation; | |||
use Composer\EventDispatcher\EventSubscriberInterface; | |||
use Composer\Installer\PackageEvent; | |||
use Composer\Installer\PackageEvents; | |||
use Composer\IO\IOInterface; | |||
use Composer\Plugin\PluginInterface; | |||
use Composer\Script; | |||
use Composer\Script\ScriptEvents; | |||
/** | |||
* Plugin is the composer plugin that registers the Yii composer installer. | |||
@@ -17,8 +23,18 @@ use Composer\Plugin\PluginInterface; | |||
* @author Qiang Xue <qiang.xue@gmail.com> | |||
* @since 2.0 | |||
*/ | |||
class Plugin implements PluginInterface | |||
class Plugin implements PluginInterface, EventSubscriberInterface | |||
{ | |||
/** | |||
* @var array noted package updates. | |||
*/ | |||
private $_packageUpdates = []; | |||
/** | |||
* @var string path to the vendor directory. | |||
*/ | |||
private $_vendorDir; | |||
/** | |||
* @inheritdoc | |||
*/ | |||
@@ -26,10 +42,167 @@ class Plugin implements PluginInterface | |||
{ | |||
$installer = new Installer($io, $composer); | |||
$composer->getInstallationManager()->addInstaller($installer); | |||
$file = rtrim($composer->getConfig()->get('vendor-dir'), '/') . '/yiisoft/extensions.php'; | |||
$this->_vendorDir = rtrim($composer->getConfig()->get('vendor-dir'), '/'); | |||
$file = $this->_vendorDir . '/yiisoft/extensions.php'; | |||
if (!is_file($file)) { | |||
@mkdir(dirname($file), 0777, true); | |||
file_put_contents($file, "<?php\n\nreturn [];\n"); | |||
} | |||
} | |||
/** | |||
* @inheritdoc | |||
* @return array The event names to listen to. | |||
*/ | |||
public static function getSubscribedEvents() | |||
{ | |||
return [ | |||
PackageEvents::POST_PACKAGE_UPDATE => 'checkPackageUpdates', | |||
ScriptEvents::POST_UPDATE_CMD => 'showUpgradeNotes', | |||
]; | |||
} | |||
/** | |||
* Listen to POST_PACKAGE_UPDATE event and take note of the package updates. | |||
* @param PackageEvent $event | |||
*/ | |||
public function checkPackageUpdates(PackageEvent $event) | |||
{ | |||
$operation = $event->getOperation(); | |||
if ($operation instanceof UpdateOperation) { | |||
$this->_packageUpdates[$operation->getInitialPackage()->getName()] = [ | |||
'from' => $operation->getInitialPackage()->getVersion(), | |||
'fromPretty' => $operation->getInitialPackage()->getPrettyVersion(), | |||
'to' => $operation->getTargetPackage()->getVersion(), | |||
'toPretty' => $operation->getTargetPackage()->getPrettyVersion(), | |||
'direction' => $event->getPolicy()->versionCompare( | |||
$operation->getInitialPackage(), | |||
$operation->getTargetPackage(), | |||
'<' | |||
) ? 'up' : 'down', | |||
]; | |||
} | |||
} | |||
/** | |||
* Listen to POST_UPDATE_CMD event to display information about upgrade notes if appropriate. | |||
* @param Script\Event $event | |||
*/ | |||
public function showUpgradeNotes(Script\Event $event) | |||
{ | |||
$packageName = 'yiisoft/yii2'; | |||
if (!isset($this->_packageUpdates[$packageName])) { | |||
return; | |||
} | |||
$package = $this->_packageUpdates['yiisoft/yii2']; | |||
// do not show a notice on up/downgrades between dev versions | |||
// avoid messages like from version dev-master to dev-master | |||
if ($package['fromPretty'] == $package['toPretty']) { | |||
return; | |||
} | |||
$io = $event->getIO(); | |||
// print the relevant upgrade notes for the upgrade | |||
// - only on upgrade, not on downgrade | |||
// - only if the "from" version is non-dev, otherwise we have no idea which notes to show | |||
if ($package['direction'] === 'up' && $this->isNumericVersion($package['fromPretty'])) { | |||
$notes = $this->findUpgradeNotes($packageName, $package['fromPretty']); | |||
if ($notes !== false && empty($notes)) { | |||
// no relevent upgrade notes, do not show anything. | |||
return; | |||
} | |||
$this->printUpgradeIntro($io, $package); | |||
if ($notes) { | |||
// safety check: do not display notes if they are too many | |||
if (count($notes) > 250) { | |||
$io->write("\n <fg=yellow;options=bold>The relevant notes for your upgrade are too long to be displayed here.</>"); | |||
} else { | |||
$io->write("\n " . trim(implode("\n ", $notes))); | |||
} | |||
} | |||
$io->write("\n You can find the upgrade notes for all versions online at:"); | |||
} else { | |||
$this->printUpgradeIntro($io, $package); | |||
$io->write("\n You can find the upgrade notes online at:"); | |||
} | |||
$this->printUpgradeLink($io, $package); | |||
} | |||
/** | |||
* Print link to upgrade notes | |||
* @param IOInterface $io | |||
* @param array $package | |||
*/ | |||
private function printUpgradeLink($io, $package) | |||
{ | |||
$maxVersion = $package['direction'] === 'up' ? $package['toPretty'] : $package['fromPretty']; | |||
// make sure to always show a valid link, even if $maxVersion is something like dev-master | |||
if (!$this->isNumericVersion($maxVersion)) { | |||
$maxVersion = 'master'; | |||
} | |||
$io->write(" https://github.com/yiisoft/yii2/blob/$maxVersion/framework/UPGRADE.md\n"); | |||
} | |||
/** | |||
* Print upgrade intro | |||
* @param IOInterface $io | |||
* @param array $package | |||
*/ | |||
private function printUpgradeIntro($io, $package) | |||
{ | |||
$io->write("\n <fg=yellow;options=bold>Seems you have " | |||
. ($package['direction'] === 'up' ? 'upgraded' : 'downgraded') | |||
. ' Yii Framework from version ' | |||
. $package['fromPretty'] . ' to ' . $package['toPretty'] . '.</>' | |||
); | |||
$io->write("\n <options=bold>Please check the upgrade notes for possible incompatible changes"); | |||
$io->write(' and adjust your application code accordingly.</>'); | |||
} | |||
/** | |||
* Read upgrade notes from a files and returns an array of lines | |||
* @param string $packageName | |||
* @param string $fromVersion until which version to read the notes | |||
* @return array|false | |||
*/ | |||
private function findUpgradeNotes($packageName, $fromVersion) | |||
{ | |||
$upgradeFile = $this->_vendorDir . '/' . $packageName . '/UPGRADE.md'; | |||
if (!is_file($upgradeFile) || !is_readable($upgradeFile)) { | |||
return false; | |||
} | |||
$lines = preg_split('~\R~', file_get_contents($upgradeFile)); | |||
$relevantLines = []; | |||
$consuming = false; | |||
foreach($lines as $line) { | |||
if (preg_match('/^Upgrade from Yii ([0-9]\.[0-9]+\.?[0-9]*)/i', $line, $matches)) { | |||
if (version_compare($matches[1], $fromVersion, '<')) { | |||
break; | |||
} | |||
$consuming = true; | |||
} | |||
if ($consuming) { | |||
$relevantLines[] = $line; | |||
} | |||
} | |||
return $relevantLines; | |||
} | |||
/** | |||
* Check whether a version is numeric, e.g. 2.0.10. | |||
* @param string $version | |||
* @return int|false | |||
*/ | |||
private function isNumericVersion($version) | |||
{ | |||
return preg_match('~^([0-9]\.[0-9]+\.?[0-9]*)~', $version); | |||
} | |||
} |
@@ -14,14 +14,16 @@ For license information check the [LICENSE](LICENSE.md)-file. | |||
Usage | |||
----- | |||
To use Yii 2 composer installer, simply set `type` to be `yii2-extension` in your `composer.json`, | |||
The Yii 2 Composer Installer is automatically installed with when installing the framework via Composer. | |||
To use Yii 2 composer installer, simply set the package `type` to be `yii2-extension` in your `composer.json`, | |||
like the following: | |||
```json | |||
{ | |||
"type": "yii2-extension", | |||
"require": { | |||
"yiisoft/yii2": "*" | |||
"yiisoft/yii2": "~2.0.0" | |||
}, | |||
... | |||
} | |||
@@ -40,10 +42,11 @@ the Yii 2 application is responding to a request. For example, | |||
} | |||
``` | |||
The `Installer` class also implements a static method `setPermission()` that can be called after | |||
a Yii 2 projected is installed, through the `post-create-project-cmd` composer script. | |||
The method will set specified directories or files to be writable or executable, depending on | |||
the corresponding parameters set in the `extra` section of the `composer.json` file. | |||
The `Installer` class also implements a static method `postCreateProject()` that can be called after | |||
a Yii 2 project is created, through the `post-create-project-cmd` composer script. | |||
A similar method exists for running tasks after each `composer install` call, which sis `postInstall()`. | |||
These methods allow to run other `Installer` class methods like `setPermission()` or `generateCookieValidationKey()`, | |||
depending on the corresponding parameters set in the `extra` section of the `composer.json` file. | |||
For example, | |||
```json | |||
@@ -53,17 +56,35 @@ For example, | |||
... | |||
"scripts": { | |||
"post-create-project-cmd": [ | |||
"yii\\composer\\Installer::setPermission" | |||
"yii\\composer\\Installer::postCreateProject" | |||
], | |||
"post-install-cmd": [ | |||
"yii\\composer\\Installer::postInstall" | |||
] | |||
}, | |||
"extra": { | |||
"writable": [ | |||
"runtime", | |||
"web/assets" | |||
], | |||
"executable": [ | |||
"yii" | |||
] | |||
"yii\\composer\\Installer::postCreateProject": { | |||
"setPermission": [ | |||
{ | |||
"runtime": "0777", | |||
"web/assets": "0777", | |||
"yii": "0755" | |||
} | |||
] | |||
}, | |||
"yii\\composer\\Installer::postInstall": { | |||
"copyFiles": [ | |||
{ | |||
"config/templates/console-local.php": "config/console-local.php", | |||
"config/templates/web-local.php": "config/web-local.php", | |||
"config/templates/db-local.php": "config/db-local.php", | |||
"config/templates/cache.json": ["runtime/cache.json", true] | |||
} | |||
], | |||
"generateCookieValidationKey": [ | |||
"config/web-local.php" | |||
] | |||
} | |||
} | |||
} | |||
``` |
@@ -20,6 +20,9 @@ | |||
"require": { | |||
"composer-plugin-api": "^1.0" | |||
}, | |||
"require-dev": { | |||
"composer/composer": "^1.0" | |||
}, | |||
"autoload": { | |||
"psr-4": { "yii\\composer\\": "" } | |||
}, |
@@ -1,6 +1,33 @@ | |||
Yii Framework 2 debug extension Change Log | |||
========================================== | |||
2.0.7 under development | |||
----------------------- | |||
- Bug #61: Fixed toolbar not to be cached by using renderDynamic (dynasource) | |||
- Bug #93: Fixed `AssetPanel` error when bundle `$js` or `$css` contained `jsOptions` overrides (Razzwan, samdark) | |||
- Bug #99: Avoid serializing php7 errors (zuozp8) | |||
- Bug #111: Fixed `LogTarget` to work properly when tests are ran via Codeception (samdark, nlmedina) | |||
- Bug #120: Fixed toolbar height changing when opened/closed and when using bootstrap (nkovacs) | |||
- Bug #148: Don't animate iframe needlessly when window is resized. (nkovacs) | |||
- Bug #150: Fixed "Cannot read property 'replaceChild' of null" error (BetsuNo) | |||
- Bug #152: Fixed log search to work with non-scalar values (samdark) | |||
- Bug #160: Remove height as it prevents the background from stretching, causing unreadable overlapping texts over background (dynasource) | |||
- Bug #168: Fixed wrong toggle button direction (fps01) | |||
- Enh #8: Added ability to configure default sorting and filtering for Database panel (laszlovl) | |||
- Enh #27: Adjusted sorting defaults, removed row numbers from database, log and profiling panels (samdark) | |||
- Enh #58: Added timeline panel (bashkarev) | |||
- Enh #97: Added AJAX requests handling (bashkarev) | |||
- Enh #105: Enhanced `ConfigPanel` to detect and report memcached extension presence (samdark) | |||
- Enh #115: Make the default panel configurable and set it to `log` (mikehaertl) | |||
- Enh #117: Added ability to customize the logo with `Module::setYiiLogo()` (brandonkelly) | |||
- Enh #143: Added application version display at `ConfigPanel` (klimov-paul) | |||
- Enh #145: The error and warning labels of the log section on the summary bar now link directly to the log page filtered by log level type (rhertogh) | |||
- Enh #162: Added ability to config the trace file and line number (thiagotalma) | |||
- Enh: Mouse wheel click, or Ctrl+Click opens debugger in new tab (silverfire) | |||
- Enh: `yii\debug\Module::defaultVersion()` implemented to pick up 'yiisoft/yii2-debug' extension version (klimov-paul) | |||
2.0.6 March 17, 2016 | |||
-------------------- | |||
@@ -109,7 +109,7 @@ class LogTarget extends Target | |||
* And if requested, it will also export the filtering result to specific medium (e.g. email). | |||
* @param array $messages log messages to be processed. See [[\yii\log\Logger::messages]] for the structure | |||
* of each message. | |||
* @param boolean $final whether this method is called at the end of the current application | |||
* @param bool $final whether this method is called at the end of the current application | |||
*/ | |||
public function collect($messages, $final) | |||
{ | |||
@@ -140,6 +140,10 @@ class LogTarget extends Target | |||
*/ | |||
protected function collectSummary() | |||
{ | |||
if (Yii::$app === null) { | |||
return ''; | |||
} | |||
$request = Yii::$app->getRequest(); | |||
$response = Yii::$app->getResponse(); | |||
$summary = [ | |||
@@ -163,7 +167,7 @@ class LogTarget extends Target | |||
/** | |||
* Returns total sql count executed in current request. If database panel is not configured | |||
* returns 0. | |||
* @return integer | |||
* @return int | |||
*/ | |||
protected function getSqlTotalCount() | |||
{ |
@@ -9,6 +9,7 @@ namespace yii\debug; | |||
use Yii; | |||
use yii\base\Component; | |||
use yii\helpers\ArrayHelper; | |||
use yii\helpers\Url; | |||
/** | |||
@@ -96,13 +97,42 @@ class Panel extends Component | |||
} | |||
/** | |||
* @param null|array $additionalParams Optional additional parameters to add to the route | |||
* @return string URL pointing to panel detail view | |||
*/ | |||
public function getUrl() | |||
public function getUrl($additionalParams = null) | |||
{ | |||
return Url::toRoute(['/' . $this->module->id . '/default/view', | |||
$route = [ | |||
'/' . $this->module->id . '/default/view', | |||
'panel' => $this->id, | |||
'tag' => $this->tag, | |||
]); | |||
]; | |||
if (is_array($additionalParams)){ | |||
$route = ArrayHelper::merge($route, $additionalParams); | |||
} | |||
return Url::toRoute($route); | |||
} | |||
/** | |||
* Returns a trace line | |||
* @param array $options The array with trace | |||
* @return string the trace line | |||
* @since 2.0.7 | |||
*/ | |||
public function getTraceLine($options) | |||
{ | |||
if (!isset($options['text'])) { | |||
$options['text'] = "{$options['file']}:{$options['line']}"; | |||
} | |||
$traceLine = $this->module->traceLine; | |||
if ($traceLine === false) { | |||
return $options['text']; | |||
} else { | |||
$options['file'] = str_replace('\\', '/', $options['file']); | |||
$rawLink = $traceLine instanceof \Closure ? call_user_func($traceLine, $options, $this) : $traceLine; | |||
return strtr($rawLink, ['{file}' => $options['file'], '{line}' => $options['line'], '{text}' => $options['text']]); | |||
} | |||
} | |||
} |