diff --git a/Cargo.lock b/Cargo.lock index f6c10918f40..0a90bfe3514 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -199,6 +199,7 @@ dependencies = [ "flate2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", "git2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "handlebars 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "htmlescape 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.12.25 (registry+https://github.com/rust-lang/crates.io-index)", @@ -209,9 +210,9 @@ dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "lettre 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "lettre_email 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "license-exprs 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "license-exprs 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "oauth2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "oauth2 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "openssl 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -922,6 +923,31 @@ dependencies = [ "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "handlebars" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hashbrown 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pest 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "hashbrown" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "hex" version = "0.3.2" @@ -1204,7 +1230,7 @@ dependencies = [ [[package]] name = "license-exprs" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1498,11 +1524,18 @@ dependencies = [ [[package]] name = "oauth2" -version = "0.3.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "curl 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1974,6 +2007,14 @@ name = "safemem" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "same-file" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "schannel" version = "0.1.13" @@ -2111,6 +2152,17 @@ dependencies = [ "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "sha2" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "block-buffer 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "siphasher" version = "0.2.2" @@ -2717,6 +2769,16 @@ name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "walkdir" +version = "2.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "want" version = "0.0.6" @@ -2751,6 +2813,14 @@ name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2887,6 +2957,8 @@ dependencies = [ "checksum ghost 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5297b71943dc9fea26a3241b178c140ee215798b7f79f7773fd61683e25bca74" "checksum git2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c7339329bfa14a00223244311560d11f8f489b453fb90092af97f267a6090ab0" "checksum h2 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb2b25a33e231484694267af28fec74ac63b5ccf51ee2065a5e313b834d836e" +"checksum handlebars 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "df044dd42cdb7e32f28557b661406fc0f2494be75199779998810dbc35030e0d" +"checksum hashbrown 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1de41fb8dba9714efd92241565cdff73f78508c95697dd56787d3cba27e2353" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" "checksum hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "21ceb46a83a85e824ef93669c8b390009623863b5c195d1ba747292c0c72f94e" "checksum html5ever 0.22.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c213fa6a618dc1da552f54f85cba74b05d8e883c92ec4e89067736938084c26e" @@ -2916,7 +2988,7 @@ dependencies = [ "checksum libgit2-sys 0.7.11 (registry+https://github.com/rust-lang/crates.io-index)" = "48441cb35dc255da8ae72825689a95368bf510659ae1ad55dc4aa88cb1789bf1" "checksum libssh2-sys 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "126a1f4078368b163bfdee65fbab072af08a1b374a5551b21e87ade27b1fbf9d" "checksum libz-sys 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb5e43362e38e2bca2fd5f5134c4d4564a23a5c28e9b95411652021a8675ebe" -"checksum license-exprs 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e66da8cfc5d7882ef44dfae506db874873bb7596bc89468c30afbdb47e115593" +"checksum license-exprs 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eb374efe4669153b6bb170a7c5063a4e570a4eb45e5daf0dab4c1543d4d6f197" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" @@ -2950,7 +3022,7 @@ dependencies = [ "checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" "checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" -"checksum oauth2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f4fcd990d45681b9eba5f4f3fa7d0371ec277f4e4380a94104d26aa4fae386fc" +"checksum oauth2 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b782199cf581a36bdee16efd40f12f10a5aefb8864ed16417a8dc8a4c25f13b" "checksum openssl 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "5af9e83eb3c51ee806387d26a43056f3246d865844caa6dd704d2ba7e831c264" "checksum openssl-probe 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d98df0270d404ccd3c050a41d579c52d1db15375168bb3471e04ec0f5f378daf" "checksum openssl-sys 0.9.38 (registry+https://github.com/rust-lang/crates.io-index)" = "ff3d1b390ab1b9700f682ad95a30dc9c0f40dd212ca57266012cfc678b0e365a" @@ -3006,6 +3078,7 @@ dependencies = [ "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" +"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421" "checksum schannel 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "dc1fabf2a7b6483a141426e1afd09ad543520a77ac49bd03c286e7696ccfd77f" "checksum scheduled-thread-pool 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a2ff3fc5223829be817806c6441279c676e454cc7da608faf03b0ccc09d3889" "checksum scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d" @@ -3022,6 +3095,7 @@ dependencies = [ "checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" "checksum serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d48f9f99cd749a2de71d29da5f948de7f2764cc5a9d7f3c97e3514d4ee6eabf2" "checksum sha-1 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "51b9d1f3b5de8a167ab06834a7c883bd197f2191e1dda1a22d9ccfeedbf9aded" +"checksum sha2 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9eb6be24e4c23a84d7184280d2722f7f2731fcdd4a9d886efbfe4413e4847ea0" "checksum siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0df90a788073e8d0235a67e50441d47db7c8ad9debd91cbf43736a2a92d36537" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum smallvec 0.6.8 (registry+https://github.com/rust-lang/crates.io-index)" = "88aea073965ab29f6edb5493faf96ad662fb18aa9eeb186a3b7057951605ed15" @@ -3090,11 +3164,13 @@ dependencies = [ "checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b" "checksum version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7716c242968ee87e5542f8021178248f267f295a5c4803beae8b8b7fd9bc6051" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e" "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" "checksum wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eeb06499a3a4d44302791052df005d5232b927ed1a9658146d842165c4de7767" "checksum winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7daf138b6b14196e3830a588acf1e86966c694d3e8fb026fb105b8b5dca07e6e" diff --git a/Cargo.toml b/Cargo.toml index 0c540febc50..35746bc81d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,7 +38,7 @@ tar = "0.4.16" base64 = "0.9" openssl = "0.10.13" -oauth2 = "0.3" +oauth2 = "2.0.0" log = "0.4" env_logger = "0.5" hex = "0.3" @@ -83,12 +83,14 @@ tokio = "0.1" hyper = "0.12" ctrlc = { version = "3.0", features = ["termination"] } indexmap = "1.0.2" +handlebars = "2.0.1" [dev-dependencies] conduit-test = "0.8" hyper-tls = "0.3" lazy_static = "1.0" tokio-core = "0.1" +diesel_migrations = { version = "1.3.0", features = ["postgres"] } [build-dependencies] dotenv = "0.11" diff --git a/RustConfig b/RustConfig index f7cf220b751..dc321b35b32 100644 --- a/RustConfig +++ b/RustConfig @@ -1 +1 @@ -VERSION=1.33.0 +VERSION=1.38.0 diff --git a/app/components/crate-readme.js b/app/components/crate-readme.js index 513647ec05a..afe36ac80c5 100644 --- a/app/components/crate-readme.js +++ b/app/components/crate-readme.js @@ -7,5 +7,13 @@ export default Component.extend({ this.$('pre > code').each(function() { window.Prism.highlightElement(this); }); + this.scrollToFragment(); + }, + + scrollToFragment() { + if (location.hash) { + let anchor_id = location.hash.substr(1); + document.getElementById(anchor_id).scrollIntoView(); + } }, }); diff --git a/app/components/email-input.js b/app/components/email-input.js index 641f6434c8b..fd4be6d19f3 100644 --- a/app/components/email-input.js +++ b/app/components/email-input.js @@ -100,9 +100,9 @@ export default Component.extend({ await ajax(`/api/v1/users/${user.id}/resend`, { method: 'PUT' }); this.set('disableResend', true); } catch (error) { - if (error.payload) { + if (error.errors) { this.set('isError', true); - this.set('emailError', `Error in resending message: ${error.payload.errors[0].detail}`); + this.set('emailError', `Error in resending message: ${error.errors[0].detail}`); } else { this.set('isError', true); this.set('emailError', 'Unknown error in resending message'); diff --git a/app/components/pending-owner-invite-row.js b/app/components/pending-owner-invite-row.js index 0fe78fc1cfa..239a2ae47f1 100644 --- a/app/components/pending-owner-invite-row.js +++ b/app/components/pending-owner-invite-row.js @@ -15,8 +15,8 @@ export default Component.extend({ this.set('isAccepted', true); } catch (error) { this.set('isError', true); - if (error.payload) { - this.set('inviteError', `Error in accepting invite: ${error.payload.errors[0].detail}`); + if (error.errors) { + this.set('inviteError', `Error in accepting invite: ${error.errors[0].detail}`); } else { this.set('inviteError', 'Error in accepting invite'); } @@ -31,8 +31,8 @@ export default Component.extend({ this.set('isDeclined', true); } catch (error) { this.set('isError', true); - if (error.payload) { - this.set('inviteError', `Error in declining invite: ${error.payload.errors[0].detail}`); + if (error.errors) { + this.set('inviteError', `Error in declining invite: ${error.errors[0].detail}`); } else { this.set('inviteError', 'Error in declining invite'); } diff --git a/app/controllers/crate/owners.js b/app/controllers/crate/owners.js index 3f56a4d472f..049d6a5ea25 100644 --- a/app/controllers/crate/owners.js +++ b/app/controllers/crate/owners.js @@ -23,8 +23,8 @@ export default Controller.extend({ await this.crate.inviteOwner(username); this.set('invited', `An invite has been sent to ${username}`); } catch (error) { - if (error.payload) { - this.set('error', `Error sending invite: ${error.payload.errors[0].detail}`); + if (error.errors) { + this.set('error', `Error sending invite: ${error.errors[0].detail}`); } else { this.set('error', 'Error sending invite'); } @@ -40,8 +40,8 @@ export default Controller.extend({ this.get('crate.owner_user').removeObject(user); } catch (error) { - if (error.payload) { - this.set('removed', `Error removing owner: ${error.payload.errors[0].detail}`); + if (error.errors) { + this.set('removed', `Error removing owner: ${error.errors[0].detail}`); } else { this.set('removed', 'Error removing owner'); } diff --git a/app/router.js b/app/router.js index 969fbfc156b..5a5f85cea47 100644 --- a/app/router.js +++ b/app/router.js @@ -46,6 +46,7 @@ Router.map(function() { this.route('category-slugs', { path: 'category_slugs' }); this.route('team', { path: '/teams/:team_id' }); this.route('policies'); + this.route('data-access'); this.route('confirm', { path: '/confirm/:email_token' }); this.route('catch-all', { path: '*path' }); diff --git a/app/routes/confirm.js b/app/routes/confirm.js index 67405995bb9..6d289d32096 100644 --- a/app/routes/confirm.js +++ b/app/routes/confirm.js @@ -26,8 +26,8 @@ export default Route.extend({ }); } } catch (error) { - if (error.payload) { - this.flashMessages.queue(`Error in email confirmation: ${error.payload.errors[0].detail}`); + if (error.errors) { + this.flashMessages.queue(`Error in email confirmation: ${error.errors[0].detail}`); return this.replaceWith('index'); } else { this.flashMessages.queue(`Unknown error in email confirmation`); diff --git a/app/routes/crate/version.js b/app/routes/crate/version.js index 86a6acf9395..5150da20f10 100644 --- a/app/routes/crate/version.js +++ b/app/routes/crate/version.js @@ -1,6 +1,7 @@ import { observer } from '@ember/object'; import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; +import semver from 'semver'; import fetch from 'fetch'; import ajax from 'ember-fetch/ajax'; @@ -20,27 +21,7 @@ export default Route.extend({ const controller = this.controllerFor(this.routeName); const maxVersion = crate.get('max_version'); - const isUnstableVersion = version => { - const versionLen = version.length; - let majorMinorPatchChars = 0; - let result = false; - - for (let i = 0; i < versionLen; i++) { - const char = version.charAt(i); - - if (!isNaN(parseInt(char)) || char === '.') { - majorMinorPatchChars++; - } else { - break; - } - } - - if (versionLen !== majorMinorPatchChars) { - result = true; - } - - return result; - }; + const isUnstableVersion = version => !!semver.prerelease(version); const fetchCrateDocumentation = () => { if (!crate.get('documentation') || crate.get('documentation').substr(0, 16) === 'https://docs.rs/') { @@ -62,14 +43,29 @@ export default Route.extend({ .get('versions') .then(versions => { const latestStableVersion = versions.find(version => { + // Find the latest version that is stable AND not-yanked. if (!isUnstableVersion(version.get('num')) && !version.get('yanked')) { return version; } }); if (latestStableVersion == null) { - // If no stable version exists, fallback to `maxVersion` - params.version_num = maxVersion; + // Cannot find any version that is stable AND not-yanked. + // The fact that "maxVersion" itself cannot be found means that + // we have to fall back to the latest one that is unstable.... + const latestUnyankedVersion = versions.find(version => { + // Find the latest version that is stable AND not-yanked. + if (!version.get('yanked')) { + return version; + } + }); + + if (latestStableVersion == null) { + // There's not even any unyanked version... + params.version_num = maxVersion; + } else { + params.version_num = latestUnyankedVersion; + } } else { params.version_num = latestStableVersion.get('num'); } diff --git a/app/styles/crate.scss b/app/styles/crate.scss index d8c3505a186..4d0da84ef8f 100644 --- a/app/styles/crate.scss +++ b/app/styles/crate.scss @@ -341,6 +341,8 @@ table { border-collapse: collapse; + display: block; + overflow-x: auto; th, td { border: 1px solid #dfe2e5; diff --git a/app/templates/application.hbs b/app/templates/application.hbs index 3cffa08ef8d..7ceb2e7cc56 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -122,7 +122,7 @@ diff --git a/app/templates/crate/version.hbs b/app/templates/crate/version.hbs index b9d00aa94be..5fb4110e8d8 100644 --- a/app/templates/crate/version.hbs +++ b/app/templates/crate/version.hbs @@ -221,7 +221,11 @@ {{#each currentDependencies as |dep|}} {{link-to-dep tagName="li" dep=dep}} {{else}} -
  • None
  • + {{#if (is-pending currentDependencies)}} +
  • Loading…
  • + {{else}} +
  • None
  • + {{/if}} {{/each}} @@ -260,34 +264,6 @@ Versions published - -
    - Showing stats for - - {{#rl-dropdown-container class="button-holder"}} - {{#rl-dropdown-toggle class="tan-button dropdown"}} - {{#if requestedVersion}} - {{ requestedVersion }} - {{else}} - All Versions - {{/if}} - - {{/rl-dropdown-toggle}} - - {{#rl-dropdown id="all-versions" tagName="ul" class="dropdown" closeOnChildClick="a:link"}} -
  • - {{#link-to 'crate.version' 'all'}}All Versions{{/link-to}} -
  • - {{#each smallSortedVersions as |version|}} -
  • - {{#link-to 'crate.version' version.num}} - {{ version.num }} - {{/link-to}} -
  • - {{/each}} - {{/rl-dropdown}} - {{/rl-dropdown-container}} -

    Downloads over the last 90 days

    {{download-graph data=downloadData}} diff --git a/app/templates/data-access.hbs b/app/templates/data-access.hbs new file mode 100644 index 00000000000..eb5d5ee0892 --- /dev/null +++ b/app/templates/data-access.hbs @@ -0,0 +1,34 @@ +
    + {{svg-jar 'circle-with-i'}} +

    Accessing the Crates.io Data

    +
    + +

    + There are several ways of accessing the Crates.io data. You should try the + options in the order listed. +

    + +
      +
    1. + + The crates.io index. + + This git repository is updated by crates.io, and it is used + by Cargo to speed up local dependency resolution. It contains the majority + of the data exposed by crates.io and is cheap to clone and get updates. +
    2. +
    3. + The database dumps (experimental). The dump contains all information + exposed by the API in a single download. It is updated every 24 hours. + The latest dump is available at the address + https://static.crates.io/db-dump.tar.gz. + Information on using the dump is contained in the tarball. +
    4. +
    5. + Crawl the crates.io API. This should be used as a last resort, and + doing so is subject to our {{#link-to 'policies'}}crawling policy{{/link-to}}. + If the index and the database dumps do not satisfy your needs, we're happy to + discuss solutions that don't require you to crawl the registry. + You can email us at help@crates.io. +
    6. +
    diff --git a/app/templates/policies.hbs b/app/templates/policies.hbs index 3e99e6d441a..3f24f3cc560 100644 --- a/app/templates/policies.hbs +++ b/app/templates/policies.hbs @@ -112,15 +112,8 @@

    Crawlers

    - Before resorting to crawling crates.io, you should first see if you are able to - gather the information you need from the - crates.io index, - which is a public git repository containing the majority - of the information availble through our API. - - If the index does not have the information you need, we're also happy to - discuss solutions to your needs that don't require you to crawl the registry. - You can email us at help@crates.io. + Before resorting to crawling crates.io, please read + {{#link-to 'data-access'}}Accessing the Crates.io Data{{/link-to}}.

    diff --git a/ember-cli-build.js b/ember-cli-build.js index 1361574be20..9013c257c74 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -51,6 +51,9 @@ module.exports = function(defaults) { app.import('node_modules/timekeeper/lib/timekeeper.js', { using: [{ transformation: 'cjs', as: 'timekeeper' }], }); + app.import('node_modules/semver/semver.js', { + using: [{ transformation: 'cjs', as: 'semver' }], + }); return app.toTree(); }; diff --git a/migrations/2017-10-08-193512_category_trees/up.sql b/migrations/2017-10-08-193512_category_trees/up.sql index 579160446b4..0fe64abba14 100644 --- a/migrations/2017-10-08-193512_category_trees/up.sql +++ b/migrations/2017-10-08-193512_category_trees/up.sql @@ -1,5 +1,4 @@ --- Your SQL goes here -CREATE EXTENSION ltree; +CREATE EXTENSION IF NOT EXISTS ltree; -- Create the new column which will represent our category tree. -- Fill it with values from `slug` column and then set to non-null diff --git a/migrations/2019-01-26-090348_create_version_owner_actions/down.sql b/migrations/2019-01-26-090348_create_version_owner_actions/down.sql new file mode 100644 index 00000000000..f3f9004202f --- /dev/null +++ b/migrations/2019-01-26-090348_create_version_owner_actions/down.sql @@ -0,0 +1 @@ +DROP TABLE version_owner_actions; diff --git a/migrations/2019-01-26-090348_create_version_owner_actions/up.sql b/migrations/2019-01-26-090348_create_version_owner_actions/up.sql new file mode 100644 index 00000000000..7149e80f239 --- /dev/null +++ b/migrations/2019-01-26-090348_create_version_owner_actions/up.sql @@ -0,0 +1,8 @@ +CREATE TABLE version_owner_actions ( + id SERIAL PRIMARY KEY, + version_id INTEGER REFERENCES versions(id) ON DELETE CASCADE, + owner_id INTEGER REFERENCES users(id), + owner_token_id INTEGER REFERENCES api_tokens(id), + action INTEGER NOT NULL, + time TIMESTAMP NOT NULL DEFAULT now() +); diff --git a/migrations/2019-05-14-165316_index_crate_name_for_like/up.sql b/migrations/2019-05-14-165316_index_crate_name_for_like/up.sql index f188a9cd166..8b38c66cb4e 100644 --- a/migrations/2019-05-14-165316_index_crate_name_for_like/up.sql +++ b/migrations/2019-05-14-165316_index_crate_name_for_like/up.sql @@ -1,2 +1,2 @@ -CREATE EXTENSION pg_trgm; +CREATE EXTENSION IF NOT EXISTS pg_trgm; CREATE INDEX index_crates_name_tgrm ON crates USING gin (canon_crate_name(name) gin_trgm_ops); diff --git a/migrations/2019-09-15-194259_add_badges_crate_id_foreign_key/down.sql b/migrations/2019-09-15-194259_add_badges_crate_id_foreign_key/down.sql new file mode 100644 index 00000000000..c949324fb09 --- /dev/null +++ b/migrations/2019-09-15-194259_add_badges_crate_id_foreign_key/down.sql @@ -0,0 +1 @@ +ALTER TABLE badges DROP CONSTRAINT fk_badges_crate_id; diff --git a/migrations/2019-09-15-194259_add_badges_crate_id_foreign_key/up.sql b/migrations/2019-09-15-194259_add_badges_crate_id_foreign_key/up.sql new file mode 100644 index 00000000000..603d09354c7 --- /dev/null +++ b/migrations/2019-09-15-194259_add_badges_crate_id_foreign_key/up.sql @@ -0,0 +1,3 @@ +DELETE FROM badges WHERE crate_id NOT IN (SELECT id FROM crates); +ALTER TABLE badges + ADD CONSTRAINT fk_badges_crate_id FOREIGN KEY (crate_id) REFERENCES crates(id) ON DELETE CASCADE; diff --git a/migrations/2019-09-18-233204_fix_int_type_in_to_semver_no_prerelease/down.sql b/migrations/2019-09-18-233204_fix_int_type_in_to_semver_no_prerelease/down.sql new file mode 100644 index 00000000000..c828f5301ee --- /dev/null +++ b/migrations/2019-09-18-233204_fix_int_type_in_to_semver_no_prerelease/down.sql @@ -0,0 +1,21 @@ +DROP FUNCTION to_semver_no_prerelease(text); +DROP TYPE semver_triple; + +-- Restores the type and function to what they were created as in +-- migrations/20170308140537_create_to_semver_no_prerelease/up.sql + +CREATE TYPE semver_triple AS ( + major int4, + minor int4, + teeny int4 +); + +CREATE FUNCTION to_semver_no_prerelease(text) RETURNS semver_triple IMMUTABLE AS $$ + SELECT ( + split_part($1, '.', 1)::int4, + split_part($1, '.', 2)::int4, + split_part(split_part($1, '+', 1), '.', 3)::int4 + )::semver_triple + WHERE strpos($1, '-') = 0 + $$ LANGUAGE SQL +; diff --git a/migrations/2019-09-18-233204_fix_int_type_in_to_semver_no_prerelease/up.sql b/migrations/2019-09-18-233204_fix_int_type_in_to_semver_no_prerelease/up.sql new file mode 100644 index 00000000000..05c11285485 --- /dev/null +++ b/migrations/2019-09-18-233204_fix_int_type_in_to_semver_no_prerelease/up.sql @@ -0,0 +1,18 @@ +DROP FUNCTION to_semver_no_prerelease(text); +DROP TYPE semver_triple; + +CREATE TYPE semver_triple AS ( + major numeric, + minor numeric, + teeny numeric +); + +CREATE FUNCTION to_semver_no_prerelease(text) RETURNS semver_triple IMMUTABLE AS $$ + SELECT ( + split_part($1, '.', 1)::numeric, + split_part($1, '.', 2)::numeric, + split_part(split_part($1, '+', 1), '.', 3)::numeric + )::semver_triple + WHERE strpos($1, '-') = 0 + $$ LANGUAGE SQL +; diff --git a/migrations/2019-09-19-191534_remove-index-already-removed-in-prod/down.sql b/migrations/2019-09-19-191534_remove-index-already-removed-in-prod/down.sql new file mode 100644 index 00000000000..e2979e87336 --- /dev/null +++ b/migrations/2019-09-19-191534_remove-index-already-removed-in-prod/down.sql @@ -0,0 +1 @@ +CREATE INDEX IF NOT EXISTS index_version_crate_id ON versions USING btree (crate_id); diff --git a/migrations/2019-09-19-191534_remove-index-already-removed-in-prod/up.sql b/migrations/2019-09-19-191534_remove-index-already-removed-in-prod/up.sql new file mode 100644 index 00000000000..a1d81b8bf24 --- /dev/null +++ b/migrations/2019-09-19-191534_remove-index-already-removed-in-prod/up.sql @@ -0,0 +1 @@ +DROP INDEX IF EXISTS index_version_crate_id; diff --git a/package-lock.json b/package-lock.json index d176ca3fe2e..0c5d70d8922 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,9 +54,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "minimist": { @@ -99,9 +99,9 @@ "dev": true }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true } } @@ -162,9 +162,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true } } @@ -241,9 +241,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true } } @@ -273,9 +273,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true } } @@ -596,9 +596,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true } } @@ -1169,9 +1169,9 @@ "dev": true }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "ms": { @@ -1194,9 +1194,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "to-fast-properties": { @@ -1534,20 +1534,21 @@ } }, "@ember/test-helpers": { - "version": "0.7.24", - "resolved": "https://registry.npmjs.org/@ember/test-helpers/-/test-helpers-0.7.24.tgz", - "integrity": "sha512-/NGE9ol/f51uTr8UlEHi6IaLUa0LponwRAFg5z9UKonTtw7VZHjeVMtH8QIqgFXBDsSH8t8cKPWdD0gHZqAxbQ==", + "version": "0.7.27", + "resolved": "https://registry.npmjs.org/@ember/test-helpers/-/test-helpers-0.7.27.tgz", + "integrity": "sha512-AQESk0FTFxRY6GyZ8PharR4SC7Fju0rXqNkfNYIntAjzefZ8xEqEM4iXDj5h7gAvfx/8dA69AQ9+p7ubc+KvJg==", "dev": true, "requires": { "broccoli-funnel": "^2.0.1", + "ember-assign-polyfill": "~2.4.0", "ember-cli-babel": "^6.12.0", "ember-cli-htmlbars-inline-precompile": "^1.0.0" }, "dependencies": { "broccoli-funnel": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz", - "integrity": "sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz", + "integrity": "sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ==", "dev": true, "requires": { "array-equal": "^1.0.0", @@ -1812,18 +1813,6 @@ "json-stable-stringify": "^1.0.1" } }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, "amd-name-resolver": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/amd-name-resolver/-/amd-name-resolver-0.0.7.tgz", @@ -1870,13 +1859,13 @@ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "aot-test-generators": { @@ -1997,13 +1986,10 @@ } }, "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true }, "arr-flatten": { "version": "1.1.0", @@ -2044,9 +2030,9 @@ "dev": true }, "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, "arraybuffer.slice": { @@ -2108,12 +2094,6 @@ "username-sync": "1.0.1" } }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", @@ -2469,6 +2449,14 @@ "dev": true, "requires": { "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "babel-plugin-ember-modules-api-polyfill": { @@ -3074,6 +3062,12 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz", "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=", "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -3383,12 +3377,6 @@ "callsite": "1.0.0" } }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true - }, "binaryextensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.0.0.tgz", @@ -3576,14 +3564,32 @@ } }, "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "broccoli": { @@ -4392,6 +4398,14 @@ "lodash.merge": "^4.3.0", "lodash.omit": "^4.1.0", "lodash.uniq": "^4.2.0" + }, + "dependencies": { + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + } } }, "broccoli-plugin": { @@ -4683,13 +4697,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, "can-symlink": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/can-symlink/-/can-symlink-1.0.0.tgz", @@ -4776,17 +4783,6 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -4829,23 +4825,6 @@ "lodash": "^4.1.0" } }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -5071,9 +5050,9 @@ "dev": true }, "clipboard": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-1.7.1.tgz", - "integrity": "sha1-Ng1taUbpmnof7zleQrqStem1oWs=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", + "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", "dev": true, "optional": true, "requires": { @@ -5082,27 +5061,6 @@ "tiny-emitter": "^2.0.0" } }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, "clone": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", @@ -6044,6 +6002,14 @@ "requires": { "resolve": "^1.3.3", "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } } } @@ -6057,6 +6023,16 @@ "ember-cli-babel": "^6.3.0" } }, + "ember-assign-polyfill": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ember-assign-polyfill/-/ember-assign-polyfill-2.4.0.tgz", + "integrity": "sha512-0SnGQb9CenRqbZdIa1KFsEjT+1ijGWfAbCSaDbg5uVa5l6HPdppuTzOXK6sfEQMsd2nbrp27QWFy7W5VX6l4Ag==", + "dev": true, + "requires": { + "ember-cli-babel": "^6.6.0", + "ember-cli-version-checker": "^2.0.0" + } + }, "ember-cli": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ember-cli/-/ember-cli-3.9.0.tgz", @@ -7429,6 +7405,12 @@ "resolved": "https://registry.npmjs.org/is-git-url/-/is-git-url-1.0.0.tgz", "integrity": "sha1-U/aEzRQyhbUsMkS05vKCU1J69ms=", "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -8688,6 +8670,14 @@ "requires": { "resolve": "^1.3.3", "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "merge-trees": { @@ -8779,6 +8769,14 @@ "requires": { "resolve": "^1.3.3", "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "has-flag": { @@ -8867,6 +8865,12 @@ "ms": "2.0.0" } }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, "matcher-collection": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-1.0.5.tgz", @@ -8917,6 +8921,14 @@ "requires": { "resolve": "^1.3.3", "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "ember-compatibility-helpers": { @@ -9321,6 +9333,12 @@ "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.2.1.tgz", "integrity": "sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo=", "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -9832,86 +9850,88 @@ "ember-cli-babel": "^6.3.0" } }, - "ember-inflector": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ember-inflector/-/ember-inflector-2.1.0.tgz", - "integrity": "sha512-o7X+MdPuMgH6GGP8JsZ6mr+WYiCcymzjPLr0ct2IUw4lh1EwVtmePuY6fBLuWmyQE1nJq4smDyNoOCE74n3f7g==", - "dev": true, - "requires": { - "ember-cli-babel": "^6.0.0" - } - }, - "ember-keyboard": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ember-keyboard/-/ember-keyboard-4.0.0.tgz", - "integrity": "sha512-445XJXehcxzB/bPFWNhA0OO/m6pQ3sfipCGcjMGSU3erpOZSfM4kZ7uRFEUIf0Pz0tyHRQ9BoLq5RY7VBEXUWw==", + "ember-in-element-polyfill": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ember-in-element-polyfill/-/ember-in-element-polyfill-0.2.0.tgz", + "integrity": "sha512-cl7hWFhBcwbPbXOHjvupufwgQGRWnPNMXcJT9M/e07AbHVjbI7EnMqOfW1V2lJKsm6KQ1hT3frDcNQWZtS+6lQ==", "dev": true, "requires": { - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "ember-cli-babel": "^6.6.0" + "debug": "^3.1.0", + "ember-cli-babel": "^7.1.2", + "ember-cli-version-checker": "^2.1.0" }, "dependencies": { - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "amd-name-resolver": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/amd-name-resolver/-/amd-name-resolver-1.3.1.tgz", + "integrity": "sha512-26qTEWqZQ+cxSYygZ4Cf8tsjDBLceJahhtewxtKZA3SRa4PluuqYCuheemDQD+7Mf5B7sr+zhTDWAHDh02a1Dw==", "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" + "ensure-posix-path": "^1.0.1", + "object-hash": "^1.3.1" } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "babel-plugin-debug-macros": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.3.tgz", + "integrity": "sha512-E+NI8TKpxJDBbVkdWkwHrKgJi696mnRL8XYrOPYw82veNHPDORM9WIQifl6TpIo8PNy2tU2skPqbfkmHXrHKQA==", "dev": true, "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "semver": "^5.3.0" } }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "ember-load-initializers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ember-load-initializers/-/ember-load-initializers-1.0.0.tgz", - "integrity": "sha1-SRnq8G9t/sp+E0Yz2MBabJkh5uc=", - "dev": true, - "requires": { - "ember-cli-babel": "^6.0.0-beta.7" - } - }, - "ember-lodash": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/ember-lodash/-/ember-lodash-4.18.0.tgz", - "integrity": "sha1-Rd5wDWpPaPHNYoiNkLUKpkd7moM=", - "dev": true, - "requires": { - "broccoli-debug": "^0.6.1", - "broccoli-funnel": "^2.0.1", - "broccoli-merge-trees": "^2.0.0", - "broccoli-string-replace": "^0.1.1", - "ember-cli-babel": "^6.10.0", - "lodash-es": "^4.17.4" - }, - "dependencies": { - "broccoli-funnel": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz", - "integrity": "sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg==", + "babel-plugin-ember-modules-api-polyfill": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.12.0.tgz", + "integrity": "sha512-ZQU4quX0TJ1yYyosPy5PFigKdCFEVHJ6H0b3hwjxekIP9CDwzk0OhQuKhCOPti+d52VWjjCjxu2BrXEih29mFw==", "dev": true, "requires": { - "array-equal": "^1.0.0", - "blank-object": "^1.0.1", - "broccoli-plugin": "^1.3.0", - "debug": "^2.2.0", + "ember-rfc176-data": "^0.3.12" + } + }, + "broccoli-babel-transpiler": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.3.0.tgz", + "integrity": "sha512-tsXNvDf3gp6g8rGkz234AhbaIRUsCdd6CM3ikfkJVB0EpC8ZAczGsFKTjENLy1etx4s7FkruW/QjI7Wfdhx6Ng==", + "dev": true, + "requires": { + "@babel/core": "^7.3.3", + "@babel/polyfill": "^7.0.0", + "broccoli-funnel": "^2.0.2", + "broccoli-merge-trees": "^3.0.2", + "broccoli-persistent-filter": "^2.2.1", + "clone": "^2.1.2", + "hash-for-dep": "^1.4.7", + "heimdalljs-logger": "^0.1.9", + "json-stable-stringify": "^1.0.1", + "rsvp": "^4.8.4", + "workerpool": "^3.1.1" + } + }, + "broccoli-debug": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/broccoli-debug/-/broccoli-debug-0.6.5.tgz", + "integrity": "sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg==", + "dev": true, + "requires": { + "broccoli-plugin": "^1.2.1", + "fs-tree-diff": "^0.5.2", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "symlink-or-copy": "^1.1.8", + "tree-sync": "^1.2.2" + } + }, + "broccoli-funnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz", + "integrity": "sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ==", + "dev": true, + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", "fast-ordered-set": "^1.0.0", "fs-tree-diff": "^0.5.3", "heimdalljs": "^0.2.0", @@ -9921,171 +9941,1123 @@ "rimraf": "^2.4.3", "symlink-or-copy": "^1.0.0", "walk-sync": "^0.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "broccoli-merge-trees": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-2.0.0.tgz", - "integrity": "sha1-EK6kbdXOvMi499WlTwqEpPC7kLk=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz", + "integrity": "sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A==", "dev": true, "requires": { "broccoli-plugin": "^1.3.0", - "merge-trees": "^1.0.1" + "merge-trees": "^2.0.0" } - } - } - }, - "ember-macro-helpers": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/ember-macro-helpers/-/ember-macro-helpers-0.17.0.tgz", - "integrity": "sha1-XmSkn0duOMGRav91+UlFVTPNGr4=", - "dev": true, - "requires": { - "ember-cli-babel": "^6.6.0", - "ember-cli-string-utils": "^1.1.0", - "ember-cli-test-info": "^1.0.0", - "ember-weakmap": "^3.0.0" - } - }, - "ember-maybe-import-regenerator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz", - "integrity": "sha1-NdQYKK+m1qWbwNo85H80xXPXdso=", - "dev": true, - "requires": { - "broccoli-funnel": "^1.0.1", - "broccoli-merge-trees": "^1.0.0", - "ember-cli-babel": "^6.0.0-beta.4", - "regenerator-runtime": "^0.9.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", - "integrity": "sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck=", + }, + "broccoli-persistent-filter": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz", + "integrity": "sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g==", + "dev": true, + "requires": { + "async-disk-cache": "^1.2.1", + "async-promise-queue": "^1.0.3", + "broccoli-plugin": "^1.0.0", + "fs-tree-diff": "^2.0.0", + "hash-for-dep": "^1.5.0", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "mkdirp": "^0.5.1", + "promise-map-series": "^0.2.1", + "rimraf": "^2.6.1", + "rsvp": "^4.7.0", + "symlink-or-copy": "^1.0.1", + "sync-disk-cache": "^1.3.3", + "walk-sync": "^1.0.0" + }, + "dependencies": { + "ensure-posix-path": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz", + "integrity": "sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==", + "dev": true + }, + "fs-tree-diff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fs-tree-diff/-/fs-tree-diff-2.0.1.tgz", + "integrity": "sha512-x+CfAZ/lJHQqwlD64pYM5QxWjzWhSjroaVsr8PW831zOApL55qPibed0c+xebaLWVr2BnHFoHdrwOv8pzt8R5A==", + "dev": true, + "requires": { + "@types/symlink-or-copy": "^1.2.0", + "heimdalljs-logger": "^0.1.7", + "object-assign": "^4.1.0", + "path-posix": "^1.0.0", + "symlink-or-copy": "^1.1.8" + } + }, + "walk-sync": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-1.1.4.tgz", + "integrity": "sha512-nowc9thB/Jg0KW4TgxoRjLLYRPvl3DB/98S89r4ZcJqq2B0alNcKDh6pzLkBSkPMzRSMsJghJHQi79qw0YWEkA==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "ensure-posix-path": "^1.1.0", + "matcher-collection": "^1.1.1" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true - } - } - }, - "ember-moment": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/ember-moment/-/ember-moment-7.5.0.tgz", - "integrity": "sha1-ntJbMq6UGy8dkRbET1GKUr2wFyI=", - "dev": true, - "requires": { - "ember-cli-babel": "^6.7.2", - "ember-getowner-polyfill": "^2.0.1", - "ember-macro-helpers": "^0.17.0" - }, - "dependencies": { + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ember-cli-babel": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-7.12.0.tgz", + "integrity": "sha512-+EGQsbPvh19nNXHCm6rVBx2CdlxQlzxMyhey5hsGViDPriDI4PFYXYaFWdGizDrmZoDcG/Ywpeph3hl0NxGQTg==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.3.4", + "@babel/plugin-proposal-decorators": "^7.3.0", + "@babel/plugin-transform-modules-amd": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.2.0", + "@babel/polyfill": "^7.0.0", + "@babel/preset-env": "^7.0.0", + "@babel/runtime": "^7.2.0", + "amd-name-resolver": "^1.2.1", + "babel-plugin-debug-macros": "^0.3.0", + "babel-plugin-ember-modules-api-polyfill": "^2.12.0", + "babel-plugin-module-resolver": "^3.1.1", + "broccoli-babel-transpiler": "^7.3.0", + "broccoli-debug": "^0.6.4", + "broccoli-funnel": "^2.0.1", + "broccoli-source": "^1.1.0", + "clone": "^2.1.2", + "ember-cli-babel-plugin-helpers": "^1.1.0", + "ember-cli-version-checker": "^2.1.2", + "ensure-posix-path": "^1.0.2", + "semver": "^5.5.0" + } + }, "ember-cli-version-checker": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz", - "integrity": "sha512-ssiNyVTp+PphroFum8guHX9py4xU1PCxkRYgb25NxumgjpKTPjhkgTfpRRKXlIQe+/wVMmhf+Uv6w9vSLZKWKQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz", + "integrity": "sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg==", "dev": true, "requires": { "resolve": "^1.3.3", "semver": "^5.3.0" } }, - "ember-factory-for-polyfill": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/ember-factory-for-polyfill/-/ember-factory-for-polyfill-1.3.1.tgz", - "integrity": "sha512-y3iG2iCzH96lZMTWQw6LWNLAfOmDC4pXKbZP6FxG8lt7GGaNFkZjwsf+Z5GAe7kxfD7UG4lVkF7x37K82rySGA==", + "ember-rfc176-data": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/ember-rfc176-data/-/ember-rfc176-data-0.3.12.tgz", + "integrity": "sha512-g9HeZj/gU5bfIIrGXkP7MhS2b3Vu5DfNUrYr14hy99TgIvtZETO+96QF4WOEUXGjIJdfTRjerVnQlqngPQSv1g==", + "dev": true + }, + "hash-for-dep": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hash-for-dep/-/hash-for-dep-1.5.1.tgz", + "integrity": "sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw==", "dev": true, "requires": { - "ember-cli-version-checker": "^2.1.0" + "broccoli-kitchen-sink-helpers": "^0.3.1", + "heimdalljs": "^0.2.3", + "heimdalljs-logger": "^0.1.7", + "path-root": "^0.1.1", + "resolve": "^1.10.0", + "resolve-package-path": "^1.0.11" + } + }, + "matcher-collection": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-1.1.2.tgz", + "integrity": "sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g==", + "dev": true, + "requires": { + "minimatch": "^3.0.2" + } + }, + "merge-trees": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-trees/-/merge-trees-2.0.0.tgz", + "integrity": "sha512-5xBbmqYBalWqmhYm51XlohhkmVOua3VAUrrWh8t9iOkaLpS6ifqm/UVuUjQCeDVJ9Vx3g2l6ihfkbLSTeKsHbw==", + "dev": true, + "requires": { + "fs-updater": "^1.0.4", + "heimdalljs": "^0.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "workerpool": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-3.1.2.tgz", + "integrity": "sha512-WJFA0dGqIK7qj7xPTqciWBH5DlJQzoPjsANvc3Y4hNB0SScT+Emjvt0jPPkDBUjBNngX1q9hHgt1Gfwytu6pug==", + "dev": true, + "requires": { + "@babel/core": "^7.3.4", + "object-assign": "4.1.1", + "rsvp": "^4.8.4" + } + } + } + }, + "ember-inflector": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ember-inflector/-/ember-inflector-2.1.0.tgz", + "integrity": "sha512-o7X+MdPuMgH6GGP8JsZ6mr+WYiCcymzjPLr0ct2IUw4lh1EwVtmePuY6fBLuWmyQE1nJq4smDyNoOCE74n3f7g==", + "dev": true, + "requires": { + "ember-cli-babel": "^6.0.0" + } + }, + "ember-keyboard": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ember-keyboard/-/ember-keyboard-4.0.0.tgz", + "integrity": "sha512-445XJXehcxzB/bPFWNhA0OO/m6pQ3sfipCGcjMGSU3erpOZSfM4kZ7uRFEUIf0Pz0tyHRQ9BoLq5RY7VBEXUWw==", + "dev": true, + "requires": { + "babel-plugin-transform-object-rest-spread": "^6.26.0", + "ember-cli-babel": "^6.6.0" + }, + "dependencies": { + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "ember-load-initializers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ember-load-initializers/-/ember-load-initializers-1.0.0.tgz", + "integrity": "sha1-SRnq8G9t/sp+E0Yz2MBabJkh5uc=", + "dev": true, + "requires": { + "ember-cli-babel": "^6.0.0-beta.7" + } + }, + "ember-lodash": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/ember-lodash/-/ember-lodash-4.18.0.tgz", + "integrity": "sha1-Rd5wDWpPaPHNYoiNkLUKpkd7moM=", + "dev": true, + "requires": { + "broccoli-debug": "^0.6.1", + "broccoli-funnel": "^2.0.1", + "broccoli-merge-trees": "^2.0.0", + "broccoli-string-replace": "^0.1.1", + "ember-cli-babel": "^6.10.0", + "lodash-es": "^4.17.4" + }, + "dependencies": { + "broccoli-funnel": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz", + "integrity": "sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg==", + "dev": true, + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + } + }, + "broccoli-merge-trees": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-2.0.0.tgz", + "integrity": "sha1-EK6kbdXOvMi499WlTwqEpPC7kLk=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "merge-trees": "^1.0.1" + } + } + } + }, + "ember-macro-helpers": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/ember-macro-helpers/-/ember-macro-helpers-0.17.0.tgz", + "integrity": "sha1-XmSkn0duOMGRav91+UlFVTPNGr4=", + "dev": true, + "requires": { + "ember-cli-babel": "^6.6.0", + "ember-cli-string-utils": "^1.1.0", + "ember-cli-test-info": "^1.0.0", + "ember-weakmap": "^3.0.0" + } + }, + "ember-maybe-import-regenerator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ember-maybe-import-regenerator/-/ember-maybe-import-regenerator-0.1.6.tgz", + "integrity": "sha1-NdQYKK+m1qWbwNo85H80xXPXdso=", + "dev": true, + "requires": { + "broccoli-funnel": "^1.0.1", + "broccoli-merge-trees": "^1.0.0", + "ember-cli-babel": "^6.0.0-beta.4", + "regenerator-runtime": "^0.9.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz", + "integrity": "sha1-0z65XQ0gAaS+OWWXB8UbDLcc4Ck=", + "dev": true + } + } + }, + "ember-moment": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/ember-moment/-/ember-moment-7.5.0.tgz", + "integrity": "sha1-ntJbMq6UGy8dkRbET1GKUr2wFyI=", + "dev": true, + "requires": { + "ember-cli-babel": "^6.7.2", + "ember-getowner-polyfill": "^2.0.1", + "ember-macro-helpers": "^0.17.0" + }, + "dependencies": { + "ember-cli-version-checker": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz", + "integrity": "sha512-ssiNyVTp+PphroFum8guHX9py4xU1PCxkRYgb25NxumgjpKTPjhkgTfpRRKXlIQe+/wVMmhf+Uv6w9vSLZKWKQ==", + "dev": true, + "requires": { + "resolve": "^1.3.3", + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "ember-factory-for-polyfill": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ember-factory-for-polyfill/-/ember-factory-for-polyfill-1.3.1.tgz", + "integrity": "sha512-y3iG2iCzH96lZMTWQw6LWNLAfOmDC4pXKbZP6FxG8lt7GGaNFkZjwsf+Z5GAe7kxfD7UG4lVkF7x37K82rySGA==", + "dev": true, + "requires": { + "ember-cli-version-checker": "^2.1.0" + } + }, + "ember-getowner-polyfill": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz", + "integrity": "sha512-rwGMJgbGzxIAiWYjdpAh04Abvt0s3HuS/VjHzUFhVyVg2pzAuz45B9AzOxYXzkp88vFC7FPaiA4kE8NxNk4A4Q==", + "dev": true, + "requires": { + "ember-cli-version-checker": "^2.1.0", + "ember-factory-for-polyfill": "^1.3.1" + } + } + } + }, + "ember-page-title": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/ember-page-title/-/ember-page-title-4.0.5.tgz", + "integrity": "sha512-coBzaaIs/WKhjosUjegyiiS7s4/mXGonTaG1hUFG2oOJfcVrPWjCml6NutkC9Gb2b3xsaUfbJv5IMNaynVzNSA==", + "dev": true, + "requires": { + "ember-cli-babel": "^6.6.0", + "ember-cli-head": "^0.4.0", + "ember-cli-htmlbars": "^2.0.1", + "ember-copy": "^1.0.0" + } + }, + "ember-percy": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ember-percy/-/ember-percy-1.4.0.tgz", + "integrity": "sha1-xBX6Pf4WKFDZUDlLf8m9SjWFu4I=", + "dev": true, + "requires": { + "body-parser": "^1.15.0", + "ember-cli-babel": "^6.10.0", + "es6-promise-pool": "^2.4.1", + "percy-client": "^2.8.0", + "walk": "^2.3.9" + }, + "dependencies": { + "babel-plugin-ember-modules-api-polyfill": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz", + "integrity": "sha512-cv5ZimF5X52uW7Ul83UUxtsFZE6rZYkMv6qWnAeiDLT1/KtpVrTkJpwzDlvJ/FhKJZ43ih4GbFbhuhBKKT7vIw==", + "dev": true, + "requires": { + "ember-rfc176-data": "^0.3.0" + } + }, + "broccoli-babel-transpiler": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.4.tgz", + "integrity": "sha512-h63g7iOBWdxj0GuZw8kNsyaD1T9weKsY3I+gp3rOefozbHwUesJ43vzLy0jj3t/rbiP2czcJAlyHS48EcRil8Q==", + "dev": true, + "requires": { + "babel-core": "^6.14.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "broccoli-persistent-filter": "^1.4.0", + "clone": "^2.0.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^3.5.0", + "workerpool": "^2.3.0" + } + }, + "ember-cli-babel": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.12.0.tgz", + "integrity": "sha512-LMwZ3Xf3Q3jQUXaJtLLJsbbhRZRNv/iea64lZ8OgqZp1fh66CSXfmqV3L9QSuYQKPDNqFiu2v6IpOT08C6GU6w==", + "dev": true, + "requires": { + "amd-name-resolver": "0.0.7", + "babel-plugin-debug-macros": "^0.1.11", + "babel-plugin-ember-modules-api-polyfill": "^2.3.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.0", + "babel-polyfill": "^6.16.0", + "babel-preset-env": "^1.5.1", + "broccoli-babel-transpiler": "^6.1.2", + "broccoli-debug": "^0.6.2", + "broccoli-funnel": "^1.0.0", + "broccoli-source": "^1.1.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^2.1.0", + "semver": "^5.4.1" + } + }, + "ember-cli-version-checker": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz", + "integrity": "sha512-ssiNyVTp+PphroFum8guHX9py4xU1PCxkRYgb25NxumgjpKTPjhkgTfpRRKXlIQe+/wVMmhf+Uv6w9vSLZKWKQ==", + "dev": true, + "requires": { + "resolve": "^1.3.3", + "semver": "^5.3.0" + } + }, + "ember-rfc176-data": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz", + "integrity": "sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "workerpool": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-2.3.0.tgz", + "integrity": "sha512-JP5DpviEV84zDmz13QnD4FfRjZBjnTOYY2O4pGgxtlqLh47WOzQFHm8o17TE5OSfcDoKC6vHSrN4yPju93DW0Q==", + "dev": true, + "requires": { + "object-assign": "4.1.1" + } + } + } + }, + "ember-prism": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ember-prism/-/ember-prism-0.5.0.tgz", + "integrity": "sha512-IvjrS5SA08lDAvjvivV2DiQQgDu/P2f69z2HYH2vzduQw4m7BYF/+xK57zcMQWresIckH/tgKKdnJLZHLAE0Xg==", + "dev": true, + "requires": { + "ember-cli-babel": "^7.1.2", + "ember-cli-htmlbars": "^3.0.0", + "ember-cli-node-assets": "^0.2.2", + "ember-in-element-polyfill": "^0.2.0", + "prismjs": "^1.15.0" + }, + "dependencies": { + "amd-name-resolver": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/amd-name-resolver/-/amd-name-resolver-1.3.1.tgz", + "integrity": "sha512-26qTEWqZQ+cxSYygZ4Cf8tsjDBLceJahhtewxtKZA3SRa4PluuqYCuheemDQD+7Mf5B7sr+zhTDWAHDh02a1Dw==", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.1", + "object-hash": "^1.3.1" + } + }, + "babel-plugin-debug-macros": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.3.tgz", + "integrity": "sha512-E+NI8TKpxJDBbVkdWkwHrKgJi696mnRL8XYrOPYw82veNHPDORM9WIQifl6TpIo8PNy2tU2skPqbfkmHXrHKQA==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "babel-plugin-ember-modules-api-polyfill": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.12.0.tgz", + "integrity": "sha512-ZQU4quX0TJ1yYyosPy5PFigKdCFEVHJ6H0b3hwjxekIP9CDwzk0OhQuKhCOPti+d52VWjjCjxu2BrXEih29mFw==", + "dev": true, + "requires": { + "ember-rfc176-data": "^0.3.12" + } + }, + "broccoli-babel-transpiler": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.3.0.tgz", + "integrity": "sha512-tsXNvDf3gp6g8rGkz234AhbaIRUsCdd6CM3ikfkJVB0EpC8ZAczGsFKTjENLy1etx4s7FkruW/QjI7Wfdhx6Ng==", + "dev": true, + "requires": { + "@babel/core": "^7.3.3", + "@babel/polyfill": "^7.0.0", + "broccoli-funnel": "^2.0.2", + "broccoli-merge-trees": "^3.0.2", + "broccoli-persistent-filter": "^2.2.1", + "clone": "^2.1.2", + "hash-for-dep": "^1.4.7", + "heimdalljs-logger": "^0.1.9", + "json-stable-stringify": "^1.0.1", + "rsvp": "^4.8.4", + "workerpool": "^3.1.1" + } + }, + "broccoli-debug": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/broccoli-debug/-/broccoli-debug-0.6.5.tgz", + "integrity": "sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg==", + "dev": true, + "requires": { + "broccoli-plugin": "^1.2.1", + "fs-tree-diff": "^0.5.2", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "symlink-or-copy": "^1.1.8", + "tree-sync": "^1.2.2" + } + }, + "broccoli-funnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz", + "integrity": "sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ==", + "dev": true, + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + } + }, + "broccoli-merge-trees": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz", + "integrity": "sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A==", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "merge-trees": "^2.0.0" + } + }, + "broccoli-persistent-filter": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz", + "integrity": "sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g==", + "dev": true, + "requires": { + "async-disk-cache": "^1.2.1", + "async-promise-queue": "^1.0.3", + "broccoli-plugin": "^1.0.0", + "fs-tree-diff": "^2.0.0", + "hash-for-dep": "^1.5.0", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "mkdirp": "^0.5.1", + "promise-map-series": "^0.2.1", + "rimraf": "^2.6.1", + "rsvp": "^4.7.0", + "symlink-or-copy": "^1.0.1", + "sync-disk-cache": "^1.3.3", + "walk-sync": "^1.0.0" + }, + "dependencies": { + "ensure-posix-path": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz", + "integrity": "sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==", + "dev": true + }, + "fs-tree-diff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fs-tree-diff/-/fs-tree-diff-2.0.1.tgz", + "integrity": "sha512-x+CfAZ/lJHQqwlD64pYM5QxWjzWhSjroaVsr8PW831zOApL55qPibed0c+xebaLWVr2BnHFoHdrwOv8pzt8R5A==", + "dev": true, + "requires": { + "@types/symlink-or-copy": "^1.2.0", + "heimdalljs-logger": "^0.1.7", + "object-assign": "^4.1.0", + "path-posix": "^1.0.0", + "symlink-or-copy": "^1.1.8" + } + }, + "walk-sync": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-1.1.4.tgz", + "integrity": "sha512-nowc9thB/Jg0KW4TgxoRjLLYRPvl3DB/98S89r4ZcJqq2B0alNcKDh6pzLkBSkPMzRSMsJghJHQi79qw0YWEkA==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "ensure-posix-path": "^1.1.0", + "matcher-collection": "^1.1.1" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "ember-cli-babel": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-7.12.0.tgz", + "integrity": "sha512-+EGQsbPvh19nNXHCm6rVBx2CdlxQlzxMyhey5hsGViDPriDI4PFYXYaFWdGizDrmZoDcG/Ywpeph3hl0NxGQTg==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.3.4", + "@babel/plugin-proposal-decorators": "^7.3.0", + "@babel/plugin-transform-modules-amd": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.2.0", + "@babel/polyfill": "^7.0.0", + "@babel/preset-env": "^7.0.0", + "@babel/runtime": "^7.2.0", + "amd-name-resolver": "^1.2.1", + "babel-plugin-debug-macros": "^0.3.0", + "babel-plugin-ember-modules-api-polyfill": "^2.12.0", + "babel-plugin-module-resolver": "^3.1.1", + "broccoli-babel-transpiler": "^7.3.0", + "broccoli-debug": "^0.6.4", + "broccoli-funnel": "^2.0.1", + "broccoli-source": "^1.1.0", + "clone": "^2.1.2", + "ember-cli-babel-plugin-helpers": "^1.1.0", + "ember-cli-version-checker": "^2.1.2", + "ensure-posix-path": "^1.0.2", + "semver": "^5.5.0" + } + }, + "ember-cli-htmlbars": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ember-cli-htmlbars/-/ember-cli-htmlbars-3.1.0.tgz", + "integrity": "sha512-cgvRJM73IT0aePUG7oQ/afB7vSRBV3N0wu9BrWhHX2zkR7A7cUBI7KC9VPk6tbctCXoM7BRGsCC4aIjF7yrfXA==", + "dev": true, + "requires": { + "broccoli-persistent-filter": "^2.3.1", + "hash-for-dep": "^1.5.1", + "json-stable-stringify": "^1.0.1", + "strip-bom": "^3.0.0" + } + }, + "ember-cli-node-assets": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ember-cli-node-assets/-/ember-cli-node-assets-0.2.2.tgz", + "integrity": "sha1-0tVWJufMZhn4gtf+VXUfkmYCJwg=", + "dev": true, + "requires": { + "broccoli-funnel": "^1.0.1", + "broccoli-merge-trees": "^1.1.1", + "broccoli-source": "^1.1.0", + "debug": "^2.2.0", + "lodash": "^4.5.1", + "resolve": "^1.1.7" + }, + "dependencies": { + "broccoli-funnel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz", + "integrity": "sha1-zdw6/F/xaFqAI0iP/3TOb7WlEpY=", + "dev": true, + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "exists-sync": "0.0.4", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + } + }, + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha1-oAFRm7UGfwZYnZGvopQkRaLQ/bU=", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + } + } + }, + "ember-cli-version-checker": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz", + "integrity": "sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg==", + "dev": true, + "requires": { + "resolve": "^1.3.3", + "semver": "^5.3.0" + } + }, + "ember-rfc176-data": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/ember-rfc176-data/-/ember-rfc176-data-0.3.12.tgz", + "integrity": "sha512-g9HeZj/gU5bfIIrGXkP7MhS2b3Vu5DfNUrYr14hy99TgIvtZETO+96QF4WOEUXGjIJdfTRjerVnQlqngPQSv1g==", + "dev": true + }, + "hash-for-dep": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hash-for-dep/-/hash-for-dep-1.5.1.tgz", + "integrity": "sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw==", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.3.1", + "heimdalljs": "^0.2.3", + "heimdalljs-logger": "^0.1.7", + "path-root": "^0.1.1", + "resolve": "^1.10.0", + "resolve-package-path": "^1.0.11" + } + }, + "matcher-collection": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-1.1.2.tgz", + "integrity": "sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g==", + "dev": true, + "requires": { + "minimatch": "^3.0.2" + } + }, + "merge-trees": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-trees/-/merge-trees-2.0.0.tgz", + "integrity": "sha512-5xBbmqYBalWqmhYm51XlohhkmVOua3VAUrrWh8t9iOkaLpS6ifqm/UVuUjQCeDVJ9Vx3g2l6ihfkbLSTeKsHbw==", + "dev": true, + "requires": { + "fs-updater": "^1.0.4", + "heimdalljs": "^0.2.5" + } + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "workerpool": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-3.1.2.tgz", + "integrity": "sha512-WJFA0dGqIK7qj7xPTqciWBH5DlJQzoPjsANvc3Y4hNB0SScT+Emjvt0jPPkDBUjBNngX1q9hHgt1Gfwytu6pug==", + "dev": true, + "requires": { + "@babel/core": "^7.3.4", + "object-assign": "4.1.1", + "rsvp": "^4.8.4" + } + } + } + }, + "ember-promise-helpers": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ember-promise-helpers/-/ember-promise-helpers-1.0.9.tgz", + "integrity": "sha512-BDcx2X28baEL0YMKSmDGQzvdyfiFSlx4Byf34hVrAw6W7VO17YYLjeXPebVBOXLA1BMWmUo0Bb2pZRZ09MQYYA==", + "dev": true, + "requires": { + "ember-cli-babel": "^6.16.0" + }, + "dependencies": { + "amd-name-resolver": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz", + "integrity": "sha512-hlSTWGS1t6/xq5YCed7YALg7tKZL3rkl7UwEZ/eCIkn8JxmM6fU6Qs/1hwtjQqfuYxlffuUcgYEm0f5xP4YKaA==", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.1" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babel-plugin-debug-macros": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0.tgz", + "integrity": "sha512-Wpmw4TbhR3Eq2t3W51eBAQSdKlr+uAyF0GI4GtPfMCD12Y4cIdpKC9l0RjNTH/P9isFypSqqewMPm7//fnZlNA==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "babel-plugin-ember-modules-api-polyfill": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.12.0.tgz", + "integrity": "sha512-ZQU4quX0TJ1yYyosPy5PFigKdCFEVHJ6H0b3hwjxekIP9CDwzk0OhQuKhCOPti+d52VWjjCjxu2BrXEih29mFw==", + "dev": true, + "requires": { + "ember-rfc176-data": "^0.3.12" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "broccoli-babel-transpiler": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.1.tgz", + "integrity": "sha512-w6GcnkxvHcNCte5FcLGEG1hUdQvlfvSN/6PtGWU/otg69Ugk8rUk51h41R0Ugoc+TNxyeFG1opRt2RlA87XzNw==", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "broccoli-funnel": "^2.0.1", + "broccoli-merge-trees": "^2.0.0", + "broccoli-persistent-filter": "^1.4.3", + "clone": "^2.0.0", + "hash-for-dep": "^1.2.3", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^4.8.2", + "workerpool": "^2.3.0" + } + }, + "broccoli-debug": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/broccoli-debug/-/broccoli-debug-0.6.5.tgz", + "integrity": "sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg==", + "dev": true, + "requires": { + "broccoli-plugin": "^1.2.1", + "fs-tree-diff": "^0.5.2", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "symlink-or-copy": "^1.1.8", + "tree-sync": "^1.2.2" } }, - "ember-getowner-polyfill": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ember-getowner-polyfill/-/ember-getowner-polyfill-2.2.0.tgz", - "integrity": "sha512-rwGMJgbGzxIAiWYjdpAh04Abvt0s3HuS/VjHzUFhVyVg2pzAuz45B9AzOxYXzkp88vFC7FPaiA4kE8NxNk4A4Q==", + "broccoli-funnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz", + "integrity": "sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ==", "dev": true, "requires": { - "ember-cli-version-checker": "^2.1.0", - "ember-factory-for-polyfill": "^1.3.1" + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" } - } - } - }, - "ember-page-title": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/ember-page-title/-/ember-page-title-4.0.5.tgz", - "integrity": "sha512-coBzaaIs/WKhjosUjegyiiS7s4/mXGonTaG1hUFG2oOJfcVrPWjCml6NutkC9Gb2b3xsaUfbJv5IMNaynVzNSA==", - "dev": true, - "requires": { - "ember-cli-babel": "^6.6.0", - "ember-cli-head": "^0.4.0", - "ember-cli-htmlbars": "^2.0.1", - "ember-copy": "^1.0.0" - } - }, - "ember-percy": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ember-percy/-/ember-percy-1.4.0.tgz", - "integrity": "sha1-xBX6Pf4WKFDZUDlLf8m9SjWFu4I=", - "dev": true, - "requires": { - "body-parser": "^1.15.0", - "ember-cli-babel": "^6.10.0", - "es6-promise-pool": "^2.4.1", - "percy-client": "^2.8.0", - "walk": "^2.3.9" - }, - "dependencies": { - "babel-plugin-ember-modules-api-polyfill": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.0.tgz", - "integrity": "sha512-cv5ZimF5X52uW7Ul83UUxtsFZE6rZYkMv6qWnAeiDLT1/KtpVrTkJpwzDlvJ/FhKJZ43ih4GbFbhuhBKKT7vIw==", + }, + "broccoli-merge-trees": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-2.0.1.tgz", + "integrity": "sha512-WjaexJ+I8BxP5V5RNn6um/qDRSmKoiBC/QkRi79FT9ClHfldxRyCDs9mcV7mmoaPlsshmmPaUz5jdtcKA6DClQ==", "dev": true, "requires": { - "ember-rfc176-data": "^0.3.0" + "broccoli-plugin": "^1.3.0", + "merge-trees": "^1.0.1" } }, - "broccoli-babel-transpiler": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.1.4.tgz", - "integrity": "sha512-h63g7iOBWdxj0GuZw8kNsyaD1T9weKsY3I+gp3rOefozbHwUesJ43vzLy0jj3t/rbiP2czcJAlyHS48EcRil8Q==", + "broccoli-persistent-filter": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz", + "integrity": "sha512-0RejLwoC95kv4kta8KAa+FmECJCK78Qgm8SRDEK7YyU0N9Cx6KpY3UCDy9WELl3mCXLN8TokNxc7/hp3lL4lfw==", "dev": true, "requires": { - "babel-core": "^6.14.0", - "broccoli-funnel": "^1.0.0", - "broccoli-merge-trees": "^1.0.0", - "broccoli-persistent-filter": "^1.4.0", - "clone": "^2.0.0", + "async-disk-cache": "^1.2.1", + "async-promise-queue": "^1.0.3", + "broccoli-plugin": "^1.0.0", + "fs-tree-diff": "^0.5.2", "hash-for-dep": "^1.0.2", + "heimdalljs": "^0.2.1", "heimdalljs-logger": "^0.1.7", - "json-stable-stringify": "^1.0.0", - "rsvp": "^3.5.0", - "workerpool": "^2.3.0" + "mkdirp": "^0.5.1", + "promise-map-series": "^0.2.1", + "rimraf": "^2.6.1", + "rsvp": "^3.0.18", + "symlink-or-copy": "^1.0.1", + "walk-sync": "^0.3.1" + }, + "dependencies": { + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + } + } + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" } }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + }, "ember-cli-babel": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.12.0.tgz", - "integrity": "sha512-LMwZ3Xf3Q3jQUXaJtLLJsbbhRZRNv/iea64lZ8OgqZp1fh66CSXfmqV3L9QSuYQKPDNqFiu2v6IpOT08C6GU6w==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz", + "integrity": "sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA==", "dev": true, "requires": { - "amd-name-resolver": "0.0.7", - "babel-plugin-debug-macros": "^0.1.11", - "babel-plugin-ember-modules-api-polyfill": "^2.3.0", + "amd-name-resolver": "1.2.0", + "babel-plugin-debug-macros": "^0.2.0-beta.6", + "babel-plugin-ember-modules-api-polyfill": "^2.6.0", "babel-plugin-transform-es2015-modules-amd": "^6.24.0", - "babel-polyfill": "^6.16.0", - "babel-preset-env": "^1.5.1", - "broccoli-babel-transpiler": "^6.1.2", - "broccoli-debug": "^0.6.2", - "broccoli-funnel": "^1.0.0", + "babel-polyfill": "^6.26.0", + "babel-preset-env": "^1.7.0", + "broccoli-babel-transpiler": "^6.5.0", + "broccoli-debug": "^0.6.4", + "broccoli-funnel": "^2.0.0", "broccoli-source": "^1.1.0", "clone": "^2.0.0", - "ember-cli-version-checker": "^2.1.0", - "semver": "^5.4.1" + "ember-cli-version-checker": "^2.1.2", + "semver": "^5.5.0" } }, "ember-cli-version-checker": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz", - "integrity": "sha512-ssiNyVTp+PphroFum8guHX9py4xU1PCxkRYgb25NxumgjpKTPjhkgTfpRRKXlIQe+/wVMmhf+Uv6w9vSLZKWKQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz", + "integrity": "sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg==", "dev": true, "requires": { "resolve": "^1.3.3", @@ -10093,75 +11065,100 @@ } }, "ember-rfc176-data": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz", - "integrity": "sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg==", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/ember-rfc176-data/-/ember-rfc176-data-0.3.12.tgz", + "integrity": "sha512-g9HeZj/gU5bfIIrGXkP7MhS2b3Vu5DfNUrYr14hy99TgIvtZETO+96QF4WOEUXGjIJdfTRjerVnQlqngPQSv1g==", "dev": true }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "hash-for-dep": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hash-for-dep/-/hash-for-dep-1.5.1.tgz", + "integrity": "sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw==", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.3.1", + "heimdalljs": "^0.2.3", + "heimdalljs-logger": "^0.1.7", + "path-root": "^0.1.1", + "resolve": "^1.10.0", + "resolve-package-path": "^1.0.11" + } + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "workerpool": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-2.3.0.tgz", - "integrity": "sha512-JP5DpviEV84zDmz13QnD4FfRjZBjnTOYY2O4pGgxtlqLh47WOzQFHm8o17TE5OSfcDoKC6vHSrN4yPju93DW0Q==", + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { - "object-assign": "4.1.1" + "path-parse": "^1.0.6" } - } - } - }, - "ember-prism": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ember-prism/-/ember-prism-0.2.0.tgz", - "integrity": "sha1-EOdmYgcW/hXFJaAQ+5qT1qOOkmA=", - "dev": true, - "requires": { - "ember-cli-babel": "^6.8.2", - "ember-cli-htmlbars": "^2.0.3", - "ember-cli-node-assets": "^0.2.2", - "prismjs": "^1.8.3" - }, - "dependencies": { - "ember-cli-node-assets": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ember-cli-node-assets/-/ember-cli-node-assets-0.2.2.tgz", - "integrity": "sha1-0tVWJufMZhn4gtf+VXUfkmYCJwg=", + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "workerpool": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-2.3.3.tgz", + "integrity": "sha512-L1ovlYHp6UObYqElXXpbd214GgbEKDED0d3sj7pRdFXjNkb2+un/AUcCkceHizO0IVI6SOGGncrcjozruCkRgA==", "dev": true, "requires": { - "broccoli-funnel": "^1.0.1", - "broccoli-merge-trees": "^1.1.1", - "broccoli-source": "^1.1.0", - "debug": "^2.2.0", - "lodash": "^4.5.1", - "resolve": "^1.1.7" + "object-assign": "4.1.1" } } } }, "ember-qunit": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ember-qunit/-/ember-qunit-3.4.1.tgz", - "integrity": "sha512-WuWan6duE/HfygQHrgU77okTnt7B3lWcGn+N7NkBXR86pk2s+qxbX9p98uqSc0ISNt2Vg6Opz++RZn+fomHkBw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/ember-qunit/-/ember-qunit-3.5.3.tgz", + "integrity": "sha512-FmXsI1bGsZ5th25x4KEle2fLCVURTptsQODfBt+Pg8tk9rX7y79cqny91PrhtkhE+giZ8p029tnq94SdpJ4ojg==", "dev": true, "requires": { - "@ember/test-helpers": "^0.7.18", + "@ember/test-helpers": "^0.7.26", "broccoli-funnel": "^2.0.1", "broccoli-merge-trees": "^2.0.0", "common-tags": "^1.4.0", "ember-cli-babel": "^6.8.2", "ember-cli-test-loader": "^2.2.0", - "qunit": "^2.5.0" + "qunit": "~2.6.0" }, "dependencies": { "broccoli-funnel": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz", - "integrity": "sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz", + "integrity": "sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ==", "dev": true, "requires": { "array-equal": "^1.0.0", @@ -10180,9 +11177,9 @@ } }, "broccoli-merge-trees": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-2.0.0.tgz", - "integrity": "sha1-EK6kbdXOvMi499WlTwqEpPC7kLk=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-2.0.1.tgz", + "integrity": "sha512-WjaexJ+I8BxP5V5RNn6um/qDRSmKoiBC/QkRi79FT9ClHfldxRyCDs9mcV7mmoaPlsshmmPaUz5jdtcKA6DClQ==", "dev": true, "requires": { "broccoli-plugin": "^1.3.0", @@ -10223,6 +11220,14 @@ "dev": true, "requires": { "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } } } @@ -10261,6 +11266,14 @@ "requires": { "resolve": "^1.3.3", "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "ember-factory-for-polyfill": { @@ -10301,6 +11314,14 @@ "dev": true, "requires": { "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } } } @@ -10365,6 +11386,14 @@ "requires": { "resolve": "^1.3.3", "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "resolve": { @@ -11310,9 +12339,9 @@ "dev": true }, "estree-walker": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", - "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, "esutils": { @@ -11396,21 +12425,95 @@ "optional": true }, "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "fill-range": "^2.1.0" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, "expand-tilde": { @@ -11543,9 +12646,9 @@ } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", }, "extend-shallow": { "version": "3.0.2", @@ -11591,12 +12694,39 @@ } }, "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "extsprintf": { @@ -12044,12 +13174,6 @@ "flat-cache": "^2.0.1" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, "fileset": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", @@ -12083,16 +13207,26 @@ "dev": true }, "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "finalhandler": { @@ -12862,15 +13996,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, "foreachasync": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", @@ -13057,14 +14182,14 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "abbrev": { @@ -13086,7 +14211,7 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, @@ -13112,7 +14237,7 @@ } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true @@ -13142,16 +14267,16 @@ "optional": true }, "debug": { - "version": "2.6.9", + "version": "4.1.1", "bundled": true, "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true @@ -13200,7 +14325,7 @@ } }, "glob": { - "version": "7.1.2", + "version": "7.1.3", "bundled": true, "dev": true, "optional": true, @@ -13220,12 +14345,12 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", + "version": "0.4.24", "bundled": true, "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -13290,17 +14415,17 @@ "optional": true }, "minipass": { - "version": "2.2.4", + "version": "2.3.5", "bundled": true, "dev": true, "optional": true, "requires": { - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "dev": true, "optional": true, @@ -13318,35 +14443,35 @@ } }, "ms": { - "version": "2.0.0", + "version": "2.1.1", "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.2.0", + "version": "2.3.0", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^2.1.2", + "debug": "^4.1.0", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.10.0", + "version": "0.12.0", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", - "needle": "^2.2.0", + "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", - "rc": "^1.1.7", + "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" @@ -13363,13 +14488,13 @@ } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.6", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", + "version": "1.4.1", "bundled": true, "dev": true, "optional": true, @@ -13446,12 +14571,12 @@ "optional": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -13481,16 +14606,16 @@ } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true, "dev": true, "optional": true @@ -13508,7 +14633,7 @@ "optional": true }, "semver": { - "version": "5.5.0", + "version": "5.7.0", "bundled": true, "dev": true, "optional": true @@ -13561,17 +14686,17 @@ "optional": true }, "tar": { - "version": "4.4.1", + "version": "4.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, @@ -13582,12 +14707,12 @@ "optional": true }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { @@ -13597,7 +14722,7 @@ "optional": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, "dev": true, "optional": true @@ -13706,25 +14831,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -13815,31 +14921,22 @@ "dev": true }, "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.2.0.tgz", + "integrity": "sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw==", "dev": true, "requires": { - "async": "^1.4.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -14343,9 +15440,9 @@ "dev": true }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "onetime": { @@ -14478,15 +15575,6 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, "is-buffer": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", @@ -14550,33 +15638,12 @@ } } }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", @@ -14601,15 +15668,6 @@ "integrity": "sha1-U/aEzRQyhbUsMkS05vKCU1J69ms=", "dev": true }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -14617,9 +15675,9 @@ "dev": true }, "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "^3.0.2" @@ -14671,23 +15729,11 @@ "dependencies": { "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } }, "is-promise": { "version": "2.1.0", @@ -14795,13 +15841,10 @@ "dev": true }, "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true }, "isstream": { "version": "0.1.2", @@ -14863,6 +15906,12 @@ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -15018,9 +16067,9 @@ } }, "jquery": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", - "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==", "dev": true }, "jquery-deferred": { @@ -15047,9 +16096,9 @@ "dev": true }, "js-yaml": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.0.tgz", - "integrity": "sha512-0LoUNELX4S+iofCT8f4uEHIiRBR+c2AINyC8qRWfC6QNruLtxVZRJaPcu/xwMgFIgDxF25tGHaDjvxzJCNE9yw==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -15057,9 +16106,9 @@ }, "dependencies": { "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true } } @@ -15220,13 +16269,6 @@ "graceful-fs": "^4.1.9" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, "leek": { "version": "0.0.24", "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", @@ -15469,9 +16511,9 @@ } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "lodash-es": { @@ -15863,9 +16905,9 @@ "dev": true }, "lodash.merge": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", - "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "lodash.noop": { @@ -15956,13 +16998,6 @@ "cli-cursor": "^1.0.2" } }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true - }, "loose-envify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", @@ -15995,12 +17030,12 @@ } }, "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", "dev": true, "requires": { - "vlq": "^0.2.2" + "sourcemap-codec": "^1.4.4" } }, "make-dir": { @@ -16090,12 +17125,6 @@ "minimatch": "^3.0.2" } }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, "md5-hex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", @@ -16140,6 +17169,12 @@ "readable-stream": "~1.0.2" } }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -16182,24 +17217,32 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } } }, "mime": { @@ -16274,9 +17317,9 @@ } }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -16381,9 +17424,9 @@ } }, "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "dev": true, "optional": true }, @@ -16541,6 +17584,14 @@ "dev": true, "requires": { "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "nopt": { @@ -16562,6 +17613,14 @@ "is-builtin-module": "^1.0.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "normalize-path": { @@ -17235,16 +18294,6 @@ } } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -17442,18 +18491,6 @@ "callsites": "^3.0.0" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -17690,12 +18727,6 @@ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, "pretender": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/pretender/-/pretender-1.6.1.tgz", @@ -17775,12 +18806,12 @@ "dev": true }, "prismjs": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.8.4.tgz", - "integrity": "sha1-VzzHoUwsBlZuHsog2BP1rlXbgNI=", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.17.1.tgz", + "integrity": "sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q==", "dev": true, "requires": { - "clipboard": "^1.5.5" + "clipboard": "^2.0.0" } }, "private": { @@ -17894,26 +18925,50 @@ } }, "qunit": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.6.1.tgz", - "integrity": "sha512-AaILHe41G+fVC8h5wrp8U31iM2tRxLAVwH1tICtDkRbC1HDgJBjjYq0SMCZE8K3Z16MiZq3vhNhLu18KeDtS6Q==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.6.2.tgz", + "integrity": "sha512-PHbKulmd4rrDhFto7iHicIstDTX7oMRvAcI7loHstvU8J7AOGwzcchONmy+EG4KU8HDk0K90o7vO0GhlYyKlOg==", "dev": true, "requires": { - "chokidar": "1.7.0", "commander": "2.12.2", "exists-stat": "1.0.0", "findup-sync": "2.0.0", "js-reporters": "1.2.1", "resolve": "1.5.0", + "sane": "^2.5.2", "walk-sync": "0.3.2" }, "dependencies": { + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, "commander": { "version": "2.12.2", "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", "dev": true }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, "resolve": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", @@ -17922,6 +18977,33 @@ "requires": { "path-parse": "^1.0.5" } + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + } } } }, @@ -17978,31 +19060,6 @@ } } }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -18091,50 +19148,6 @@ } } }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - }, - "dependencies": { - "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==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "recast": { "version": "0.11.23", "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", @@ -18204,16 +19217,6 @@ "private": "^0.1.6" } }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3", - "is-primitive": "^2.0.0" - } - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -18556,16 +19559,6 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } - }, "rimraf": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", @@ -18602,24 +19595,30 @@ } }, "rollup-plugin-commonjs": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.1.3.tgz", - "integrity": "sha512-g91ZZKZwTW7F7vL6jMee38I8coj/Q9GBdTmXXeFL7ldgC1Ky5WJvHgbKlAiXXTh762qvohhExwUgeQGFh9suGg==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz", + "integrity": "sha512-DTZOvRoiVIHHLFBCL4pFxOaJt8pagxsVldEXBOn6wl3/V21wVaj17HFfyzTsQUuou3sZL3lEJZVWKPFblJfI6w==", "dev": true, "requires": { - "estree-walker": "^0.5.1", - "magic-string": "^0.22.4", - "resolve": "^1.5.0", - "rollup-pluginutils": "^2.0.1" + "estree-walker": "^0.6.0", + "magic-string": "^0.25.2", + "resolve": "^1.10.0", + "rollup-pluginutils": "^2.6.0" }, "dependencies": { + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, "resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } } } @@ -18644,13 +19643,12 @@ } }, "rollup-pluginutils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz", - "integrity": "sha512-xB6hsRsjdJdIYWEyYUJy/3ki5g69wrf0luHPGNK3ZSocV6HLNfio59l3dZ3TL4xUwEKgROhFi9jOCt6c5gfUWw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz", + "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==", "dev": true, "requires": { - "estree-walker": "^0.5.2", - "micromatch": "^2.3.11" + "estree-walker": "^0.6.1" } }, "route-recognizer": { @@ -19176,9 +20174,9 @@ "dev": true }, "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "send": { @@ -19225,16 +20223,10 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -19811,9 +20803,9 @@ } }, "sprintf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, "sri-toolbox": { @@ -20903,24 +21895,25 @@ "dev": true }, "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", "dev": true, "optional": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, "underscore": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", @@ -20928,9 +21921,9 @@ "dev": true }, "underscore.string": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", - "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", + "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", "dev": true, "requires": { "sprintf-js": "^1.0.3", @@ -20966,38 +21959,15 @@ "dev": true }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "unique-string": { @@ -21217,12 +22187,6 @@ "extsprintf": "1.0.2" } }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true - }, "walk": { "version": "2.3.13", "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.13.tgz", @@ -21365,13 +22329,6 @@ "string-width": "^1.0.2" } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -21551,19 +22508,6 @@ } } }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - }, "yargs-parser": { "version": "13.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", diff --git a/package.json b/package.json index 5405817efec..09b6c5679cc 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,8 @@ "ember-moment": "^7.5.0", "ember-page-title": "^4.0.5", "ember-percy": "^1.4.0", - "ember-prism": "^0.2.0", + "ember-prism": "^0.5.0", + "ember-promise-helpers": "^1.0.9", "ember-resolver": "^4.1.0", "ember-router-scroll": "^0.4.0", "ember-source": "~3.1.0", @@ -84,6 +85,7 @@ "prettier": "^1.13.4", "qunit-dom": "^0.8.4", "sass": "^1.23.0-module.beta.1", + "semver": "^6.3.0", "timekeeper": "^2.1.0" }, "engines": { diff --git a/script/ci/cargo-clean-on-new-rustc-version.sh b/script/ci/cargo-clean-on-new-rustc-version.sh index b12f780ab8a..8cbda262673 100755 --- a/script/ci/cargo-clean-on-new-rustc-version.sh +++ b/script/ci/cargo-clean-on-new-rustc-version.sh @@ -3,7 +3,7 @@ set -e manual_stamp_file=target/ci_manual_stamp -manual_stamp=6 # Change this to force a clean build on CI +manual_stamp=7 # Change this to force a clean build on CI if [ -f $manual_stamp_file ]; then if echo "$manual_stamp" | cmp -s $manual_stamp_file -; then diff --git a/script/ci/prune-cache.sh b/script/ci/prune-cache.sh index e2285c6f800..6e04ef7010e 100755 --- a/script/ci/prune-cache.sh +++ b/script/ci/prune-cache.sh @@ -7,7 +7,7 @@ du -hs target/debug crate_name="cargo-registry" test_name="all" -bin_names="delete-crate delete-version populate render-readmes server test-pagerduty transfer-crates update-downloads background-worker monitor" +bin_names="background-worker delete-crate delete-version enqueue-job monitor populate render-readmes server test-pagerduty transfer-crates" normalized_crate_name=${crate_name//-/_} rm -v target/debug/$normalized_crate_name-* diff --git a/src/app.rs b/src/app.rs index db84bdb015f..e8708416526 100644 --- a/src/app.rs +++ b/src/app.rs @@ -4,6 +4,7 @@ use crate::{db, Config, Env}; use std::{path::PathBuf, sync::Arc, time::Duration}; use diesel::r2d2; +use oauth2::basic::BasicClient; use reqwest::Client; use scheduled_thread_pool::ScheduledThreadPool; @@ -16,7 +17,7 @@ pub struct App { pub diesel_database: db::DieselPool, /// The GitHub OAuth2 configuration - pub github: oauth2::Config, + pub github: BasicClient, /// A unique key used with conduit_cookie to generate cookies pub session_key: String, @@ -43,15 +44,21 @@ impl App { /// /// - GitHub OAuth /// - Database connection pools - /// - Holds an HTTP `Client` and associated connection pool, if provided + /// - A `git2::Repository` instance from the index repo checkout (that server.rs ensures exists) pub fn new(config: &Config, http_client: Option) -> App { - let mut github = oauth2::Config::new( - &config.gh_client_id, - &config.gh_client_secret, - "https://github.com/login/oauth/authorize", - "https://github.com/login/oauth/access_token", - ); - github.scopes.push(String::from("read:org")); + use oauth2::prelude::*; + use oauth2::{AuthUrl, ClientId, ClientSecret, Scope, TokenUrl}; + use url::Url; + + let github = BasicClient::new( + ClientId::new(config.gh_client_id.clone()), + Some(ClientSecret::new(config.gh_client_secret.clone())), + AuthUrl::new(Url::parse("https://github.com/login/oauth/authorize").unwrap()), + Some(TokenUrl::new( + Url::parse("https://github.com/login/oauth/access_token").unwrap(), + )), + ) + .add_scope(Scope::new("read:org".to_string())); let db_pool_size = match (dotenv::var("DB_POOL_SIZE"), config.env) { (Ok(num), _) => num.parse().expect("couldn't parse DB_POOL_SIZE"), diff --git a/src/bin/enqueue-job.rs b/src/bin/enqueue-job.rs index 5a3494acdf0..290219421a8 100644 --- a/src/bin/enqueue-job.rs +++ b/src/bin/enqueue-job.rs @@ -1,17 +1,29 @@ -use cargo_registry::util::{CargoError, CargoResult}; -use cargo_registry::{db, tasks}; -use std::env::args; -use swirl::Job; +use cargo_registry::util::{human, CargoError, CargoResult}; +use cargo_registry::{db, env, tasks}; +use diesel::PgConnection; fn main() -> CargoResult<()> { let conn = db::connect_now()?; + let mut args = std::env::args().skip(1); + match &*args.next().unwrap_or_default() { + "update_downloads" => tasks::update_downloads().enqueue(&conn), + "dump_db" => { + let database_url = args.next().unwrap_or_else(|| env("DATABASE_URL")); + let target_name = args + .next() + .unwrap_or_else(|| String::from("db-dump.tar.gz")); + tasks::dump_db(database_url, target_name).enqueue(&conn) + } + other => Err(human(&format!("Unrecognized job type `{}`", other))), + } +} - match &*args().nth(1).unwrap_or_default() { - "update_downloads" => tasks::update_downloads() - .enqueue(&conn) - .map_err(|e| CargoError::from_std_error(e))?, - other => panic!("Unrecognized job type `{}`", other), - }; - - Ok(()) +/// Helper to map the `PerformError` returned by `swirl::Job::enqueue()` to a +/// `CargoError`. Can be removed once `map_err()` isn't needed any more. +trait Enqueue: swirl::Job { + fn enqueue(self, conn: &PgConnection) -> CargoResult<()> { + ::enqueue(self, conn).map_err(|e| CargoError::from_std_error(e)) + } } + +impl Enqueue for J {} diff --git a/src/controllers.rs b/src/controllers.rs index a8f947f1282..dc80fcf803d 100644 --- a/src/controllers.rs +++ b/src/controllers.rs @@ -34,7 +34,7 @@ mod prelude { fn query(&self) -> IndexMap { url::form_urlencoded::parse(self.query_string().unwrap_or("").as_bytes()) - .map(|(a, b)| (a.into_owned(), b.into_owned())) + .into_owned() .collect() } diff --git a/src/controllers/krate/search.rs b/src/controllers/krate/search.rs index 552cb7d6efe..d2c100e451b 100644 --- a/src/controllers/krate/search.rs +++ b/src/controllers/krate/search.rs @@ -37,10 +37,7 @@ pub fn search(req: &mut dyn Request) -> CargoResult { let conn = req.db_conn()?; let params = req.query(); - let sort = params - .get("sort") - .map(|s| &**s) - .unwrap_or("recent-downloads"); + let sort = params.get("sort").map(|s| &**s); let include_yanked = params .get("include_yanked") .map(|s| s == "yes") @@ -156,11 +153,11 @@ pub fn search(req: &mut dyn Request) -> CargoResult { )); } - if sort == "downloads" { + if sort == Some("downloads") { query = query.then_order_by(crates::downloads.desc()) - } else if sort == "recent-downloads" { + } else if sort == Some("recent-downloads") { query = query.then_order_by(recent_crate_downloads::downloads.desc().nulls_last()) - } else if sort == "recent-updates" { + } else if sort == Some("recent-updates") { query = query.order(crates::updated_at.desc()); } else { query = query.then_order_by(crates::name.asc()) diff --git a/src/controllers/user/session.rs b/src/controllers/user/session.rs index 0f0760d8113..fdbdd5f099d 100644 --- a/src/controllers/user/session.rs +++ b/src/controllers/user/session.rs @@ -2,8 +2,7 @@ use crate::controllers::prelude::*; use crate::github; use conduit_cookie::RequestSession; -use rand::distributions::Alphanumeric; -use rand::{thread_rng, Rng}; +use oauth2::{prelude::*, AuthorizationCode, TokenResponse}; use crate::models::{NewUser, User}; use crate::schema::users; @@ -25,17 +24,14 @@ use crate::util::errors::{CargoError, ReadOnlyMode}; /// } /// ``` pub fn github_authorize(req: &mut dyn Request) -> CargoResult { - // Generate a random 16 char ASCII string - let mut rng = thread_rng(); - let state: String = std::iter::repeat(()) - .map(|()| rng.sample(Alphanumeric)) - .take(16) - .collect(); + let (url, state) = req + .app() + .github + .authorize_url(oauth2::CsrfToken::new_random); + let state = state.secret().to_string(); req.session() .insert("github_oauth_state".to_string(), state.clone()); - let url = req.app().github.authorize_url(state.clone()); - #[derive(Serialize)] struct R { url: String, @@ -92,11 +88,16 @@ pub fn github_access_token(req: &mut dyn Request) -> CargoResult { } // Fetch the access token from github using the code we just got - let token = req.app().github.exchange(code).map_err(|s| human(&s))?; - - let ghuser = github::github::(req.app(), "/user", &token)?; - let user = ghuser.save_to_database(&token.access_token, &*req.db_conn()?)?; + let code = AuthorizationCode::new(code); + let token = req + .app() + .github + .exchange_code(code) + .map_err(|s| human(&s))?; + let token = token.access_token(); + let ghuser = github::github_api::(req.app(), "/user", token)?; + let user = ghuser.save_to_database(&token.secret(), &*req.db_conn()?)?; req.session() .insert("user_id".to_string(), user.id.to_string()); req.mut_extensions().insert(user); diff --git a/src/github.rs b/src/github.rs index f5b1a877407..428ee60fa1e 100644 --- a/src/github.rs +++ b/src/github.rs @@ -1,6 +1,6 @@ //! This module implements functionality for interacting with GitHub. -use oauth2::*; +use oauth2::{prelude::*, AccessToken}; use reqwest::{self, header}; use serde::de::DeserializeOwned; @@ -13,7 +13,7 @@ use crate::util::{errors::NotFound, human, internal, CargoError, CargoResult}; /// Does all the nonsense for sending a GET to Github. Doesn't handle parsing /// because custom error-code handling may be desirable. Use /// `parse_github_response` to handle the "common" processing of responses. -pub fn github(app: &App, url: &str, auth: &Token) -> CargoResult +pub fn github_api(app: &App, url: &str, auth: &AccessToken) -> CargoResult where T: DeserializeOwned, { @@ -23,10 +23,7 @@ where app.http_client() .get(&url) .header(header::ACCEPT, "application/vnd.github.v3+json") - .header( - header::AUTHORIZATION, - format!("token {}", auth.access_token), - ) + .header(header::AUTHORIZATION, format!("token {}", auth.secret())) .send()? .error_for_status() .map_err(|e| handle_error_response(&e))? @@ -55,16 +52,6 @@ fn handle_error_response(error: &reqwest::Error) -> Box { } } -/// Gets a token with the given string as the access token, but all -/// other info null'd out. Generally, just to be fed to the `github` fn. -pub fn token(token: String) -> Token { - Token { - access_token: token, - scopes: Vec::new(), - token_type: String::new(), - } -} - pub fn team_url(login: &str) -> String { let mut login_pieces = login.split(':'); login_pieces.next(); diff --git a/src/middleware/current_user.rs b/src/middleware/current_user.rs index 656d6e843dd..ad760c88857 100644 --- a/src/middleware/current_user.rs +++ b/src/middleware/current_user.rs @@ -12,10 +12,10 @@ use crate::schema::users; #[derive(Debug, Clone, Copy)] pub struct CurrentUser; -#[derive(Debug, Copy, Clone, Eq, PartialEq)] +#[derive(Debug, Clone, Eq, PartialEq)] pub enum AuthenticationSource { SessionCookie, - ApiToken, + ApiToken { auth_header: String }, } impl Middleware for CurrentUser { @@ -42,18 +42,23 @@ impl Middleware for CurrentUser { } else { // Otherwise, look for an `Authorization` header on the request // and try to find a user in the database with a matching API token - let user = if let Some(headers) = req.headers().find("Authorization") { - User::find_by_api_token(&conn, headers[0]) + let user_auth = if let Some(headers) = req.headers().find("Authorization") { + let auth_header = headers[0].to_string(); + + User::find_by_api_token(&conn, &auth_header) + .map(|user| (AuthenticationSource::ApiToken { auth_header }, user)) .optional() .map_err(|e| Box::new(e) as Box)? } else { None }; + drop(conn); - if let Some(user) = user { - // Attach the `User` model from the database to the request + + if let Some((api_token, user)) = user_auth { + // Attach the `User` model from the database and the API token to the request req.mut_extensions().insert(user); - req.mut_extensions().insert(AuthenticationSource::ApiToken); + req.mut_extensions().insert(api_token); } } diff --git a/src/models.rs b/src/models.rs index 9968177d294..806d7c91dc9 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,3 +1,4 @@ +pub use self::action::{VersionAction, VersionOwnerAction}; pub use self::badge::{Badge, CrateBadge, MaintenanceStatus}; pub use self::category::{Category, CrateCategory, NewCategory}; pub use self::crate_owner_invitation::{CrateOwnerInvitation, NewCrateOwnerInvitation}; @@ -16,6 +17,7 @@ pub use self::version::{NewVersion, Version}; pub mod helpers; +mod action; mod badge; pub mod category; mod crate_owner_invitation; diff --git a/src/models/action.rs b/src/models/action.rs new file mode 100644 index 00000000000..474bc252ab8 --- /dev/null +++ b/src/models/action.rs @@ -0,0 +1,26 @@ +use chrono::NaiveDateTime; + +use crate::models::{ApiToken, User, Version}; +use crate::schema::*; + +#[derive(Debug, Clone, Copy)] +#[repr(u32)] +pub enum VersionAction { + Publish = 0, + Yank = 1, + Unyank = 2, +} + +#[derive(Debug, Clone, Copy, Queryable, Identifiable, Associations)] +#[belongs_to(Version)] +#[belongs_to(User, foreign_key = "owner_id")] +#[belongs_to(ApiToken, foreign_key = "owner_token_id")] +#[table_name = "version_owner_actions"] +pub struct VersionOwnerAction { + pub id: i32, + pub version_id: i32, + pub owner_id: i32, + pub owner_token_id: i32, + pub action: VersionAction, + pub time: NaiveDateTime, +} diff --git a/src/models/team.rs b/src/models/team.rs index dd3162cb4e0..831b3a93390 100644 --- a/src/models/team.rs +++ b/src/models/team.rs @@ -1,9 +1,11 @@ use diesel::prelude::*; use crate::app::App; -use crate::github; +use crate::github::{github_api, team_url}; use crate::util::{errors::NotFound, human, CargoResult}; +use oauth2::{prelude::*, AccessToken}; + use crate::models::{Crate, CrateOwner, Owner, OwnerKind, User}; use crate::schema::{crate_owners, teams}; use crate::views::EncodableTeam; @@ -141,8 +143,8 @@ impl Team { // FIXME: we just set per_page=100 and don't bother chasing pagination // links. A hundred teams should be enough for any org, right? let url = format!("/orgs/{}/teams?per_page=100", org_name); - let token = github::token(req_user.gh_access_token.clone()); - let teams = github::github::>(app, &url, &token)?; + let token = AccessToken::new(req_user.gh_access_token.clone()); + let teams = github_api::>(app, &url, &token)?; let team = teams .into_iter() @@ -164,7 +166,7 @@ impl Team { } let url = format!("/orgs/{}", org_name); - let org = github::github::(app, &url, &token)?; + let org = github_api::(app, &url, &token)?; NewTeam::new(&login.to_lowercase(), team.id, team.name, org.avatar_url) .create_or_update(conn) @@ -200,7 +202,7 @@ impl Team { avatar, .. } = self; - let url = github::team_url(&login); + let url = team_url(&login); EncodableTeam { id, @@ -222,8 +224,8 @@ fn team_with_gh_id_contains_user(app: &App, github_id: i32, user: &User) -> Carg } let url = format!("/teams/{}/memberships/{}", &github_id, &user.gh_login); - let token = github::token(user.gh_access_token.clone()); - let membership = match github::github::(app, &url, &token) { + let token = AccessToken::new(user.gh_access_token.clone()); + let membership = match github_api::(app, &url, &token) { // Officially how `false` is returned Err(ref e) if e.is::() => return Ok(false), x => x?, diff --git a/src/render.rs b/src/render.rs index e0ffb569a24..dfa98b51180 100644 --- a/src/render.rs +++ b/src/render.rs @@ -67,6 +67,8 @@ impl<'a> MarkdownRenderer<'a> { ("a", hashset(&["href", "id", "target"])), ("img", hashset(&["width", "height", "src", "alt", "align"])), ("input", hashset(&["checked", "disabled", "type"])), + ("th", hashset(&["rowspan", "colspan"])), + ("td", hashset(&["rowspan", "colspan"])), ]); let allowed_classes = hashmap(&[( "code", @@ -455,4 +457,14 @@ mod tests { "

    My crate

    \n

    Hello, world!

    \n" ); } + + #[test] + fn tables_with_rowspan_and_colspan() { + let text = "
    Target
    \n"; + let result = markdown_to_html(text, None); + assert_eq!( + result, + "
    Target
    \n" + ); + } } diff --git a/src/schema.patch b/src/schema.patch index 212cfe21933..19d60a0ec6d 100644 --- a/src/schema.patch +++ b/src/schema.patch @@ -56,9 +56,9 @@ index df884e4..18e08cd 100644 /// Representation of the `reserved_crate_names` table. /// @@ -881,23 +901,25 @@ table! { - } joinable!(api_tokens -> users (user_id)); + joinable!(badges -> crates (crate_id)); joinable!(crate_owner_invitations -> crates (crate_id)); joinable!(crate_owners -> crates (crate_id)); -joinable!(crate_owners -> users (created_by)); @@ -80,7 +80,7 @@ index df884e4..18e08cd 100644 joinable!(version_authors -> users (user_id)); joinable!(version_authors -> versions (version_id)); joinable!(version_downloads -> versions (version_id)); - joinable!(versions -> crates (crate_id)); + joinable!(version_owner_actions -> api_tokens (owner_token_id)); @@ -913,13 +935,14 @@ allow_tables_to_appear_in_same_query!( emails, diff --git a/src/schema.rs b/src/schema.rs index 6e4acf19662..6b692eeada9 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -860,6 +860,53 @@ table! { } } +table! { + use diesel::sql_types::*; + use diesel_full_text_search::{TsVector as Tsvector}; + + /// Representation of the `version_owner_actions` table. + /// + /// (Automatically generated by Diesel.) + version_owner_actions (id) { + /// The `id` column of the `version_owner_actions` table. + /// + /// Its SQL type is `Int4`. + /// + /// (Automatically generated by Diesel.) + id -> Int4, + /// The `version_id` column of the `version_owner_actions` table. + /// + /// Its SQL type is `Nullable`. + /// + /// (Automatically generated by Diesel.) + version_id -> Nullable, + /// The `owner_id` column of the `version_owner_actions` table. + /// + /// Its SQL type is `Nullable`. + /// + /// (Automatically generated by Diesel.) + owner_id -> Nullable, + /// The `owner_token_id` column of the `version_owner_actions` table. + /// + /// Its SQL type is `Nullable`. + /// + /// (Automatically generated by Diesel.) + owner_token_id -> Nullable, + /// The `action` column of the `version_owner_actions` table. + /// + /// Its SQL type is `Int4`. + /// + /// (Automatically generated by Diesel.) + action -> Int4, + /// The `time` column of the `version_owner_actions` table. + /// + /// Its SQL type is `Timestamp`. + /// + /// (Automatically generated by Diesel.) + time -> Timestamp, + } +} + table! { use diesel::sql_types::*; use diesel_full_text_search::{TsVector as Tsvector}; @@ -961,6 +1008,7 @@ table! { } joinable!(api_tokens -> users (user_id)); +joinable!(badges -> crates (crate_id)); joinable!(crate_owner_invitations -> crates (crate_id)); joinable!(crate_owners -> crates (crate_id)); joinable!(crate_owners -> teams (owner_id)); @@ -981,6 +1029,9 @@ joinable!(recent_crate_downloads -> crates (crate_id)); joinable!(version_authors -> users (user_id)); joinable!(version_authors -> versions (version_id)); joinable!(version_downloads -> versions (version_id)); +joinable!(version_owner_actions -> api_tokens (owner_token_id)); +joinable!(version_owner_actions -> users (owner_id)); +joinable!(version_owner_actions -> versions (version_id)); joinable!(versions -> crates (crate_id)); joinable!(versions -> users (published_by)); joinable!(versions_published_by -> versions (version_id)); @@ -1009,6 +1060,7 @@ allow_tables_to_appear_in_same_query!( users, version_authors, version_downloads, + version_owner_actions, versions, versions_published_by, ); diff --git a/src/tasks.rs b/src/tasks.rs index 930f83bfc11..ed9e0e91449 100644 --- a/src/tasks.rs +++ b/src/tasks.rs @@ -1,3 +1,5 @@ +pub mod dump_db; mod update_downloads; +pub use dump_db::dump_db; pub use update_downloads::update_downloads; diff --git a/src/tasks/dump_db.rs b/src/tasks/dump_db.rs new file mode 100644 index 00000000000..b6c36a3a966 --- /dev/null +++ b/src/tasks/dump_db.rs @@ -0,0 +1,172 @@ +use std::{ + fs::File, + path::{Path, PathBuf}, +}; + +use crate::{background_jobs::Environment, uploaders::Uploader, util::errors::std_error_no_send}; + +use swirl::PerformError; + +/// Create CSV dumps of the public information in the database, wrap them in a +/// tarball and upload to S3. +#[swirl::background_job] +pub fn dump_db( + env: &Environment, + database_url: String, + target_name: String, +) -> Result<(), PerformError> { + let directory = DumpDirectory::create()?; + directory.populate(&database_url)?; + let tarball = DumpTarball::create(&directory.export_dir)?; + tarball.upload(&target_name, &env.uploader)?; + println!("Database dump uploaded to {}.", &target_name); + Ok(()) +} + +/// Manage the export directory. +/// +/// Create the directory, populate it with the psql scripts and CSV dumps, and +/// make sure it gets deleted again even in the case of an error. +#[derive(Debug)] +pub struct DumpDirectory { + pub timestamp: chrono::DateTime, + pub export_dir: PathBuf, +} + +impl DumpDirectory { + pub fn create() -> Result { + let timestamp = chrono::Utc::now(); + let timestamp_str = timestamp.format("%Y-%m-%d-%H%M%S").to_string(); + let export_dir = std::env::temp_dir().join("dump-db").join(timestamp_str); + std::fs::create_dir_all(&export_dir)?; + Ok(Self { + timestamp, + export_dir, + }) + } + + pub fn populate(&self, database_url: &str) -> Result<(), PerformError> { + self.add_readme()?; + self.add_metadata()?; + self.dump_schema(database_url)?; + self.dump_db(database_url) + } + + fn add_readme(&self) -> Result<(), PerformError> { + use std::io::Write; + + let mut readme = File::create(self.export_dir.join("README.md"))?; + readme.write_all(include_bytes!("dump_db/readme_for_tarball.md"))?; + Ok(()) + } + + fn add_metadata(&self) -> Result<(), PerformError> { + #[derive(Serialize)] + struct Metadata<'a> { + timestamp: &'a chrono::DateTime, + crates_io_commit: String, + } + let metadata = Metadata { + timestamp: &self.timestamp, + crates_io_commit: dotenv::var("HEROKU_SLUG_COMMIT") + .unwrap_or_else(|_| "unknown".to_owned()), + }; + let file = File::create(self.export_dir.join("metadata.json"))?; + serde_json::to_writer_pretty(file, &metadata)?; + Ok(()) + } + + pub fn dump_schema(&self, database_url: &str) -> Result<(), PerformError> { + let schema_sql = File::create(self.export_dir.join("schema.sql"))?; + let status = std::process::Command::new("pg_dump") + .arg("--schema-only") + .arg("--no-owner") + .arg("--no-acl") + .arg(database_url) + .stdout(schema_sql) + .spawn()? + .wait()?; + if !status.success() { + return Err("pg_dump did not finish successfully.".into()); + } + Ok(()) + } + + pub fn dump_db(&self, database_url: &str) -> Result<(), PerformError> { + let export_script = self.export_dir.join("export.sql"); + let import_script = self.export_dir.join("import.sql"); + gen_scripts::gen_scripts(&export_script, &import_script)?; + std::fs::create_dir(self.export_dir.join("data"))?; + run_psql(&export_script, database_url) + } +} + +impl Drop for DumpDirectory { + fn drop(&mut self) { + std::fs::remove_dir_all(&self.export_dir).unwrap(); + } +} + +pub fn run_psql(script: &Path, database_url: &str) -> Result<(), PerformError> { + let psql_script = File::open(&script)?; + let psql = std::process::Command::new("psql") + .arg(database_url) + .current_dir(script.parent().unwrap()) + .stdin(psql_script) + .stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::piped()) + .spawn()?; + let output = psql.wait_with_output()?; + let stderr = String::from_utf8_lossy(&output.stderr); + if stderr.contains("ERROR") { + return Err(format!("Error while executing psql: {}", stderr).into()); + } + if !output.status.success() { + return Err("psql did not finish successfully.".into()); + } + Ok(()) +} + +/// Manage the tarball of the database dump. +/// +/// Create the tarball, upload it to S3, and make sure it gets deleted. +struct DumpTarball { + tarball_path: PathBuf, +} + +impl DumpTarball { + fn create(export_dir: &Path) -> Result { + let tarball_path = export_dir.with_extension("tar.gz"); + let tarfile = File::create(&tarball_path)?; + let result = Self { tarball_path }; + let encoder = flate2::write::GzEncoder::new(tarfile, flate2::Compression::default()); + let mut archive = tar::Builder::new(encoder); + archive.append_dir_all(export_dir.file_name().unwrap(), &export_dir)?; + Ok(result) + } + + fn upload(&self, target_name: &str, uploader: &Uploader) -> Result<(), PerformError> { + let client = reqwest::Client::new(); + let tarfile = File::open(&self.tarball_path)?; + let content_length = tarfile.metadata()?.len(); + // TODO Figure out the correct content type. + uploader + .upload( + &client, + target_name, + tarfile, + content_length, + "application/gzip", + ) + .map_err(std_error_no_send)?; + Ok(()) + } +} + +impl Drop for DumpTarball { + fn drop(&mut self) { + std::fs::remove_file(&self.tarball_path).unwrap(); + } +} + +mod gen_scripts; diff --git a/src/tasks/dump_db/dump-db.toml b/src/tasks/dump_db/dump-db.toml new file mode 100644 index 00000000000..12302c891ba --- /dev/null +++ b/src/tasks/dump_db/dump-db.toml @@ -0,0 +1,219 @@ +# This file configures what to include in public database dumps. For each +# database table, we set which columns are included in the dump, and optionally +# how to filter the rows. +# +# .columns - a TOML dictionary determining what columns to include. +# possible values are "private" (not included) and "public" (included). +# +# .filter - a string that is a valid SQL expression, which is used +# in a WHERE clause to filter the rows of the table. +# +# .dependencies - an array of table names, used to determine the +# order of the tables in the generated import script. All tables referred +# to by public columns in the current table should be listed, to make sure +# they are imported before this table. +# +# .columns_defaults - a TOML dictionary mapping column names to a +# raw SQL expression that is used as the default value for the column on +# import. This is useful for private columns that are not nullable and do +# not have a default. + +[api_tokens.columns] +id = "private" +user_id = "private" +token = "private" +name = "private" +created_at = "private" +last_used_at = "private" +revoked = "private" + +[background_jobs.columns] +id = "private" +job_type = "private" +data = "private" +retries = "private" +last_retry = "private" +created_at = "private" + +[badges] +dependencies = ["crates"] +[badges.columns] +crate_id = "public" +badge_type = "public" +attributes = "public" + +[categories.columns] +id = "public" +category = "public" +slug = "public" +description = "public" +crates_cnt = "public" +created_at = "public" +path = "public" + +[crate_owner_invitations.columns] +invited_user_id = "private" +invited_by_user_id = "private" +crate_id = "private" +created_at = "private" + +[crate_owners] +dependencies = ["crates", "users"] +filter = "NOT deleted" +[crate_owners.columns] +crate_id = "public" +owner_id = "public" +created_at = "public" +created_by = "private" +deleted = "private" +updated_at = "public" +owner_kind = "public" + +[crates.columns] +id = "public" +name = "public" +updated_at = "public" +created_at = "public" +downloads = "public" +description = "public" +homepage = "public" +documentation = "public" +readme = "public" +textsearchable_index_col = "public" +repository = "public" +max_upload_size = "public" + +[crates_categories] +dependencies = ["categories", "crates"] +[crates_categories.columns] +crate_id = "public" +category_id = "public" + +[crates_keywords] +dependencies = ["crates", "keywords"] +[crates_keywords.columns] +crate_id = "public" +keyword_id = "public" + +[dependencies] +dependencies = ["crates", "versions"] +[dependencies.columns] +id = "public" +version_id = "public" +crate_id = "public" +req = "public" +optional = "public" +default_features = "public" +features = "public" +target = "public" +kind = "public" + +[__diesel_schema_migrations.columns] +version = "private" +run_on = "private" + +[emails.columns] +id = "private" +user_id = "private" +email = "private" +verified = "private" +token = "private" +token_generated_at = "private" + +[follows.columns] +user_id = "private" +crate_id = "private" + +[keywords.columns] +id = "public" +keyword = "public" +crates_cnt = "public" +created_at = "public" + +[metadata.columns] +total_downloads = "public" + +[publish_limit_buckets.columns] +user_id = "private" +tokens = "private" +last_refill = "private" + +[publish_rate_overrides.columns] +user_id = "private" +burst = "private" + +[readme_renderings.columns] +version_id = "private" +rendered_at = "private" + +[reserved_crate_names.columns] +name = "public" + +[teams.columns] +id = "public" +login = "public" +github_id = "public" +name = "public" +avatar = "public" + +[users] +filter = """ +id in ( + SELECT owner_id AS user_id FROM crate_owners WHERE NOT deleted AND owner_kind = 0 + UNION + SELECT published_by as user_id FROM versions +)""" +[users.columns] +id = "public" +email = "private" +gh_access_token = "private" +gh_login = "public" +name = "public" +gh_avatar = "public" +gh_id = "public" +[users.column_defaults] +gh_access_token = "''" + +[version_authors] +dependencies = ["versions"] +[version_authors.columns] +id = "public" +version_id = "public" +user_id = "private" +name = "public" + +[version_downloads] +dependencies = ["versions"] +[version_downloads.columns] +version_id = "public" +downloads = "public" +counted = "private" +date = "public" +processed = "private" + +[version_owner_actions.columns] +id = "private" +version_id = "private" +owner_id = "private" +owner_token_id = "private" +action = "private" +time = "private" + +[versions] +dependencies = ["crates", "users"] +[versions.columns] +id = "public" +crate_id = "public" +num = "public" +updated_at = "public" +created_at = "public" +downloads = "public" +features = "public" +yanked = "public" +license = "public" +crate_size = "public" +published_by = "public" + +[versions_published_by.columns] +version_id = "private" +email = "private" diff --git a/src/tasks/dump_db/dump-export.sql.hbs b/src/tasks/dump_db/dump-export.sql.hbs new file mode 100644 index 00000000000..0fcf38cba4d --- /dev/null +++ b/src/tasks/dump_db/dump-export.sql.hbs @@ -0,0 +1,21 @@ +BEGIN; +{{~#each tables}} +{{~#if this.filter}} + CREATE TEMPORARY VIEW "dump_db_{{this.name}}" AS ( + SELECT {{this.columns}} + FROM "{{this.name}}" + WHERE {{this.filter}} + ); +{{~/if}} +{{~/each}} +COMMIT; + +BEGIN ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE; +{{~#each tables}} +{{~#if this.filter}} + \copy (SELECT * FROM "dump_db_{{this.name}}") TO 'data/{{this.name}}.csv' WITH CSV HEADER +{{~else}} + \copy "{{this.name}}" ({{this.columns}}) TO 'data/{{this.name}}.csv' WITH CSV HEADER +{{~/if}} +{{~/each}} +COMMIT; diff --git a/src/tasks/dump_db/dump-import.sql.hbs b/src/tasks/dump_db/dump-import.sql.hbs new file mode 100644 index 00000000000..49508e7e35a --- /dev/null +++ b/src/tasks/dump_db/dump-import.sql.hbs @@ -0,0 +1,25 @@ +BEGIN; + -- Set defaults for non-nullable columns not included in the dump. +{{~#each tables as |table|}} +{{~#each column_defaults}} + ALTER TABLE "{{table.name}}" ALTER COLUMN "{{@key}}" SET DEFAULT {{this}}; +{{~/each}} +{{~/each}} + + -- Truncate all tables. +{{~#each tables}} + TRUNCATE "{{this.name}}" RESTART IDENTITY CASCADE; +{{~/each}} + + -- Import the CSV data. +{{~#each tables}} + \copy "{{this.name}}" ({{this.columns}}) FROM 'data/{{this.name}}.csv' WITH CSV HEADER +{{~/each}} + + -- Drop the defaults again. +{{~#each tables as |table|}} +{{~#each column_defaults}} + ALTER TABLE "{{table.name}}" ALTER COLUMN "{{@key}}" DROP DEFAULT; +{{~/each}} +{{~/each}} +COMMIT; diff --git a/src/tasks/dump_db/gen_scripts.rs b/src/tasks/dump_db/gen_scripts.rs new file mode 100644 index 00000000000..e128a0165cd --- /dev/null +++ b/src/tasks/dump_db/gen_scripts.rs @@ -0,0 +1,265 @@ +use std::{ + collections::{BTreeMap, VecDeque}, + fs::File, + path::Path, +}; + +use swirl::PerformError; + +pub fn gen_scripts(export_script: &Path, import_script: &Path) -> Result<(), PerformError> { + let config: VisibilityConfig = toml::from_str(include_str!("dump-db.toml")).unwrap(); + let export_sql = File::create(export_script)?; + let import_sql = File::create(import_script)?; + config.gen_psql_scripts(export_sql, import_sql) +} + +/// An enum indicating whether a column is included in the database dumps. +/// Public columns are included, private are not. +#[derive(Clone, Copy, Debug, Deserialize, PartialEq)] +#[serde(rename_all = "lowercase")] +enum ColumnVisibility { + Private, + Public, +} + +/// Filtering information for a single table. The `dependencies` field is only +/// used to determine the order of the tables in the generated import script, +/// and should list all tables the current tables refers to with foreign key +/// constraints on public columns. The `filter` field is a valid SQL expression +/// used in a `WHERE` clause to filter the rows of the table. The `columns` +/// field maps column names to their respective visibilities. +#[derive(Clone, Debug, Default, Deserialize)] +struct TableConfig { + #[serde(default)] + dependencies: Vec, + filter: Option, + columns: BTreeMap, + #[serde(default)] + column_defaults: BTreeMap, +} + +/// Subset of the configuration data to be passed on to the Handlbars template. +#[derive(Debug, Serialize)] +struct HandlebarsTableContext<'a> { + name: &'a str, + filter: Option<&'a str>, + columns: String, + column_defaults: BTreeMap<&'a str, &'a str>, +} + +impl TableConfig { + fn handlebars_context<'a>(&'a self, name: &'a str) -> Option> { + let columns = self + .columns + .iter() + .filter(|&(_, &vis)| vis == ColumnVisibility::Public) + .map(|(col, _)| format!("\"{}\"", col)) + .collect::>() + .join(", "); + if columns.is_empty() { + None + } else { + let filter = self.filter.as_ref().map(String::as_str); + let column_defaults = self + .column_defaults + .iter() + .map(|(k, v)| (k.as_str(), v.as_str())) + .collect(); + Some(HandlebarsTableContext { + name, + filter, + columns, + column_defaults, + }) + } + } +} + +/// Maps table names to the respective configurations. Used to load `dump_db.toml`. +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(transparent)] +struct VisibilityConfig(BTreeMap); + +/// Subset of the configuration data to be passed on to the Handlbars template. +#[derive(Debug, Serialize)] +struct HandlebarsContext<'a> { + tables: Vec>, +} + +impl VisibilityConfig { + /// Sort the tables in a way that dependencies come before dependent tables. + /// + /// Returns a vector of table names. + fn topological_sort(&self) -> Vec<&str> { + let mut result = Vec::new(); + let mut num_deps = BTreeMap::new(); + let mut rev_deps: BTreeMap<_, Vec<_>> = BTreeMap::new(); + for (table, config) in self.0.iter() { + num_deps.insert(table.as_str(), config.dependencies.len()); + for dep in &config.dependencies { + rev_deps + .entry(dep.as_str()) + .or_default() + .push(table.as_str()); + } + } + let mut ready: VecDeque<&str> = num_deps + .iter() + .filter(|(_, &count)| count == 0) + .map(|(&table, _)| table) + .collect(); + while let Some(table) = ready.pop_front() { + result.push(table); + for dep in rev_deps.get(table).iter().cloned().flatten() { + *num_deps.get_mut(dep).unwrap() -= 1; + if num_deps[dep] == 0 { + ready.push_back(dep); + } + } + } + assert_eq!( + self.0.len(), + result.len(), + "circular dependencies in database dump configuration detected", + ); + result + } + + fn handlebars_context(&self) -> HandlebarsContext<'_> { + let tables = self + .topological_sort() + .into_iter() + .filter_map(|table| self.0[table].handlebars_context(table)) + .collect(); + HandlebarsContext { tables } + } + + fn gen_psql_scripts(&self, export_sql: W, import_sql: W) -> Result<(), PerformError> + where + W: std::io::Write, + { + let context = self.handlebars_context(); + let mut handlebars = handlebars::Handlebars::new(); + handlebars.register_escape_fn(handlebars::no_escape); + handlebars.render_template_to_write( + include_str!("dump-export.sql.hbs"), + &context, + export_sql, + )?; + handlebars.render_template_to_write( + include_str!("dump-import.sql.hbs"), + &context, + import_sql, + )?; + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::test_util::pg_connection; + use diesel::prelude::*; + use std::collections::HashSet; + use std::iter::FromIterator; + + /// Test whether the visibility configuration matches the schema of the + /// test database. + #[test] + fn check_visibility_config() { + let conn = pg_connection(); + let db_columns = HashSet::::from_iter(get_db_columns(&conn)); + let vis_columns = toml::from_str::(include_str!("dump-db.toml")) + .unwrap() + .0 + .iter() + .flat_map(|(table, config)| { + config.columns.iter().map(move |(column, _)| Column { + table_name: table.clone(), + column_name: column.clone(), + }) + }) + .collect(); + let mut errors = vec![]; + for Column { + table_name, + column_name, + } in db_columns.difference(&vis_columns) + { + errors.push(format!( + "No visibility information for columns {}.{}.", + table_name, column_name + )); + } + for Column { + table_name, + column_name, + } in vis_columns.difference(&db_columns) + { + errors.push(format!( + "Column {}.{} does not exist in the database.", + table_name, column_name + )); + } + assert!( + errors.is_empty(), + "The visibility configuration does not match the database schema:\n{}", + errors.join("\n"), + ); + } + + mod information_schema { + table! { + information_schema.columns (table_schema, table_name, column_name) { + table_schema -> Text, + table_name -> Text, + column_name -> Text, + ordinal_position -> Integer, + } + } + } + + #[derive(Debug, Eq, Hash, PartialEq, Queryable)] + struct Column { + table_name: String, + column_name: String, + } + + fn get_db_columns(conn: &PgConnection) -> Vec { + use information_schema::columns::dsl::*; + columns + .select((table_name, column_name)) + .filter(table_schema.eq("public")) + .order_by((table_name, ordinal_position)) + .load(conn) + .unwrap() + } + + fn table_config_with_deps(deps: &[&str]) -> TableConfig { + TableConfig { + dependencies: deps.iter().cloned().map(ToOwned::to_owned).collect(), + ..Default::default() + } + } + + #[test] + fn test_topological_sort() { + let mut config = VisibilityConfig::default(); + let tables = &mut config.0; + tables.insert("a".to_owned(), table_config_with_deps(&["b", "c"])); + tables.insert("b".to_owned(), table_config_with_deps(&["c", "d"])); + tables.insert("c".to_owned(), table_config_with_deps(&["d"])); + config.0.insert("d".to_owned(), table_config_with_deps(&[])); + assert_eq!(config.topological_sort(), ["d", "c", "b", "a"]); + } + + #[test] + #[should_panic] + fn topological_sort_panics_for_cyclic_dependency() { + let mut config = VisibilityConfig::default(); + let tables = &mut config.0; + tables.insert("a".to_owned(), table_config_with_deps(&["b"])); + tables.insert("b".to_owned(), table_config_with_deps(&["a"])); + config.topological_sort(); + } +} diff --git a/src/tasks/dump_db/readme_for_tarball.md b/src/tasks/dump_db/readme_for_tarball.md new file mode 100644 index 00000000000..3d9f431d311 --- /dev/null +++ b/src/tasks/dump_db/readme_for_tarball.md @@ -0,0 +1,30 @@ +# crates.io Database Dump + +This is a dump of the public information in the crates.io database. + +## Files + +* `data/` – the CSV files with the actual data. +* `export.sql` – the `psql` script that was used to create this database dump. It is only included in the archive for reference. +* `import.sql` – a `psql` script that can be used to restore the dump into a PostgreSQL database with the same schema as the `crates.io` database, destroying all current data. +* `metadata.json` – some metadata of this dump. +* `schema.sql` – a dump of the database schema to facilitate generating a new database from the data. + +## Metadata Fields + +* `timestamp` – the UTC time the dump was started. +* `crates_io_commit` – the git commit hash of the deployed version of crates.io that created this dump. + +## Restoring to a Local crates.io Database + +1. Create a new database. + + createdb DATABASE_NAME + +2. Restore the database schema. + + psql DATABASE_NAME < schema.sql + +3. Run the import script. + + psql DATABASE_URL < import.sql diff --git a/src/tests/all.rs b/src/tests/all.rs index 310cdf5db9c..af9108f48bd 100644 --- a/src/tests/all.rs +++ b/src/tests/all.rs @@ -52,6 +52,7 @@ mod badge; mod builders; mod categories; mod category; +mod dump_db; mod git; mod keyword; mod krate; diff --git a/src/tests/dump_db.rs b/src/tests/dump_db.rs new file mode 100644 index 00000000000..11187d6b16f --- /dev/null +++ b/src/tests/dump_db.rs @@ -0,0 +1,71 @@ +use cargo_registry::tasks::dump_db; +use diesel::{ + connection::{Connection, SimpleConnection}, + pg::PgConnection, +}; + +#[test] +fn dump_db_and_reimport_dump() { + let database_url = crate::env("TEST_DATABASE_URL"); + + // TODO prefill database with some data + + let directory = dump_db::DumpDirectory::create().unwrap(); + directory.populate(&database_url).unwrap(); + + let schema = TemporarySchema::create(database_url, "test_db_dump"); + schema.run_migrations(); + + let import_script = directory.export_dir.join("import.sql"); + dump_db::run_psql(&import_script, &schema.database_url).unwrap(); + + // TODO: Consistency checks on the re-imported data? +} + +struct TemporarySchema { + pub database_url: String, + pub schema_name: String, + pub connection: PgConnection, +} + +impl TemporarySchema { + pub fn create(database_url: String, schema_name: &str) -> Self { + let params = &[("options", format!("--search_path={},public", schema_name))]; + let database_url = url::Url::parse_with_params(&database_url, params) + .unwrap() + .into_string(); + let schema_name = schema_name.to_owned(); + let connection = PgConnection::establish(&database_url).unwrap(); + connection + .batch_execute(&format!( + r#"DROP SCHEMA IF EXISTS "{schema_name}" CASCADE; + CREATE SCHEMA "{schema_name}";"#, + schema_name = schema_name, + )) + .unwrap(); + Self { + database_url, + schema_name, + connection, + } + } + + pub fn run_migrations(&self) { + use diesel_migrations::{find_migrations_directory, run_pending_migrations_in_directory}; + let migrations_dir = find_migrations_directory().unwrap(); + run_pending_migrations_in_directory( + &self.connection, + &migrations_dir, + &mut std::io::sink(), + ) + .unwrap(); + } +} + +impl Drop for TemporarySchema { + fn drop(&mut self) { + self.connection + .batch_execute(&format!(r#"DROP SCHEMA "{}" CASCADE;"#, self.schema_name)) + .unwrap(); + } +} diff --git a/src/tests/krate.rs b/src/tests/krate.rs index 0a38a875525..accaa6579c2 100644 --- a/src/tests/krate.rs +++ b/src/tests/krate.rs @@ -1903,6 +1903,31 @@ fn reverse_dependencies_includes_published_by_user_when_present() { ); } +#[test] +fn reverse_dependencies_query_supports_u64_version_number_parts() { + let (app, anon, user) = TestApp::init().with_user(); + let user = user.as_model(); + + let large_but_valid_version_number = format!("1.0.{}", std::u64::MAX); + + app.db(|conn| { + let c1 = CrateBuilder::new("c1", user.id).expect_build(conn); + // The crate that depends on c1... + CrateBuilder::new("c2", user.id) + // ...has a patch version at the limits of what the semver crate supports + .version(VersionBuilder::new(&large_but_valid_version_number).dependency(&c1, None)) + .expect_build(conn); + }); + + let deps = anon.reverse_dependencies("c1"); + assert_eq!(deps.dependencies.len(), 1); + assert_eq!(deps.meta.total, 1); + assert_eq!(deps.dependencies[0].crate_id, "c1"); + assert_eq!(deps.versions.len(), 1); + assert_eq!(deps.versions[0].krate, "c2"); + assert_eq!(deps.versions[0].num, large_but_valid_version_number); +} + #[test] fn author_license_and_description_required() { let (_, _, _, token) = TestApp::init().with_token(); diff --git a/src/tests/load_foreign_key_constraints.sql b/src/tests/load_foreign_key_constraints.sql index a7f320b0447..c85919478fb 100644 --- a/src/tests/load_foreign_key_constraints.sql +++ b/src/tests/load_foreign_key_constraints.sql @@ -4,5 +4,8 @@ SELECT relname, conname, pg_get_constraintdef(pg_constraint.oid, true) AS defini FROM pg_attribute INNER JOIN pg_class ON pg_class.oid = attrelid LEFT JOIN pg_constraint ON pg_class.oid = conrelid AND ARRAY[attnum] = conkey + INNER JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace WHERE attname = $1 - AND contype = 'f' + AND relkind = 'r' + AND (contype IS NULL OR contype = 'f') + AND nspname = 'public'; diff --git a/tests/acceptance/crate-test.js b/tests/acceptance/crate-test.js index bdcd6b6388b..c1f53492cdd 100644 --- a/tests/acceptance/crate-test.js +++ b/tests/acceptance/crate-test.js @@ -259,7 +259,7 @@ module('Acceptance | crate page', function(hooks) { await click('#add-owner'); assert.dom('.error').exists(); - assert.dom('.error').hasText('Error sending invite'); + assert.dom('.error').hasText('Error sending invite: Not Found'); assert.dom('.owners .row').exists({ count: 2 }); });