├── .eslintrc ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── docs ├── example.html ├── logo │ ├── github.svg │ ├── makina.svg │ └── npm.svg ├── meta.js ├── meta.json └── style.css ├── images ├── measure-control.png └── measure-control.svg ├── index.html ├── leaflet.measurecontrol.css ├── leaflet.measurecontrol.js ├── leaflet.measurecontrol.min.js └── package.json /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "makina", 3 | "env": { 4 | "browser": true, 5 | "amd": true, 6 | "es6": false 7 | }, 8 | "parserOptions": { 9 | "ecmaVersion": 5, 10 | "sourceType": "script" 11 | }, 12 | "rules": { 13 | "comma-dangle": ["off"], 14 | "func-names": ["off"], 15 | "global-require": ["off"], 16 | "indent": [2, 2, { "SwitchCase": 1, "VariableDeclarator": 1, "outerIIFEBody": 1 }], 17 | "no-console": 1, 18 | "no-param-reassign": 0, 19 | "no-underscore-dangle": 0, 20 | "no-var": ["off"], 21 | "object-shorthand": ["off"], 22 | "prefer-template": ["off"], 23 | "prefer-arrow-callback": ["off"] 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | 1.2.0 / 2018-03-09 3 | ================== 4 | 5 | * Put changelog in a dedicated file 6 | * Lint README file and add languages to code blocks 7 | * Enforce new ESLint setup 8 | * Use eslint-config-makina for linting and adapt rules 9 | * Set leaflet Draw as peerDependency 10 | * Add npm script for linting 11 | * Adapt and enforce eslint rules 12 | * Migrate from minifier to uglifyjs 13 | * Upgrade normalize.css to latest version 14 | * Regroup scripts and styles by dependencies 15 | * Simplify demo by including css and style from current project 16 | * Remove useless elements in demo html 17 | * Embed demo scripts in html 18 | * Use Leaflet Draw from CDN instead of including it in sources 19 | * Config responsive menu and add github logo 20 | 21 | 1.1.0 / 2016-09-05 22 | ================== 23 | 24 | * Add npm support 25 | * Add support for AMD and CommonJS loading 26 | * Set example in docs folder 27 | 28 | 1.0.0 29 | ===== 30 | 31 | * Initial version 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013, Makina Corpus 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, 5 | are permitted provided that the following conditions are met: 6 | 7 | Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | Redistributions in binary form must reproduce the above copyright notice, this 11 | list of conditions and the following disclaimer in the documentation and/or 12 | other materials provided with the distribution. 13 | 14 | Neither the name of the {organization} nor the names of its 15 | contributors may be used to endorse or promote products derived from 16 | this software without specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 19 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 22 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 25 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 27 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | npm 2 | npm 3 | 4 | Leaflet.MeasureControl 5 | ====================== 6 | 7 | Leaflet control to mesure distances on the map. 8 | 9 | Requires [Leaflet.Draw](https://github.com/leaflet/Leaflet.Draw#readme) 10 | 11 | Check out the [demo](http://makinacorpus.github.io/Leaflet.MeasureControl/) 12 | 13 | Install 14 | ------- 15 | 16 | ```shell 17 | npm install leaflet.measurecontrol 18 | ``` 19 | 20 | Usage 21 | ----- 22 | 23 | As map option: 24 | 25 | ```js 26 | var map = L.map('map', { measureControl:true }); 27 | ``` 28 | 29 | Or like any control: 30 | 31 | ```js 32 | L.Control.measureControl().addTo(map); 33 | ``` 34 | 35 | Development 36 | ----------- 37 | 38 | ```shell 39 | npm install # install dependencies 40 | npm run release # minify js and copy sources in docs (example) 41 | ``` 42 | 43 | Changelog 44 | --------- 45 | 46 | See [CHANGELOG.md](./CHANGELOG.md). 47 | 48 | Authors 49 | ------- 50 | 51 | * Gilles Bassière 52 | * Alexandra Janin 53 | 54 | [![Makina Corpus](http://depot.makina-corpus.org/public/logo.gif)](http://makinacorpus.com) 55 | -------------------------------------------------------------------------------- /docs/example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | l 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 |
23 |
24 | 25 | 36 | 37 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /docs/logo/github.svg: -------------------------------------------------------------------------------- 1 | GitHub -------------------------------------------------------------------------------- /docs/logo/makina.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 18 | 22 | 25 | 27 | 31 | 35 | 45 | 53 | 61 | 68 | 74 | 90 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /docs/logo/npm.svg: -------------------------------------------------------------------------------- 1 | npm -------------------------------------------------------------------------------- /docs/meta.js: -------------------------------------------------------------------------------- 1 | const logJson = async () => { 2 | const reponse = await fetch('docs/meta.json'); 3 | return await reponse.json(); 4 | } 5 | 6 | (async () => { 7 | const meta = await logJson() 8 | document.querySelector("title").innerText= meta.name 9 | document.querySelector(".demo-name").innerText= meta.name 10 | if (meta.npm){ 11 | document.querySelector(".npm").href="https://www.npmjs.com/package/" + meta.npm 12 | document.querySelector(".npm .title").innerText= meta.npm 13 | }else{ 14 | document.querySelector(".npm").remove() 15 | } 16 | document.querySelector(".sources").href= meta.github 17 | document.querySelector(".readme-md").src= meta.github.replace("github.com","raw.githubusercontent.com") + "HEAD/README.md" 18 | if (meta.moreInfo){ 19 | document.querySelector(".moreInfo").innerText= meta.moreInfo 20 | } 21 | })() 22 | 23 | 24 | -------------------------------------------------------------------------------- /docs/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "Leaflet.MeasureControl", 3 | "github" : "https://github.com/makinacorpus/Leaflet.MeasureControl/", 4 | "npm" : "leaflet.measurecontrol" 5 | } -------------------------------------------------------------------------------- /docs/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | font-family: "Helvetica", arial, sans-serif; 4 | } 5 | 6 | html, 7 | body { 8 | height: 100%; 9 | width: 100%; 10 | overflow: hidden; 11 | } 12 | 13 | * { 14 | box-sizing: inherit; 15 | } 16 | 17 | body { 18 | display: flex; 19 | flex-direction: column; 20 | } 21 | 22 | header { 23 | padding: 0.5rem 1rem; 24 | background: #20273c; 25 | color: white; 26 | display: flex; 27 | z-index: 2; 28 | justify-content: space-between; 29 | } 30 | 31 | header a { 32 | color: white; 33 | } 34 | 35 | main { 36 | z-index: 1; 37 | display: flex; 38 | position: relative; 39 | overflow: hidden; 40 | height: 100%; 41 | flex-shrink: 1; 42 | } 43 | 44 | header, 45 | main { 46 | width: 100%; 47 | } 48 | 49 | h1 { 50 | margin: 0; 51 | font-size: 1.5rem; 52 | padding: 0.7rem; 53 | } 54 | 55 | h2 { 56 | margin: 0; 57 | font-size: 1.2rem; 58 | } 59 | 60 | /* ---- MENU ---- */ 61 | 62 | .menu { 63 | display: flex; 64 | justify-content: space-around; 65 | align-items: center; 66 | } 67 | 68 | .menu .title { 69 | padding-top: 5px; 70 | } 71 | 72 | .menu > a { 73 | display: flex; 74 | align-items: center; 75 | font-weight: 700; 76 | text-decoration: none; 77 | padding: 0rem; 78 | text-align: right; 79 | margin: 0 0.4rem; 80 | } 81 | 82 | .menu a:hover, 83 | .menu a:focus { 84 | text-decoration: underline; 85 | } 86 | 87 | .menu-toggle { 88 | background: none; 89 | border: none; 90 | outline: none; 91 | cursor: pointer; 92 | display: none; 93 | } 94 | 95 | .menu-toggle.close .bar:nth-child(1) { 96 | transform: translateY(7px) rotateZ(45deg); 97 | } 98 | 99 | .menu-toggle.close .bar:nth-child(2) { 100 | transform: translateX(300px); 101 | } 102 | 103 | .menu-toggle.close .bar:nth-child(3) { 104 | transform: translateY(-7px) rotateZ(-45deg); 105 | } 106 | 107 | .bar { 108 | display: block; 109 | height: 2px; 110 | width: 20px; 111 | margin: 5px 0; 112 | background: white; 113 | border-radius: 2px; 114 | transition: transform 0.2s ease-out; 115 | } 116 | 117 | .icon { 118 | height: 24px; 119 | margin: 4px; 120 | } 121 | 122 | .logo { 123 | height: 50px; 124 | } 125 | 126 | #map { 127 | height: 50%; 128 | width: 100%; 129 | } 130 | 131 | /* ---- SIDEBAR ---- */ 132 | 133 | .side { 134 | background-color: #ffffff; 135 | width: 360px; 136 | height: 100%; 137 | flex-shrink: 0; 138 | overflow-y: scroll; 139 | color: rgb(0, 0, 0); 140 | border-left: 1px solid rgba(0, 0, 0, 0.3); 141 | } 142 | .side h1 { 143 | margin-top: 10px; 144 | margin-bottom: 16px; 145 | padding: 0.7px; 146 | padding-bottom: 5px; 147 | margin-left: 5px; 148 | line-height: 1.2; 149 | border-bottom: 1px solid rgba(0,0,0,0.12); 150 | } 151 | 152 | #demoIframe{ 153 | border: none; 154 | } 155 | 156 | @media screen and (max-width: 850px) { 157 | .side { 158 | position: absolute; 159 | transform: translateX(0px); 160 | right: 0; 161 | transition: 162 | transform 0.2s ease-out, 163 | box-shadow 0.2s ease-out; 164 | 165 | max-width: 100vw; 166 | -webkit-box-shadow: -5px 0px 15px 0px rgba(0,0,0,0.5); 167 | -moz-box-shadow: -5px 0px 15px 0px rgba(0,0,0,0.5); 168 | box-shadow: -5px 0px 15px 0px rgba(0,0,0,0.5); 169 | } 170 | 171 | .side.closed { 172 | transform: translateX(360px); 173 | -webkit-box-shadow: none; 174 | -moz-box-shadow: none; 175 | box-shadow: none; 176 | } 177 | 178 | .menu a .title { 179 | display: none; 180 | } 181 | 182 | .menu-toggle { 183 | z-index: 3; 184 | display: block; 185 | } 186 | 187 | header { 188 | flex-wrap: wrap; 189 | justify-content: flex-end; 190 | } 191 | 192 | header h1 { 193 | font-size: 1em; 194 | flex-grow: 1; 195 | } 196 | .icon { 197 | height: 18px; 198 | } 199 | .logo { 200 | height: 30px; 201 | } 202 | } 203 | 204 | @media (prefers-color-scheme: dark) { 205 | .side { 206 | background-color: #0d1117; 207 | color: #ffffff; 208 | } 209 | .side h1{ 210 | border-bottom-color: rgba(255, 255, 255, 0.15); 211 | } 212 | } 213 | 214 | 215 | -------------------------------------------------------------------------------- /images/measure-control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/makinacorpus/Leaflet.MeasureControl/b1a96e9d30df44ecd3a1ba9f3e130faecd801c20/images/measure-control.png -------------------------------------------------------------------------------- /images/measure-control.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 23 | 41 | 43 | 44 | 46 | image/svg+xml 47 | 49 | 50 | 51 | 52 | 53 | 58 | 60 | 63 | 70 | 75 | 80 | 85 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |

16 | 31 |
32 |
33 | 35 | 76 |
77 | 78 | 79 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /leaflet.measurecontrol.css: -------------------------------------------------------------------------------- 1 | .leaflet-control-draw-measure { 2 | background-image: url(images/measure-control.png); 3 | } 4 | -------------------------------------------------------------------------------- /leaflet.measurecontrol.js: -------------------------------------------------------------------------------- 1 | (function (factory, window) { 2 | // define an AMD module that relies on 'leaflet' 3 | if (typeof define === 'function' && define.amd) { 4 | define(['leaflet'], function (L) { 5 | factory(L, window.toGeoJSON); 6 | }); 7 | 8 | // define a Common JS module that relies on 'leaflet' 9 | } else if (typeof exports === 'object') { 10 | module.exports = function (L) { 11 | if (L === undefined) { 12 | if (typeof window !== 'undefined') { 13 | L = require('leaflet'); // eslint-disable-line import/no-unresolved 14 | } 15 | } 16 | factory(L); 17 | return L; 18 | }; 19 | } else if (typeof window !== 'undefined' && window.L) { 20 | factory(window.L); 21 | } 22 | }(function (L) { 23 | L.Polyline.Measure = L.Draw.Polyline.extend({ 24 | addHooks: function () { 25 | L.Draw.Polyline.prototype.addHooks.call(this); 26 | if (this._map) { 27 | this._markerGroup = new L.LayerGroup(); 28 | this._map.addLayer(this._markerGroup); 29 | 30 | this._markers = []; 31 | this._map.on('click', this._onClick, this); 32 | this._startShape(); 33 | } 34 | }, 35 | 36 | removeHooks: function () { 37 | L.Draw.Polyline.prototype.removeHooks.call(this); 38 | 39 | this._clearHideErrorTimeout(); 40 | 41 | // !\ Still useful when control is disabled before any drawing (refactor needed?) 42 | this._map 43 | .off('pointermove', this._onMouseMove, this) 44 | .off('mousemove', this._onMouseMove, this) 45 | .off('click', this._onClick, this); 46 | 47 | this._clearGuides(); 48 | this._container.style.cursor = ''; 49 | 50 | this._removeShape(); 51 | }, 52 | 53 | _startShape: function () { 54 | this._drawing = true; 55 | this._poly = new L.Polyline([], this.options.shapeOptions); 56 | // this is added as a placeholder, if leaflet doesn't recieve 57 | // this when the tool is turned off all onclick events are removed 58 | this._poly._onClick = function () {}; 59 | 60 | this._container.style.cursor = 'crosshair'; 61 | 62 | this._updateTooltip(); 63 | this._map 64 | .on('pointermove', this._onMouseMove, this) 65 | .on('mousemove', this._onMouseMove, this); 66 | }, 67 | 68 | _finishShape: function () { 69 | this._drawing = false; 70 | 71 | this._cleanUpShape(); 72 | this._clearGuides(); 73 | 74 | this._updateTooltip(); 75 | 76 | this._map 77 | .off('pointermove', this._onMouseMove, this) 78 | .off('mousemove', this._onMouseMove, this); 79 | 80 | this._container.style.cursor = ''; 81 | }, 82 | 83 | _removeShape: function () { 84 | if (!this._poly) return; 85 | this._map.removeLayer(this._poly); 86 | delete this._poly; 87 | this._markers.splice(0); 88 | this._markerGroup.clearLayers(); 89 | }, 90 | 91 | _onClick: function () { 92 | if (!this._drawing) { 93 | this._removeShape(); 94 | this._startShape(); 95 | } 96 | }, 97 | 98 | _getTooltipText: function () { 99 | var labelText = L.Draw.Polyline.prototype._getTooltipText.call(this); 100 | if (!this._drawing) { 101 | labelText.text = ''; 102 | } 103 | return labelText; 104 | } 105 | }); 106 | 107 | L.Control.MeasureControl = L.Control.extend({ 108 | 109 | statics: { 110 | TITLE: 'Measure distances' 111 | }, 112 | options: { 113 | position: 'topleft', 114 | handler: {} 115 | }, 116 | 117 | toggle: function () { 118 | if (this.handler.enabled()) { 119 | this.handler.disable.call(this.handler); 120 | } else { 121 | this.handler.enable.call(this.handler); 122 | } 123 | }, 124 | 125 | onAdd: function (map) { 126 | var link = null; 127 | var className = 'leaflet-control-draw'; 128 | 129 | this._container = L.DomUtil.create('div', 'leaflet-bar'); 130 | 131 | this.handler = new L.Polyline.Measure(map, this.options.handler); 132 | 133 | this.handler.on('enabled', function () { 134 | this.enabled = true; 135 | L.DomUtil.addClass(this._container, 'enabled'); 136 | }, this); 137 | 138 | this.handler.on('disabled', function () { 139 | delete this.enabled; 140 | L.DomUtil.removeClass(this._container, 'enabled'); 141 | }, this); 142 | 143 | link = L.DomUtil.create('a', className + '-measure', this._container); 144 | link.href = '#'; 145 | link.title = L.Control.MeasureControl.TITLE; 146 | 147 | L.DomEvent 148 | .addListener(link, 'click', L.DomEvent.stopPropagation) 149 | .addListener(link, 'click', L.DomEvent.preventDefault) 150 | .addListener(link, 'click', this.toggle, this); 151 | 152 | return this._container; 153 | } 154 | }); 155 | 156 | 157 | L.Map.mergeOptions({ 158 | measureControl: false 159 | }); 160 | 161 | 162 | L.Map.addInitHook(function () { 163 | if (this.options.measureControl) { 164 | this.measureControl = L.Control.measureControl().addTo(this); 165 | } 166 | }); 167 | 168 | 169 | L.Control.measureControl = function (options) { 170 | return new L.Control.MeasureControl(options); 171 | }; 172 | }, window)); 173 | -------------------------------------------------------------------------------- /leaflet.measurecontrol.min.js: -------------------------------------------------------------------------------- 1 | (function(factory,window){if(typeof define==="function"&&define.amd){define(["leaflet"],function(L){factory(L,window.toGeoJSON)})}else if(typeof exports==="object"){module.exports=function(L){if(L===undefined){if(typeof window!=="undefined"){L=require("leaflet")}}factory(L);return L}}else if(typeof window!=="undefined"&&window.L){factory(window.L)}})(function(L){L.Polyline.Measure=L.Draw.Polyline.extend({addHooks:function(){L.Draw.Polyline.prototype.addHooks.call(this);if(this._map){this._markerGroup=new L.LayerGroup;this._map.addLayer(this._markerGroup);this._markers=[];this._map.on("click",this._onClick,this);this._startShape()}},removeHooks:function(){L.Draw.Polyline.prototype.removeHooks.call(this);this._clearHideErrorTimeout();this._map.off("pointermove",this._onMouseMove,this).off("mousemove",this._onMouseMove,this).off("click",this._onClick,this);this._clearGuides();this._container.style.cursor="";this._removeShape()},_startShape:function(){this._drawing=true;this._poly=new L.Polyline([],this.options.shapeOptions);this._poly._onClick=function(){};this._container.style.cursor="crosshair";this._updateTooltip();this._map.on("pointermove",this._onMouseMove,this).on("mousemove",this._onMouseMove,this)},_finishShape:function(){this._drawing=false;this._cleanUpShape();this._clearGuides();this._updateTooltip();this._map.off("pointermove",this._onMouseMove,this).off("mousemove",this._onMouseMove,this);this._container.style.cursor=""},_removeShape:function(){if(!this._poly)return;this._map.removeLayer(this._poly);delete this._poly;this._markers.splice(0);this._markerGroup.clearLayers()},_onClick:function(){if(!this._drawing){this._removeShape();this._startShape();return}},_getTooltipText:function(){var labelText=L.Draw.Polyline.prototype._getTooltipText.call(this);if(!this._drawing){labelText.text=""}return labelText}});L.Control.MeasureControl=L.Control.extend({statics:{TITLE:"Measure distances"},options:{position:"topleft",handler:{}},toggle:function(){if(this.handler.enabled()){this.handler.disable.call(this.handler)}else{this.handler.enable.call(this.handler)}},onAdd:function(map){var link=null;var className="leaflet-control-draw";this._container=L.DomUtil.create("div","leaflet-bar");this.handler=new L.Polyline.Measure(map,this.options.handler);this.handler.on("enabled",function(){this.enabled=true;L.DomUtil.addClass(this._container,"enabled")},this);this.handler.on("disabled",function(){delete this.enabled;L.DomUtil.removeClass(this._container,"enabled")},this);link=L.DomUtil.create("a",className+"-measure",this._container);link.href="#";link.title=L.Control.MeasureControl.TITLE;L.DomEvent.addListener(link,"click",L.DomEvent.stopPropagation).addListener(link,"click",L.DomEvent.preventDefault).addListener(link,"click",this.toggle,this);return this._container}});L.Map.mergeOptions({measureControl:false});L.Map.addInitHook(function(){if(this.options.measureControl){this.measureControl=L.Control.measureControl().addTo(this)}});L.Control.measureControl=function(options){return new L.Control.MeasureControl(options)}},window); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "leaflet.measurecontrol", 3 | "version": "1.2.0", 4 | "description": "Leaflet control to mesure distances on the map.", 5 | "main": "leaflet.measurecontrol.js", 6 | "scripts": { 7 | "build": "uglifyjs leaflet.measurecontrol.js --output leaflet.measurecontrol.min.js", 8 | "lint": "eslint leaflet.measurecontrol.js" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/makinacorpus/Leaflet.MeasureControl.git" 13 | }, 14 | "keywords": [ 15 | "leaflet", 16 | "measure" 17 | ], 18 | "author": "Makina Corpus (http://makina-corpus.com/)", 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/makinacorpus/Leaflet.MeasureControl/issues" 22 | }, 23 | "homepage": "https://github.com/makinacorpus/Leaflet.MeasureControl#readme", 24 | "devDependencies": { 25 | "eslint": "~4.18.2", 26 | "eslint-config-airbnb-base": "^5.0.3", 27 | "uglify-js": "~3.3.13", 28 | "eslint-config-makina": "~0.3.0", 29 | "eslint-plugin-import": "~2.9.0" 30 | }, 31 | "peerDependencies": { 32 | "leaflet-draw": "^0.3.2", 33 | "leaflet": "^0.7.3" 34 | }, 35 | "dependencies": {} 36 | } 37 | --------------------------------------------------------------------------------