diff --git a/client/js/dpaste.js b/client/js/dpaste.js new file mode 100644 index 0000000..cbb18a0 --- /dev/null +++ b/client/js/dpaste.js @@ -0,0 +1,100 @@ +/*jshint strict:false */ + +if (typeof console === "undefined" || typeof console.log === "undefined") { + console = {}; + console.log = function () { }; +} + +// ----------------------------------------------------------------------------- +// Add data-platform to the body tag to show platform related shortcuts +// ----------------------------------------------------------------------------- +const isWindows = navigator.appVersion.indexOf("Win") !== -1; +document.body.dataset.platform = isWindows ? 'win' : 'mac'; + +// ----------------------------------------------------------------------------- +// Autofocus the content field on the homepage +// ----------------------------------------------------------------------------- +const af = document.querySelector(".autofocus textarea"); +if (af !== null) { + af.focus(); +} + +// ----------------------------------------------------------------------------- +// Cmd+Enter or Ctrl+Enter submits the form +// ----------------------------------------------------------------------------- +document.body.onkeydown = function(e) { + const metaKey = isWindows ? e.ctrlKey : e.metaKey; + const form = document.querySelector(".snippet-form"); + + if (form && e.keyCode === 13 && metaKey) { + form.submit(); + return false; + } +}; + + +// ----------------------------------------------------------------------------- +// Toggle Wordwrap +// ----------------------------------------------------------------------------- +const wordwrapCheckbox = document.getElementById('wordwrap'); +const snippetDiv = document.querySelector('.snippet-code'); + +function toggleWordwrap() { + if (wordwrapCheckbox.checked) { + snippetDiv.classList.add('wordwrap'); + } else { + snippetDiv.classList.remove('wordwrap'); + } +} + +if (wordwrapCheckbox && snippetDiv) { + toggleWordwrap(); + wordwrapCheckbox.onchange = toggleWordwrap; +} + +// ----------------------------------------------------------------------------- +// Line Highlighting +// ----------------------------------------------------------------------------- +const curLine = document.location.hash; +if (curLine.startsWith('#L')) { + const hashlist = curLine.substring(2).split(','); + if (hashlist.length > 0 && hashlist[0] !== '') { + hashlist.forEach(function(el) { + const line = document.getElementById(`l${el}`); + if (line) { + line.classList.add('marked'); + } + }); + } +} + +let lines = document.querySelectorAll('.snippet-code li'); +lines.forEach(function(el) { + el.onclick = function() { + el.classList.toggle('marked'); + let hash = 'L'; + let marked = document.querySelectorAll('.snippet-code li.marked'); + marked.forEach(function(line) { + if (hash !== 'L') { + hash += ','; + } + hash += line.getAttribute('id').substring(1); + }); + window.location.hash = hash; + }; +}); + +// ----------------------------------------------------------------------------- +// Copy URL to Clipboard +// ----------------------------------------------------------------------------- +const clipboardLink = document.getElementById('copyToClipboard'); +const copyToClipboardField = document.getElementById('copyToClipboardField'); + +if (clipboardLink && copyToClipboardField) { + clipboardLink.onclick = function(e) { + e.preventDefault(); + copyToClipboardField.select(); + document.execCommand("Copy"); + console.log('Copied URL to clipboard:', copyToClipboardField.value); + }; +} diff --git a/client/scss/_globals.scss b/client/scss/_globals.scss new file mode 100644 index 0000000..fb69123 --- /dev/null +++ b/client/scss/_globals.scss @@ -0,0 +1,47 @@ +body { + min-width: 800px; // FIXME: MOBILE + + background-color: $bgColor; + font-family: $baseFont; + font-weight: $baseFontRegular; +} + +body[data-code-snippet] { background-color: $codeBgColor; } + +body[data-platform=win] .platform-mac { display: none; } +body[data-platform=mac] .platform-win { display: none; } + + +.btn { + padding: 6px 0; + position: relative; + + display: inline-block; + + color: $btnTextColor; + background-color: $btnBgColor; + + border: 1px solid $btnBorderColor; + border-radius: 3px; + + font-size: 13px; + font-weight: $baseFontDemiBold; + + text-decoration: none; + text-align: center; + + cursor: pointer; + + .sep { + @include separator(); + } + + &:hover { + text-decoration: none; + background-color: darken($btnBgColor, 5%); + } + + &:active { + top: 1px; + } +} diff --git a/client/scss/_mixins.scss b/client/scss/_mixins.scss new file mode 100644 index 0000000..bfd64d7 --- /dev/null +++ b/client/scss/_mixins.scss @@ -0,0 +1,7 @@ + +// Vertical dotted separtor +@mixin separator($color: white, $margin: 4px) { + width: 0; + border-right: 2px dotted $color; + margin: 0 ($margin+2px) 0 $margin; +} diff --git a/client/scss/_reset.scss b/client/scss/_reset.scss new file mode 100644 index 0000000..199fb33 --- /dev/null +++ b/client/scss/_reset.scss @@ -0,0 +1,40 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; } + +/* HTML5 display-role reset for older browsers */ + +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; } + +body { + line-height: 1; } + +ol, ul { + list-style: none; } + +blockquote, q { + quotes: none; } + +blockquote { + &:before, &:after { + content: ''; + content: none; } } + +q { + &:before, &:after { + content: ''; + content: none; } } + +table { + border-collapse: collapse; +border-spacing: 0; } diff --git a/client/scss/components/_article.scss b/client/scss/components/_article.scss new file mode 100644 index 0000000..4c8d688 --- /dev/null +++ b/client/scss/components/_article.scss @@ -0,0 +1,42 @@ +/* + + Generic Content pages such as about or 404 error pages. + + */ + +article { + padding: 40px $boxPadding; + + font-size: 16px; + font-weight: $baseFontRegular; + line-height: 24px; + + max-width: 520px; + + color: $textColor; + + h2 { + font-size: 28px; + line-height: 36px; + margin: 0 0 30px 0; + } + + p { + margin: 30px 0; + } + + strong, b { + font-weight: $baseFontDemiBold; + } + + a:link, a:visited { + color: $linkColor; + text-decoration: underline; + text-decoration-color: lighten($linkColor, 30%); + } + + a:hover, a:active { + color: $hoverColor; + text-decoration: underline; + } +} diff --git a/dpaste/static/dpaste/_pygments.scss b/client/scss/components/_code.scss similarity index 73% rename from dpaste/static/dpaste/_pygments.scss rename to client/scss/components/_code.scss index 8a3b219..76f4b3a 100644 --- a/dpaste/static/dpaste/_pygments.scss +++ b/client/scss/components/_code.scss @@ -1,8 +1,49 @@ -// ----------------------------------------------------------------------------- -// Pygments Theme .snippet-code { + font-family: $codeFont; + font-size: 13px; + font-weight: 300; + line-height: 20px; + //overflow: auto; + color: $codeTextColor; + background-color: $codeBgColor; + padding: 20px $boxPadding; + + &.wordwrap { + overflow: auto; + li { white-space: pre-wrap !important; } + } + + ol { + position: relative; + list-style: none; + counter-reset: lineNumberCounter; + + li { + white-space: pre; + padding-left: 50px; + + &:before { + color: $codeLineNumberColor; + counter-increment: lineNumberCounter; + content: counter(lineNumberCounter); + text-align: right; + + width: 30px; + position: absolute; + display: inline-block; + left: 0px; + } + } + + li.marked { + background-color: $markerBgColor; + &:before{ color: $markerLineNumberColor; } + } + } + + // Pygments .gd { background-color: rgba(226, 12, 19, .3); color: #fff; display: block; } .gi { background-color: rgba(23, 189, 10, .2); color: #fff; display: block; } @@ -67,3 +108,20 @@ .il { color: #ae81ff } /* Literal.Number.Integer.Long */ } + + +.snippet-text { + background: $bgColor; + padding: 20px $boxPadding; + + color: $textColor; + + font-family: $textFont; + font-weight: $baseFontRegular; + font-size: 16px; + line-height: 22px; + + & > div { + max-width: 540px; + } +} diff --git a/client/scss/components/_form.scss b/client/scss/components/_form.scss new file mode 100644 index 0000000..54b277d --- /dev/null +++ b/client/scss/components/_form.scss @@ -0,0 +1,86 @@ +@mixin codeTextArea { + color: #7D7D7D; + font-family: $codeFont; + font-size: 12px; + line-height: 17px; +} + + +.snippet-form { + background-color: $bgColor; + + select { + -moz-appearance: none; + -webkit-appearance: none; + + padding: 5px 7px; + margin-right: 15px; + min-width: 160px; + + color: $selectTextColor; + background-color: $selectBgColor; + + border: 1px solid $selectBorderColor; + border-radius: 3px; + + font-family: $baseFont; + font-weight: $baseFontRegular; + font-size: 14px; + + cursor: pointer; + + // Triangle + background-image: + linear-gradient(45deg, transparent 50%, $selectTriangleColor 50%), + linear-gradient(135deg, $selectTriangleColor 50%, transparent 50%); + background-position: + calc(100% - 18px) calc(13px), + calc(100% - 13px) calc(13px), + calc(100% - 2.5em) 0.5em; + background-size: 5px 5px, 5px 5px, 3px 1.5em; + background-repeat: no-repeat; + + &:hover { + border-color: darken($selectBorderColor, 10%); + } + } + + .options { + padding: 0 $boxPadding; + height: 60px; + display: flex; + align-items: center; + border-bottom: 1px solid $borderColor; + + label { display: none; } + + .action { + margin-left: auto; + + .btn { + width: auto; + padding: 6px 20px; + } + } + } + + .content { + padding: 20px $boxPadding; + + label { display: none; } + + textarea { + padding: 20px; + @include codeTextArea; + min-height: 390px; + box-sizing: border-box; + width: 100%; + border: 1px solid $borderColor; + + &:active, &:focus { + border-color: darken($selectBorderColor, 10%) + } + } + } +} + diff --git a/client/scss/components/_header.scss b/client/scss/components/_header.scss new file mode 100644 index 0000000..8e52069 --- /dev/null +++ b/client/scss/components/_header.scss @@ -0,0 +1,115 @@ +header { + padding: 0 $boxPadding; + height: 60px; + + display: flex; + justify-content: space-between; + align-items: center; + + color: $headerTextColor; + background: linear-gradient(to right, $headerBgColor1, $headerBgColor2); + + // Subheadline e.g. Reply Bar + &.sub { + height: 45px; + } + + a { + display: inline-block; + + color: $headerTextColor; + text-decoration: none; + text-align: center; + font-weight: $baseFontBold; + + &:hover { text-decoration: underline; } + + // dpaste home link is a bit larger + &.home { + font-size: 28px; + font-weight: $baseFontHeavy; + + } + + // Nav links have a fixed width to align with grid + &.nav-link { + width: $columnWidth + $columnGap; + } + } + + .btn { + width: 2 * $columnWidth; + margin-left: $columnGap / 2; + } + + h1 { + position: relative; + font-size: 24px; + font-weight: $baseFontBold; + + strong { + font-size: 28px; + font-weight: $baseFontHeavy; + } + } + + h2 { + font-size: 16px; + font-weight: $baseFontBold; + } +} + + +ul#snippetOptions { + padding: 0 $boxPadding; + height: 40px; + + background-color: $metaBgColor; + color: $metaTextColor; + + font-size: 13px; + font-weight: $baseFontRegular; + + display: flex; + align-items: center; + + a:link, a:visited { + color: $metaTextColor; + text-decoration: underline; + } + + a:hover, a:active { + color: $hoverColor; + text-decoration: underline; + } + + li { + padding: 0 7px; + + &:first-child{ padding-left: 0; } + &:last-child{ padding-right: 0; } + } + + li.sep { + @include separator($metaTextColor); + height: 17px; + margin: 0 2px 0 1px; + padding: 0; + } +} + +#copyToClipboardField { + position: absolute; + left: -9999px; +} + +#copyToClipboard svg { + height: 30px; + position: absolute; + top: -8px; + right: -40px; + + &:active { + top: -7px; + } +} diff --git a/client/scss/components/_history.scss b/client/scss/components/_history.scss new file mode 100644 index 0000000..1bd346d --- /dev/null +++ b/client/scss/components/_history.scss @@ -0,0 +1,33 @@ + + + +.history-header { + padding: 15px $boxPadding; + color: $textColor; + font-size: 14px; + background-color: $borderColor; + + a:link, a:visited { + font-weight: $baseFontDemiBold; + color: $textColor; + text-decoration: underline; + } + + a:hover, a:active { + color: $hoverColor; + text-decoration: underline; + } + + .sep { + @include separator($metaTextColor, 10px); + height: 17px; + padding: 0; + } +} + +.history-empty { + padding: 40px $boxPadding; + color: $codeTextColor; +} + + diff --git a/client/scss/dpaste.scss b/client/scss/dpaste.scss new file mode 100755 index 0000000..e296aa9 --- /dev/null +++ b/client/scss/dpaste.scss @@ -0,0 +1,93 @@ +/* ----------------------------------------------------------------------------- + Palette +----------------------------------------------------------------------------- */ + +// General +$bgColor: white; // Regular background color for non-code snippets. + +$textColor: #7D7D7D; // General text color +$linkColor: #4A90E2; // Link color in text and content pages +$hoverColor: #72B4E4; + +$borderColor: #EDEDED; // Used for separators, select borders, etc. + +// Header +$headerTextColor: white; // Header text color +$headerBgColor1: #4A90E2; // Header gradient background left +$headerBgColor2: #72B4E4; // Header gradient background right + +$btnBgColor: #4A90E2; // Buttons (Header, Meta) +$btnBorderColor: #33639C; +$btnTextColor: white; + +// Meta Options +$metaBgColor: #F9F9F9; // Meta options of snippet +$metaTextColor: #BABABA; // Meta text and link color + +$selectBorderColor: #DDDDDD; // Select dropdowns +$selectBgColor: white; +$selectTextColor: #858585; +$selectTriangleColor: $linkColor; + +$confirmTextColor: #6D6D6D; // Yellow confirmation popup +$confirmBgColor: #FFF9A8; + +// Snippet +$messageTextColor: white; // One time message color +$messageBgColor: #F5A623; + +$codeTextColor: #dadad4; // Regular code color (not specified by pygments) +$codeBgColor: #222829; // bg color of code views +$codeDiffBgColor: #2A3335; // bg color of diff views +$codeLineNumberColor: #636363; // Color of code line numbers + +$markerLineNumberColor: gold; // Marked lines number color +$markerBgColor: rgba(255, 255, 255, .05); + +// Mobile Burger Menu +$burgerBgColor: #3D3D3D; // Burger Menu background +$burgerTextColor: #C0C0C0; // (muted) Text color of burger buttons + +$burgerBtnTextColor: #C0C0C0; // Buttons and select items in Burger Menu +$burgerBtnBorderColor: #575757; + + +/* ----------------------------------------------------------------------------- + Fonts +----------------------------------------------------------------------------- */ +$baseFont: "Avenir Next"; +$codeFont: "SF Mono", "Fira Mono", Monaco, Menlo, Consolas, monospace; +$textFont: "Apple SD Gothic Neo"; + +$baseFontLight: 300; +$baseFontRegular: 400; +$baseFontDemiBold: 500; +$baseFontBold: 600; +$baseFontHeavy: 700; + + +/* ----------------------------------------------------------------------------- + Grid +----------------------------------------------------------------------------- */ +$columnWidth: 60px; +$columnGap: 20px; + +$boxPadding: 30px; // Left/Right padding of all views +$mobileBoxPadding: 20px; + + +/* ----------------------------------------------------------------------------- + Imports +----------------------------------------------------------------------------- */ + +// Globals. +@import 'reset'; +@import 'mixins'; +@import 'globals'; + +// Components. +@import 'components/header'; +@import 'components/form'; +@import 'components/code'; +@import 'components/article'; +@import 'components/history'; diff --git a/dpaste/static/dpaste/_about.scss b/dpaste/static/dpaste/_about.scss deleted file mode 100644 index 5239714..0000000 --- a/dpaste/static/dpaste/_about.scss +++ /dev/null @@ -1,13 +0,0 @@ -// ----------------------------------------------------------------------------- -// About Page - -.page { - padding: $desktopBoxPadding; - background-color: white; - - color: #444; - - table th { - text-align: left; - } -} diff --git a/dpaste/static/dpaste/_details.scss b/dpaste/static/dpaste/_details.scss deleted file mode 100644 index 16241f6..0000000 --- a/dpaste/static/dpaste/_details.scss +++ /dev/null @@ -1,97 +0,0 @@ -// ----------------------------------------------------------------------------- -// Snippet Details - -// ----------------------------------------------------------------------------- -// Options -.snippet-options { - padding: $desktopBoxPadding; - font-size: .9rem; - - a:link, - a:visited { - margin: 0 .2em; - } - a:hover, - a:active { - text-decoration: underline; - } -} - -// ----------------------------------------------------------------------------- -// Reply Form - -.snippet-reply { - h2 { - background-color: white; - padding: $desktopBoxPadding; - padding-bottom: 0; - margin: 0; - - font-size: 1.5rem; - font-weight: 500; - } -} - -.snippet-reply[data-hidden=yes] { - opacity: 0.3; - cursor: pointer; - - * { - cursor: pointer; - } -} - -// ----------------------------------------------------------------------------- -// Text lexer - -.snippet-text { - color: #666; - font-size: 16px; - line-height: 24px; - max-width: 620px; - font-family: Helvetica, FreeSerif, serif; - font-weight: 300; -} - -// ----------------------------------------------------------------------------- -// Code Lexer - -$codeColor: #f8f8f2; -$codeLineColor: #aaa; -$codeBackgroundColor: #232829; -$markerColor: rgb(244,244,9); -$markerBackgroundColor: rgba(244,244,9,.2); - -.snippet-code { - - background: $codeBackgroundColor; - color: $codeColor; - font-family: $codeFont; - font-size: 0.8rem; - font-weight: 300; - line-height: 1.1rem; - padding: 1rem 0; - - &.wordwrap { - overflow: auto; - - li { white-space: pre-wrap !important; } - } - - ol { - margin: 0 0 0 2rem; - - li { - color: $codeLineColor; - cursor: pointer; - white-space: pre; - - &.marked { - color: $markerColor; - background-color: $markerBackgroundColor; - } - - } - } - -} diff --git a/dpaste/static/dpaste/_form.scss b/dpaste/static/dpaste/_form.scss deleted file mode 100644 index 17641ad..0000000 --- a/dpaste/static/dpaste/_form.scss +++ /dev/null @@ -1,74 +0,0 @@ -// ----------------------------------------------------------------------------- -// Snippet Form - -.snippet-form { -} - -// ----------------------------------------------------------------------------- -// The main form textarea - -.form-content { - background-color: white; - padding: 1rem 1rem; - - textarea { - box-sizing: border-box; - width: 100%; - height: 25rem; - font-family: $codeFont; - font-size: .8rem; - border: 1px solid #bbb; - padding: 1rem; - transition: border .5s linear; - - &:focus { - outline: none; - border-color: #3fca6e; - - } - } -} - -// ----------------------------------------------------------------------------- -// Additional options; lexer and expiration - -.form-options { - padding: $desktopBoxPadding; - display: flex; - justify-content: space-between; - font-size: .9rem; - - .form-options-lexer { - } - .form-options-expire { - } -} - -// ----------------------------------------------------------------------------- -// Submit line - -.form-actions { - padding: $desktopBoxPadding; - background-color: white; - - .shortcut { - font-size: .9rem; - color: #888; - letter-spacing: 1px; - } - - input[type=submit] { - color: white; - background-color: rgb(109, 163, 217); - border: none; - padding: .6em 1em; - font-weight: 500; - font-family: "SF Mono", "Fira Mono", monospace; - border-radius: 2px; - cursor: pointer; - - &:hover { - background: rgb(96, 139, 192); - } - } -} diff --git a/dpaste/static/dpaste/_header.scss b/dpaste/static/dpaste/_header.scss deleted file mode 100644 index 43f4e15..0000000 --- a/dpaste/static/dpaste/_header.scss +++ /dev/null @@ -1,61 +0,0 @@ -// ----------------------------------------------------------------------------- -// Header - -header { - background: $headerColor2; - display: flex; - justify-content: space-between; - align-items: center; - - padding: $desktopBoxPadding; -} - -header h1 { - color: white; - font-size: 1em; - font-weight: 500; - margin: 0; -} - -header h1 input { - font-size: 1em; - font-family: $codeFont; - background-color: transparent; - border: none; - padding: 0; - margin: 0; - color: white; - min-width: 25em; - outline: none; -} - -header nav { - font-size: .9rem; -} - -header nav a:link, -header nav a:visited { - color: white; - font-weight: 500; - text-decoration: none; - margin: 0 .2em; - white-space: nowrap; - - &:hover { - text-decoration: underline; - } -} - -header nav a:last-child { - border: 1px solid white; - border-radius: 5px; - padding: .3em .5em; - - &:hover { - text-decoration: none; - background-color: lighten($headerColor1, 10%); - } -} - - - diff --git a/dpaste/static/dpaste/_history.scss b/dpaste/static/dpaste/_history.scss deleted file mode 100644 index 07e98ee..0000000 --- a/dpaste/static/dpaste/_history.scss +++ /dev/null @@ -1,18 +0,0 @@ -// ----------------------------------------------------------------------------- -// Snippet History List - -.snippet-list { - padding: $desktopBoxPadding; - - dt:not(:first-child) { - margin-top: 1rem; - } - dt:last-child { - margin-top: 2rem; - } - - dd { - font-family: $codeFont; - font-size: .9rem; - } -} diff --git a/dpaste/static/dpaste/dpaste.css b/dpaste/static/dpaste/dpaste.css deleted file mode 100644 index 4658490..0000000 --- a/dpaste/static/dpaste/dpaste.css +++ /dev/null @@ -1 +0,0 @@ -body{color:#888;background:#F7F8F9;font-family:"SF Mono","Fira Mono",monospace;font-size:1em;font-weight:300;margin:0;padding:0}a:link,a:visited{color:#6da3d9;font-family:"SF Mono","Fira Mono",monospace;font-weight:500;text-decoration:none}a:hover,a:visited{color:#6da3d9;text-decoration:underline}select,input{font-size:medium}header{background:#426ca1;display:flex;justify-content:space-between;align-items:center;padding:1rem 2rem}header h1{color:white;font-size:1em;font-weight:500;margin:0}header h1 input{font-size:1em;font-family:"SF Mono","Fira Mono",Monaco,Menlo,Consolas,"Courier New",monospace;background-color:transparent;border:none;padding:0;margin:0;color:white;min-width:25em;outline:none}header nav{font-size:.9rem}header nav a:link,header nav a:visited{color:white;font-weight:500;text-decoration:none;margin:0 .2em;white-space:nowrap}header nav a:link:hover,header nav a:visited:hover{text-decoration:underline}header nav a:last-child{border:1px solid white;border-radius:5px;padding:.3em .5em}header nav a:last-child:hover{text-decoration:none;background-color:#49629b}.form-content{background-color:white;padding:1rem 1rem}.form-content textarea{box-sizing:border-box;width:100%;height:25rem;font-family:"SF Mono","Fira Mono",Monaco,Menlo,Consolas,"Courier New",monospace;font-size:.8rem;border:1px solid #bbb;padding:1rem;transition:border .5s linear}.form-content textarea:focus{outline:none;border-color:#3fca6e}.form-options{padding:1rem 2rem;display:flex;justify-content:space-between;font-size:.9rem}.form-actions{padding:1rem 2rem;background-color:white}.form-actions .shortcut{font-size:.9rem;color:#888;letter-spacing:1px}.form-actions input[type=submit]{color:white;background-color:#6da3d9;border:none;padding:.6em 1em;font-weight:500;font-family:"SF Mono", "Fira Mono", monospace;border-radius:2px;cursor:pointer}.form-actions input[type=submit]:hover{background:#608bc0}.snippet-options{padding:1rem 2rem;font-size:.9rem}.snippet-options a:link,.snippet-options a:visited{margin:0 .2em}.snippet-options a:hover,.snippet-options a:active{text-decoration:underline}.snippet-reply h2{background-color:white;padding:1rem 2rem;padding-bottom:0;margin:0;font-size:1.5rem;font-weight:500}.snippet-reply[data-hidden=yes]{opacity:0.3;cursor:pointer}.snippet-reply[data-hidden=yes] *{cursor:pointer}.snippet-text{color:#666;font-size:16px;line-height:24px;max-width:620px;font-family:Helvetica, FreeSerif, serif;font-weight:300}.snippet-code{background:#232829;color:#f8f8f2;font-family:"SF Mono","Fira Mono",Monaco,Menlo,Consolas,"Courier New",monospace;font-size:0.8rem;font-weight:300;line-height:1.1rem;padding:1rem 0}.snippet-code.wordwrap{overflow:auto}.snippet-code.wordwrap li{white-space:pre-wrap !important}.snippet-code ol{margin:0 0 0 2rem}.snippet-code ol li{color:#aaa;cursor:pointer;white-space:pre}.snippet-code ol li.marked{color:#f4f409;background-color:rgba(244,244,9,0.2)}.snippet-list{padding:1rem 2rem}.snippet-list dt:not(:first-child){margin-top:1rem}.snippet-list dt:last-child{margin-top:2rem}.snippet-list dd{font-family:"SF Mono","Fira Mono",Monaco,Menlo,Consolas,"Courier New",monospace;font-size:.9rem}.page{padding:1rem 2rem;background-color:white;color:#444}.page table th{text-align:left}.snippet-code .gd{background-color:rgba(226,12,19,0.3);color:#fff;display:block}.snippet-code .gi{background-color:rgba(23,189,10,0.2);color:#fff;display:block}.snippet-code .hll{background-color:#49483e}.snippet-code .c{color:#75715e}.snippet-code .err{color:#960050;background-color:#1e0010}.snippet-code .k{color:#66d9ef}.snippet-code .l{color:#ae81ff}.snippet-code .n{color:#f8f8f2}.snippet-code .o{color:#f92672}.snippet-code .p{color:#f8f8f2}.snippet-code .cm{color:#75715e}.snippet-code .cp{color:#75715e}.snippet-code .c1{color:#75715e}.snippet-code .cs{color:#75715e}.snippet-code .ge{font-style:italic}.snippet-code .gs{font-weight:bold}.snippet-code .kc{color:#66d9ef}.snippet-code .kd{color:#66d9ef}.snippet-code .kn{color:#f92672}.snippet-code .kp{color:#66d9ef}.snippet-code .kr{color:#66d9ef}.snippet-code .kt{color:#66d9ef}.snippet-code .ld{color:#e6db74}.snippet-code .m{color:#ae81ff}.snippet-code .s{color:#e6db74}.snippet-code .na{color:#a6e22e}.snippet-code .nb{color:#f8f8f2}.snippet-code .nc{color:#a6e22e}.snippet-code .no{color:#66d9ef}.snippet-code .nd{color:#a6e22e}.snippet-code .ni{color:#f8f8f2}.snippet-code .ne{color:#a6e22e}.snippet-code .nf{color:#a6e22e}.snippet-code .nl{color:#f8f8f2}.snippet-code .nn{color:#f8f8f2}.snippet-code .nx{color:#a6e22e}.snippet-code .py{color:#f8f8f2}.snippet-code .nt{color:#f92672}.snippet-code .nv{color:#f8f8f2}.snippet-code .ow{color:#f92672}.snippet-code .w{color:#f8f8f2}.snippet-code .mf{color:#ae81ff}.snippet-code .mh{color:#ae81ff}.snippet-code .mi{color:#ae81ff}.snippet-code .mo{color:#ae81ff}.snippet-code .sb{color:#e6db74}.snippet-code .sc{color:#e6db74}.snippet-code .sd{color:#e6db74}.snippet-code .s2{color:#e6db74}.snippet-code .se{color:#ae81ff}.snippet-code .sh{color:#e6db74}.snippet-code .si{color:#e6db74}.snippet-code .sx{color:#e6db74}.snippet-code .sr{color:#e6db74}.snippet-code .s1{color:#e6db74}.snippet-code .ss{color:#e6db74}.snippet-code .bp{color:#f8f8f2}.snippet-code .vc{color:#f8f8f2}.snippet-code .vg{color:#f8f8f2}.snippet-code .vi{color:#f8f8f2}.snippet-code .il{color:#ae81ff} diff --git a/dpaste/static/dpaste/dpaste.scss b/dpaste/static/dpaste/dpaste.scss deleted file mode 100644 index a5f1d39..0000000 --- a/dpaste/static/dpaste/dpaste.scss +++ /dev/null @@ -1,67 +0,0 @@ -// ----------------------------------------------------------------------------- -// -// dpaste example stylesheet -// -// ----------------------------------------------------------------------------- - -// Color Palette -$backgroundColor: #F7F8F9; -$headerColor1: #394c78; -$headerColor2: #426ca1; -$headerTextColor: #fff; -$textColor: #888; - -$linkColor: rgb(109, 163, 217); -$hoverColor: rgb(109, 163, 217); - -// The general font for the website -$siteFont: "SF Mono", "Fira Mono", monospace; - -// Font used for "Text" lexer -$textFont: Helvetica; - -// Font used for the code snippet display -$codeFont: "SF Mono", "Fira Mono", Monaco, Menlo, Consolas, "Courier New", monospace; - -$desktopBoxPadding: 1rem 2rem; -$mobileBoxPadding: 1rem; - -// ----------------------------------------------------------------------------- - -body { - color: $textColor; - background: $backgroundColor; - font-family: $siteFont; - font-size: 1em; - font-weight: 300; - margin: 0; - padding: 0; -} - -a:link, -a:visited { - color: $linkColor; - font-family: $siteFont; - font-weight: 500; - text-decoration: none; -} - -a:hover, -a:visited { - color: $hoverColor; - text-decoration: underline; -} - -select, input { - font-size: medium; -} - -// ----------------------------------------------------------------------------- -// Imports - -@import 'header'; -@import 'form'; -@import 'details'; -@import 'history'; -@import 'about'; -@import 'pygments'; diff --git a/dpaste/templates/dpaste/404.html b/dpaste/templates/dpaste/404.html index e1a66b0..c306001 100644 --- a/dpaste/templates/dpaste/404.html +++ b/dpaste/templates/dpaste/404.html @@ -1,8 +1,14 @@ {% extends "dpaste/base.html" %} -{% block title %}404 Not found{% endblock %} -{% block headline %}404 Not found{% endblock %} +{% block title %}404 Snippet not found{% endblock %} {% block page %} -

Snippet you have searched is not available (anymore).

+
+

404 Snippet not found

+ +

+ This snippet no longer exists. Snippets are automatically + deleted when they reach their expiration date. +

+
{% endblock %} diff --git a/dpaste/templates/dpaste/500.html b/dpaste/templates/dpaste/500.html index 2332f4a..ec18515 100644 --- a/dpaste/templates/dpaste/500.html +++ b/dpaste/templates/dpaste/500.html @@ -1,8 +1,10 @@ {% extends "dpaste/base.html" %} {% block title %}500 Internal Server Error{% endblock %} -{% block headline %}500 Internal Server Error{% endblock %} {% block page %} -

Sorry, there was an error with your request. The server notified the admin via email.

+
+

500 Internal Server Error

+

There was an issue with your request.

+
{% endblock %} diff --git a/dpaste/templates/dpaste/about.html b/dpaste/templates/dpaste/about.html index e5c4e80..883713c 100644 --- a/dpaste/templates/dpaste/about.html +++ b/dpaste/templates/dpaste/about.html @@ -3,91 +3,28 @@ {% load i18n %} {% block title %}{% trans "About" %}{% endblock %} -{% block headline %}{% trans "About" %}{% endblock %} {% block page %} +
-
+

{% trans "About dpaste" %}

-

- This site is powered by dpaste, which is open source. You can - find the source, contribute to it and leave ideas on Github: - github.com/bartTC/dpaste -

+

+ {% blocktrans %} + This site is powered by dpaste, an open source + pastebin application. + You can find the source code, contribute to it or leave feedback + on Github. + {% endblocktrans %} +

-
- Change the language: - {% csrf_token %} - - - -
+

+ {% blocktrans %} + dpaste provides an API to easily paste snippets out of your shell or editor. + See the dpaste wiki + for the API documentation and a list of available plugins. + {% endblocktrans %} +

-

API

- -

dpaste provides a simple API documented in detail - on this page. For a quick start here is a code example (Python 2.x):

- - {# Just put the script in dpaste and copy the source node #} -
  1. #!/usr/bin/env python
  2.  
  3. from urllib import urlencode
  4. from urllib2 import Request, urlopen
  5. from sys import stdin
  6.  
  7. def paste_code():
  8.     request = Request('{{ site_url }}/api/', urlencode({
  9.         'content': stdin.read(),
  10.         'lexer': 'python',
  11.         'format': 'url',
  12.     }))
  13.     print urlopen(request).read()
  14.  
  15. if __name__ == '__main__':
  16.     paste_code()
-
- -

Save this script in /usr/local/bin/dpaste and give it the executable bit: chmod +x /usr/local/bin/dpaste.

-

Usage: cat foo.txt | dpaste

- -

An alternative would be to just use curl: - alias dpaste="curl -F 'content=<-' {{ site_url }}/api/"

- - -

Applications using the API:

- - - -

{% trans "Statistics" %}

- -

{% blocktrans %}There are {{ total }} snippets in the database. The most popular languages are:{% endblocktrans %}

- - {% for s in stats %} - - - - - {% endfor %} -
{{ s.lexer|upper }}{{ s.count }}
- -

Delete a snippet

- -

- If you created a snippet with the API you can't delete it on the webpage - since it's not in your history. You can delete a snippet here. Actually - you can delete any snippet of anybody, as long as you know the short code. -

-

- If you deleted a snippet because of legal issues, please let me know - that, I want to keep track of such things and try to avoid in future. -

-

- Type the 4 letter code of your snippet in the field and submit. - Like this yellow one here: {{ site_url }}/SiZrT -

- -
- {% csrf_token %} - -
- - {{ DPASTE_ABOUT_EXTRA }} -
+
{% endblock %} diff --git a/dpaste/templates/dpaste/base.html b/dpaste/templates/dpaste/base.html index 9700140..92571f7 100644 --- a/dpaste/templates/dpaste/base.html +++ b/dpaste/templates/dpaste/base.html @@ -1,48 +1,29 @@ {% load i18n %} {% load staticfiles %} +{% load dpaste_tags %} {% block title %}{% endblock %} - - {% block extrahead %}{% endblock %} + - + - -
-

{% block headline %}{% endblock %}

+
+

{% block headline %}dpaste{% endblock %}

-{% block page %} - PAGE MISSING -{% endblock %} +{% block options %}{% endblock %} -{% block script_footer %} - -{% endblock %} +
{% block page %}{% endblock %}
+ diff --git a/dpaste/templates/dpaste/details.html b/dpaste/templates/dpaste/details.html new file mode 100644 index 0000000..819653a --- /dev/null +++ b/dpaste/templates/dpaste/details.html @@ -0,0 +1,83 @@ +{% extends "dpaste/base.html" %} + +{% load i18n %} + +{% block title %}dpaste/{{ snippet.secret_id }} ({{ snippet.lexer }}){% endblock %} + +{% block body_type %} + {% if snippet.lexer == 'text' %}data-text-snippet{% else %}data-code-snippet{% endif %} +{% endblock %} + +{% block headline %} + {{ request.build_absolute_uri }} + + + + + + + + +{% endblock %} + +{% block options %} + +{% endblock %} + +{% block page %} + {% if snippet.expire_type == 3 %} +

+ {% trans "This is a one-time snippet." %} + {% if snippet.remaining_views > 1 %} + {% blocktrans with remaining=snippet.remaining_views %}It is automatically removed after {{ remaining }} further views.{% endblocktrans %} + {% elif snippet.remaining_views == 1 %} + {% trans "It is automatically removed after the next view." %} + {% else %} + {% trans "It cannot be viewed again." %} + {% endif %} +

+ {% endif %} + + {% if snippet.lexer == 'text' %} +
{% include "dpaste/highlight/text.html" %}
+ {% else %} +
{% include "dpaste/highlight/code.html" %}
+ {% endif %} + +
+

{% trans "Edit this Snippet" %}

+
+ + {% include "dpaste/includes/form.html" %} +{% endblock %} diff --git a/dpaste/templates/dpaste/highlight/code.html b/dpaste/templates/dpaste/highlight/code.html index 2ced6f8..ae45cff 100644 --- a/dpaste/templates/dpaste/highlight/code.html +++ b/dpaste/templates/dpaste/highlight/code.html @@ -1 +1 @@ -
    {% for line in highlighted %}
  1. {{ line|safe|default:" " }}
  2. {% endfor %}
+
    {% for line in snippet.highlight_lines %}
  1. {{ line|safe|default:" " }}
  2. {% endfor %}
diff --git a/dpaste/templates/dpaste/highlight/text.html b/dpaste/templates/dpaste/highlight/text.html index 3a442fa..0c0972f 100644 --- a/dpaste/templates/dpaste/highlight/text.html +++ b/dpaste/templates/dpaste/highlight/text.html @@ -1 +1 @@ -{{ snippet.content|linebreaksbr }} +
{{ snippet.content|linebreaksbr }}
diff --git a/dpaste/templates/dpaste/history.html b/dpaste/templates/dpaste/history.html new file mode 100644 index 0000000..f6e46ae --- /dev/null +++ b/dpaste/templates/dpaste/history.html @@ -0,0 +1,49 @@ +{% extends "dpaste/base.html" %} + +{% load i18n %} + +{% block title %}{% trans "Snippet History" %}{% endblock %} + +{% block body_type %}data-code-snippet{% endblock %} + +{% block options %} + +{% endblock %} + +{% block page %} + {% for snippet in snippet_list %} +

+ {% blocktrans with snippet.lexer_name as type %}{{ type }} Snippet{% endblocktrans %} + + {% blocktrans with snippet.published|timesince as since %}{{ since }} ago{% endblocktrans %} +

+ + {% if snippet.lexer == 'text' %} +
{% include "dpaste/highlight/text.html" %}
+ {% else %} +
{% include "dpaste/highlight/code.html" %}
+ {% endif %} + + {% empty %} +

+ {% trans "No snippets saved. Either all your snippets are expired or your cookie has changed." %}

+ {% endfor %} + + + +{% endblock %} diff --git a/dpaste/templates/dpaste/snippet_diff.html b/dpaste/templates/dpaste/includes/diff.html similarity index 100% rename from dpaste/templates/dpaste/snippet_diff.html rename to dpaste/templates/dpaste/includes/diff.html diff --git a/dpaste/templates/dpaste/includes/form.html b/dpaste/templates/dpaste/includes/form.html new file mode 100644 index 0000000..ecf7522 --- /dev/null +++ b/dpaste/templates/dpaste/includes/form.html @@ -0,0 +1,35 @@ +{% load i18n %} + +
+ {% csrf_token %} + {{ form.non_field_errors }} + + +
+

{{ form.title }}

{# Honeypot field #} + +

+ + {{ form.lexer }} +

+ +

+ + {{ form.expires }} +

+ +

+ +

+
+ +

+ + {{ form.content }} +

+
diff --git a/dpaste/templates/dpaste/new.html b/dpaste/templates/dpaste/new.html new file mode 100644 index 0000000..a5172c7 --- /dev/null +++ b/dpaste/templates/dpaste/new.html @@ -0,0 +1,11 @@ +{% extends "dpaste/base.html" %} + +{% load i18n %} + +{% block nav_new %}{% endblock %} + +{% block title %}{% trans "dpaste" %}{% endblock %} + +{% block page %} + {% include "dpaste/includes/form.html" %} +{% endblock %} diff --git a/dpaste/templates/dpaste/snippet_details.html b/dpaste/templates/dpaste/snippet_details.html deleted file mode 100644 index a05a5ac..0000000 --- a/dpaste/templates/dpaste/snippet_details.html +++ /dev/null @@ -1,116 +0,0 @@ -{% extends "dpaste/base.html" %} - -{% load i18n %} - -{% block title %}dpaste{% endblock %} -{% block headline %} - -{% endblock %} - -{% block page %} - - -
- - {% if snippet.expire_type == 1 %} - {% blocktrans with date=snippet.expires|timeuntil %}Expires in: {{ date }}{% endblocktrans %} - {% elif snippet.expire_type == 2 %} - {% trans "Snippet never expires" %} - {% elif snippet.expire_type == 3 %} - {% trans "One-Time snippet" %} - {% endif %} - - - {% trans "Delete Now" %} - - {% if snippet.parent %} - {% trans "Compare with previous Snippet" %} - {% endif %} - - {% if snippet.expire_type != 3 %} - {% trans "View Raw" %} - {% endif %} - - {% if snippet.lexer != 'text' %} - Wordwrap - {% endif %} -
- - - {% if snippet.expire_type == 3 %} -

- {% trans "This is a one-time snippet." %} - {% if snippet.remaining_views > 1 %} - {% blocktrans with remaining=snippet.remaining_views %}It is automatically removed after {{ remaining }} further views.{% endblocktrans %} - {% elif snippet.remaining_views == 1 %} - {% trans "It is automatically removed after the next view." %} - {% else %} - {% trans "It cannot be viewed again." %} - {% endif %} -

- {% endif %} - - - {% if snippet.lexer == 'text' %} -
{% include "dpaste/highlight/text.html" %}
- {% else %} -
{% include "dpaste/highlight/code.html" %}
- {% endif %} - - -
-

{% trans "Reply to this snippet" %} →

- {% include "dpaste/snippet_form.html" %} -
-{% endblock %} - - -{% block script_footer %} -{{ block.super }} - -{% endblock %} diff --git a/dpaste/templates/dpaste/snippet_form.html b/dpaste/templates/dpaste/snippet_form.html deleted file mode 100644 index 7841af8..0000000 --- a/dpaste/templates/dpaste/snippet_form.html +++ /dev/null @@ -1,29 +0,0 @@ -{% load i18n %} - -
- {% csrf_token %} - {{ form.non_field_errors }} - -
{{ form.title }}
{# Honeypot field #} - -
- {{ form.content }} -
- -
-
- - {{ form.lexer }} -
- -
- - {{ form.expires }} -
-
- -
- - ⌘+⏎ {% trans "or" %} Ctrl+⏎ -
-
diff --git a/dpaste/templates/dpaste/snippet_list.html b/dpaste/templates/dpaste/snippet_list.html deleted file mode 100644 index 6eab58d..0000000 --- a/dpaste/templates/dpaste/snippet_list.html +++ /dev/null @@ -1,28 +0,0 @@ -{% extends "dpaste/base.html" %} - -{% load i18n %} - -{% block title %}{% trans "Snippet History" %}{% endblock %} -{% block headline %}{% trans "Snippet History" %}{% endblock %} - -{% block page %} -
- {% for snippet in snippet_list %} -
- - {% blocktrans with snippet.published|timesince as since %}{{ since }} - ago{% endblocktrans %} - -
-
- {{ snippet.excerpt }} -
- {% empty %} -
{% trans "No snippets saved. Either all your snippets are expired or your cookie has changed." %}
- {% endfor %} -
{% trans "Delete all your snippets" %} -
-
- -{% endblock %} diff --git a/dpaste/templates/dpaste/snippet_new.html b/dpaste/templates/dpaste/snippet_new.html deleted file mode 100644 index 23e2193..0000000 --- a/dpaste/templates/dpaste/snippet_new.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "dpaste/base.html" %} - -{% load i18n %} - -{% block title %}dpaste{% endblock %} -{% block headline %}dpaste{% endblock %} - -{% block page %} -
- {% include "dpaste/snippet_form.html" %} -
-{% endblock %} diff --git a/dpaste/views.py b/dpaste/views.py index e72c111..2c2cf12 100644 --- a/dpaste/views.py +++ b/dpaste/views.py @@ -21,10 +21,9 @@ from django.views.generic.detail import DetailView from pygments.lexers import get_lexer_for_filename from pygments.util import ClassNotFound -from .forms import EXPIRE_CHOICES, SnippetForm, get_expire_values -from .highlight import LEXER_DEFAULT, LEXER_KEYS, LEXER_LIST, LEXER_WORDWRAP, \ - PLAIN_CODE, pygmentize -from .models import ONETIME_LIMIT, Snippet +from dpaste import highlight +from dpaste.forms import EXPIRE_CHOICES, SnippetForm, get_expire_values +from dpaste.models import ONETIME_LIMIT, Snippet # ----------------------------------------------------------------------------- @@ -36,7 +35,7 @@ class SnippetView(FormView): Create a new snippet. """ form_class = SnippetForm - template_name = 'dpaste/snippet_new.html' + template_name = 'dpaste/new.html' def get_form_kwargs(self): kwargs = super(SnippetView, self).get_form_kwargs() @@ -48,7 +47,7 @@ class SnippetView(FormView): def get_context_data(self, **kwargs): ctx = super(SnippetView, self).get_context_data(**kwargs) ctx.update({ - 'lexer_list': LEXER_LIST, + 'lexer_list': highlight.LEXER_LIST, }) return ctx @@ -63,7 +62,7 @@ class SnippetDetailView(SnippetView, DetailView): tree/diff view. """ queryset = Snippet.objects.all() - template_name = 'dpaste/snippet_details.html' + template_name = 'dpaste/details.html' slug_url_kwarg = 'snippet_id' slug_field = 'secret_id' @@ -98,18 +97,10 @@ class SnippetDetailView(SnippetView, DetailView): ctx = super(SnippetDetailView, self).get_context_data(**kwargs) ctx.update({ - 'highlighted': self.highlight_snippet().splitlines(), - 'wordwrap': snippet.lexer in LEXER_WORDWRAP and 'True' or 'False', + 'wordwrap': snippet.lexer in highlight.LEXER_WORDWRAP, }) return ctx - def highlight_snippet(self): - snippet = self.get_object() - h = pygmentize(snippet.content, snippet.lexer) - h = h.replace(u'\t', '    ') - return h - - class SnippetRawView(SnippetDetailView): """ Display the raw content of a snippet @@ -143,7 +134,7 @@ class SnippetHistory(TemplateView): Display the last `n` snippets created by this user (and saved in his session). """ - template_name = 'dpaste/snippet_list.html' + template_name = 'dpaste/history.html' def get(self, request, *args, **kwargs): snippet_id_list = request.session.get('snippet_list', []) @@ -167,7 +158,7 @@ class SnippetDiffView(TemplateView): """ Display a diff between two given snippet secret ids. """ - template_name = 'dpaste/snippet_diff.html' + template_name = 'dpaste/includes/diff.html' def get(self, request, *args, **kwargs): """ @@ -209,8 +200,7 @@ class SnippetDiffView(TemplateView): return diff def highlight_snippet(self, content): - h = pygmentize(content, 'diff') - h = h.replace(u' ', u'  ') + h = highlight.pygmentize(content, 'diff') h = h.replace(u'\t', '    ') return h @@ -284,7 +274,7 @@ class APIView(View): """ def post(self, request, *args, **kwargs): content = request.POST.get('content', '') - lexer = request.POST.get('lexer', LEXER_DEFAULT).strip() + lexer = request.POST.get('lexer', highlight.LEXER_DEFAULT).strip() filename = request.POST.get('filename', '').strip() expires = request.POST.get('expires', '').strip() format = request.POST.get('format', 'default').strip() @@ -295,12 +285,12 @@ class APIView(View): # We need at least a lexer or a filename if not lexer and not filename: return HttpResponseBadRequest('No lexer or filename given. Unable to ' - 'determine a highlight. Valid lexers are: %s' % ', '.join(LEXER_KEYS)) + 'determine a highlight. Valid lexers are: %s' % ', '.join(highlight.LEXER_LIST)) # A lexer is given, check if its valid at all - if lexer and lexer not in LEXER_KEYS: + if lexer and lexer not in highlight.LEXER_KEYS: return HttpResponseBadRequest('Invalid lexer "%s" given. Valid lexers are: %s' % ( - lexer, ', '.join(LEXER_KEYS))) + lexer, ', '.join(highlight.LEXER_KEYS))) # No lexer is given, but we have a filename, try to get the lexer out of it. # In case Pygments cannot determine the lexer of the filename, we fallback @@ -310,7 +300,7 @@ class APIView(View): lexer_cls = get_lexer_for_filename(filename) lexer = lexer_cls.aliases[0] except (ClassNotFound, IndexError): - lexer = PLAIN_CODE + lexer = highlight.PLAIN_CODE if expires: expire_options = [str(i) for i in dict(EXPIRE_CHOICES).keys()] diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2290a5c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1412 @@ +{ + "name": "dpaste", + "version": "3.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.5" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz", + "integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "4.1.2", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "2.10.1" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "1.0.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "requires": { + "globule": "1.2.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "requires": { + "is-property": "1.0.2" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "requires": { + "glob": "7.1.2", + "lodash": "4.17.5", + "minimatch": "3.0.4" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "requires": { + "chalk": "1.1.3", + "commander": "2.15.0", + "is-my-json-valid": "2.17.2", + "pinkie-promise": "2.0.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==" + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-base64": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.mergewith": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==" + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "1.33.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "nan": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", + "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==" + }, + "node-gyp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", + "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "requires": { + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.79.0", + "rimraf": "2.6.2", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "node-sass": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz", + "integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==", + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.2", + "get-stdin": "4.0.1", + "glob": "7.1.2", + "in-publish": "2.0.0", + "lodash.assign": "4.2.0", + "lodash.clonedeep": "4.5.0", + "lodash.mergewith": "4.6.1", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.9.2", + "node-gyp": "3.6.2", + "npmlog": "4.1.2", + "request": "2.79.0", + "sass-graph": "2.2.4", + "stdout-stream": "1.4.0", + "true-case-path": "1.0.2" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.4.3", + "uuid": "3.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "requires": { + "glob": "7.1.2", + "lodash": "4.17.5", + "scss-tokenizer": "0.2.3", + "yargs": "7.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "2.4.3", + "source-map": "0.4.4" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "2.16.3" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "stdout-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", + "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "requires": { + "readable-stream": "2.3.5" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "4.0.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "true-case-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", + "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "requires": { + "glob": "6.0.4" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "requires": { + "commander": "2.13.0", + "source-map": "0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "requires": { + "string-width": "1.0.2" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..bbcbcc9 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "name": "dpaste", + "version": "3.0.0", + "scripts": { + "build": "node-sass --output-style compressed -o build client/scss/dpaste.scss && uglifyjs -o build/dpaste.js client/js/dpaste.js", + "watch-css": "npm run build && node-sass --source-map true -o build/ --watch client/scss/dpaste.scss ", + "postinstall": "npm build" + }, + "dependencies": { + "node-sass": "^4.7.2", + "uglify-es": "^3.3.9" + } +} diff --git a/runscss.sh b/runscss.sh deleted file mode 100755 index a982e23..0000000 --- a/runscss.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -node-sass --output-style compressed --output dpaste/static/dpaste/ dpaste/static/dpaste/dpaste.scss $1