diff options
52 files changed, 971 insertions, 391 deletions
diff --git a/app/assets/javascripts/awards_handler.js b/app/assets/javascripts/awards_handler.js index 70f20c5c7cf..e34db893989 100644 --- a/app/assets/javascripts/awards_handler.js +++ b/app/assets/javascripts/awards_handler.js @@ -33,19 +33,24 @@ const categoryLabelMap = { const IS_VISIBLE = 'is-visible'; const IS_RENDERED = 'is-rendered'; -class AwardsHandler { +export class AwardsHandler { constructor(emoji) { this.emoji = emoji; this.eventListeners = []; + this.toggleButtonSelector = '.js-add-award'; + this.menuClass = 'js-award-emoji-menu'; + } + + bindEvents() { // If the user shows intent let's pre-build the menu this.registerEventListener( 'one', $(document), 'mouseenter focus', - '.js-add-award', + this.toggleButtonSelector, 'mouseenter focus', () => { - const $menu = $('.emoji-menu'); + const $menu = $(`.${this.menuClass}`); if ($menu.length === 0) { requestAnimationFrame(() => { this.createEmojiMenu(); @@ -53,7 +58,7 @@ class AwardsHandler { } }, ); - this.registerEventListener('on', $(document), 'click', '.js-add-award', e => { + this.registerEventListener('on', $(document), 'click', this.toggleButtonSelector, e => { e.stopPropagation(); e.preventDefault(); this.showEmojiMenu($(e.currentTarget)); @@ -61,15 +66,17 @@ class AwardsHandler { this.registerEventListener('on', $('html'), 'click', e => { const $target = $(e.target); - if (!$target.closest('.emoji-menu').length) { + if (!$target.closest(`.${this.menuClass}`).length) { $('.js-awards-block.current').removeClass('current'); - if ($('.emoji-menu').is(':visible')) { - $('.js-add-award.is-active').removeClass('is-active'); - this.hideMenuElement($('.emoji-menu')); + if ($(`.${this.menuClass}`).is(':visible')) { + $(`${this.toggleButtonSelector}.is-active`).removeClass('is-active'); + this.hideMenuElement($(`.${this.menuClass}`)); } } }); - this.registerEventListener('on', $(document), 'click', '.js-emoji-btn', e => { + + const emojiButtonSelector = `.js-awards-block .js-emoji-btn, .${this.menuClass} .js-emoji-btn`; + this.registerEventListener('on', $(document), 'click', emojiButtonSelector, e => { e.preventDefault(); const $target = $(e.currentTarget); const $glEmojiElement = $target.find('gl-emoji'); @@ -101,7 +108,7 @@ class AwardsHandler { $addBtn.closest('.js-awards-block').addClass('current'); } - const $menu = $('.emoji-menu'); + const $menu = $(`.${this.menuClass}`); const $thumbsBtn = $menu.find('[data-name="thumbsup"], [data-name="thumbsdown"]').parent(); const $userAuthored = this.isUserAuthored($addBtn); if ($menu.length) { @@ -118,7 +125,7 @@ class AwardsHandler { } else { $addBtn.addClass('is-loading is-active'); this.createEmojiMenu(() => { - const $createdMenu = $('.emoji-menu'); + const $createdMenu = $(`.${this.menuClass}`); $addBtn.removeClass('is-loading'); this.positionMenu($createdMenu, $addBtn); return setTimeout(() => { @@ -156,7 +163,7 @@ class AwardsHandler { } const emojiMenuMarkup = ` - <div class="emoji-menu"> + <div class="emoji-menu ${this.menuClass}"> <input type="text" name="emoji-menu-search" value="" class="js-emoji-menu-search emoji-search search-input form-control" placeholder="Search emoji" /> <div class="emoji-menu-content"> @@ -185,7 +192,7 @@ class AwardsHandler { // Avoid the jank and render the remaining categories separately // This will take more time, but makes UI more responsive - const menu = document.querySelector('.emoji-menu'); + const menu = document.querySelector(`.${this.menuClass}`); const emojiContentElement = menu.querySelector('.emoji-menu-content'); const remainingCategories = Object.keys(categoryMap).slice(1); const allCategoriesAddedPromise = remainingCategories.reduce( @@ -270,9 +277,9 @@ class AwardsHandler { if (isInVueNoteablePage() && !isMainAwardsBlock) { const id = votesBlock.attr('id').replace('note_', ''); - this.hideMenuElement($('.emoji-menu')); + this.hideMenuElement($(`.${this.menuClass}`)); - $('.js-add-award.is-active').removeClass('is-active'); + $(`${this.toggleButtonSelector}.is-active`).removeClass('is-active'); const toggleAwardEvent = new CustomEvent('toggleAward', { detail: { awardName: emoji, @@ -291,9 +298,9 @@ class AwardsHandler { return typeof callback === 'function' ? callback() : undefined; }); - this.hideMenuElement($('.emoji-menu')); + this.hideMenuElement($(`.${this.menuClass}`)); - return $('.js-add-award.is-active').removeClass('is-active'); + return $(`${this.toggleButtonSelector}.is-active`).removeClass('is-active'); } addAwardToEmojiBar(votesBlock, emoji, checkForMutuality) { @@ -321,7 +328,7 @@ class AwardsHandler { getVotesBlock() { if (isInVueNoteablePage()) { - const $el = $('.js-add-award.is-active').closest('.note.timeline-entry'); + const $el = $(`${this.toggleButtonSelector}.is-active`).closest('.note.timeline-entry'); if ($el.length) { return $el; @@ -458,7 +465,7 @@ class AwardsHandler { } createEmoji(votesBlock, emoji) { - if ($('.emoji-menu').length) { + if ($(`.${this.menuClass}`).length) { this.createAwardButtonForVotesBlock(votesBlock, emoji); } this.createEmojiMenu(() => { @@ -538,7 +545,7 @@ class AwardsHandler { this.searchEmojis(term); }); - const $menu = $('.emoji-menu'); + const $menu = $(`.${this.menuClass}`); this.registerEventListener('on', $menu, transitionEndEventString, e => { if (e.target === e.currentTarget) { // Clear the search @@ -608,7 +615,7 @@ class AwardsHandler { this.eventListeners.forEach(entry => { entry.element.off.call(entry.element, ...entry.args); }); - $('.emoji-menu').remove(); + $(`.${this.menuClass}`).remove(); } } @@ -616,7 +623,11 @@ let awardsHandlerPromise = null; export default function loadAwardsHandler(reload = false) { if (!awardsHandlerPromise || reload) { awardsHandlerPromise = import(/* webpackChunkName: 'emoji' */ './emoji').then( - Emoji => new AwardsHandler(Emoji), + Emoji => { + const awardsHandler = new AwardsHandler(Emoji); + awardsHandler.bindEvents(); + return awardsHandler; + }, ); } return awardsHandlerPromise; diff --git a/app/assets/javascripts/commons/polyfills.js b/app/assets/javascripts/commons/polyfills.js index f595f3c3187..589eeee9695 100644 --- a/app/assets/javascripts/commons/polyfills.js +++ b/app/assets/javascripts/commons/polyfills.js @@ -19,3 +19,4 @@ import './polyfills/custom_event'; import './polyfills/element'; import './polyfills/event'; import './polyfills/nodelist'; +import './polyfills/request_idle_callback'; diff --git a/app/assets/javascripts/commons/polyfills/request_idle_callback.js b/app/assets/javascripts/commons/polyfills/request_idle_callback.js new file mode 100644 index 00000000000..2356569d06e --- /dev/null +++ b/app/assets/javascripts/commons/polyfills/request_idle_callback.js @@ -0,0 +1,17 @@ +window.requestIdleCallback = + window.requestIdleCallback || + function requestShim(cb) { + const start = Date.now(); + return setTimeout(() => { + cb({ + didTimeout: false, + timeRemaining: () => Math.max(0, 50 - (Date.now() - start)), + }); + }, 1); + }; + +window.cancelIdleCallback = + window.cancelIdleCallback || + function cancelShim(id) { + clearTimeout(id); + }; diff --git a/app/assets/javascripts/diffs/components/diff_line_gutter_content.vue b/app/assets/javascripts/diffs/components/diff_line_gutter_content.vue index a73f898e10b..8ad1ea34245 100644 --- a/app/assets/javascripts/diffs/components/diff_line_gutter_content.vue +++ b/app/assets/javascripts/diffs/components/diff_line_gutter_content.vue @@ -71,13 +71,23 @@ export default { required: false, default: false, }, + isHover: { + type: Boolean, + required: false, + default: false, + }, + discussions: { + type: Array, + required: false, + default: () => [], + }, }, computed: { ...mapState({ diffViewType: state => state.diffs.diffViewType, diffFiles: state => state.diffs.diffFiles, }), - ...mapGetters(['isLoggedIn', 'discussionsByLineCode']), + ...mapGetters(['isLoggedIn']), lineHref() { return this.lineCode ? `#${this.lineCode}` : '#'; }, @@ -85,26 +95,22 @@ export default { return ( this.isLoggedIn && this.showCommentButton && + this.isHover && !this.isMatchLine && !this.isContextLine && - !this.hasDiscussions && - !this.isMetaLine + !this.isMetaLine && + !this.hasDiscussions ); }, - discussions() { - return this.discussionsByLineCode[this.lineCode] || []; - }, hasDiscussions() { return this.discussions.length > 0; }, shouldShowAvatarsOnGutter() { - let render = this.hasDiscussions && this.showCommentButton; - if (!this.lineType && this.linePosition === LINE_POSITION_RIGHT) { - render = false; + return false; } - return render; + return this.showCommentButton && this.hasDiscussions; }, }, methods: { @@ -176,7 +182,7 @@ export default { v-else > <button - v-show="shouldShowCommentButton" + v-if="shouldShowCommentButton" type="button" class="add-diff-note js-add-diff-note-button" title="Add a comment to this line" diff --git a/app/assets/javascripts/diffs/components/diff_table_cell.vue b/app/assets/javascripts/diffs/components/diff_table_cell.vue index 5962f30d9bb..33bc8d9971e 100644 --- a/app/assets/javascripts/diffs/components/diff_table_cell.vue +++ b/app/assets/javascripts/diffs/components/diff_table_cell.vue @@ -67,6 +67,11 @@ export default { required: false, default: false, }, + discussions: { + type: Array, + required: false, + default: () => [], + }, }, computed: { ...mapGetters(['isLoggedIn']), @@ -132,10 +137,12 @@ export default { :line-number="lineNumber" :meta-data="normalizedLine.metaData" :show-comment-button="showCommentButton" + :is-hover="isHover" :is-bottom="isBottom" :is-match-line="isMatchLine" :is-context-line="isContentLine" :is-meta-line="isMetaLine" + :discussions="discussions" /> </td> </template> diff --git a/app/assets/javascripts/diffs/components/inline_diff_comment_row.vue b/app/assets/javascripts/diffs/components/inline_diff_comment_row.vue index ca265dd892c..caf84dc9573 100644 --- a/app/assets/javascripts/diffs/components/inline_diff_comment_row.vue +++ b/app/assets/javascripts/diffs/components/inline_diff_comment_row.vue @@ -1,5 +1,5 @@ <script> -import { mapState, mapGetters } from 'vuex'; +import { mapState } from 'vuex'; import diffDiscussions from './diff_discussions.vue'; import diffLineNoteForm from './diff_line_note_form.vue'; @@ -21,15 +21,16 @@ export default { type: Number, required: true, }, + discussions: { + type: Array, + required: false, + default: () => [], + }, }, computed: { ...mapState({ diffLineCommentForms: state => state.diffs.diffLineCommentForms, }), - ...mapGetters(['discussionsByLineCode']), - discussions() { - return this.discussionsByLineCode[this.line.lineCode] || []; - }, className() { return this.discussions.length ? '' : 'js-temp-notes-holder'; }, diff --git a/app/assets/javascripts/diffs/components/inline_diff_table_row.vue b/app/assets/javascripts/diffs/components/inline_diff_table_row.vue index 0e306f39a9f..32d65ff994f 100644 --- a/app/assets/javascripts/diffs/components/inline_diff_table_row.vue +++ b/app/assets/javascripts/diffs/components/inline_diff_table_row.vue @@ -33,6 +33,11 @@ export default { required: false, default: false, }, + discussions: { + type: Array, + required: false, + default: () => [], + }, }, data() { return { @@ -89,6 +94,7 @@ export default { :is-bottom="isBottom" :is-hover="isHover" :show-comment-button="true" + :discussions="discussions" class="diff-line-num old_line" /> <diff-table-cell @@ -98,6 +104,7 @@ export default { :line-type="newLineType" :is-bottom="isBottom" :is-hover="isHover" + :discussions="discussions" class="diff-line-num new_line" /> <td diff --git a/app/assets/javascripts/diffs/components/inline_diff_view.vue b/app/assets/javascripts/diffs/components/inline_diff_view.vue index 9fd19b74cd7..e7d789734c3 100644 --- a/app/assets/javascripts/diffs/components/inline_diff_view.vue +++ b/app/assets/javascripts/diffs/components/inline_diff_view.vue @@ -20,8 +20,11 @@ export default { }, }, computed: { - ...mapGetters('diffs', ['commitId']), - ...mapGetters(['discussionsByLineCode']), + ...mapGetters('diffs', [ + 'commitId', + 'shouldRenderInlineCommentRow', + 'singleDiscussionByLineCode', + ]), ...mapState({ diffLineCommentForms: state => state.diffs.diffLineCommentForms, }), @@ -36,15 +39,8 @@ export default { }, }, methods: { - shouldRenderCommentRow(line) { - if (this.diffLineCommentForms[line.lineCode]) return true; - - const lineDiscussions = this.discussionsByLineCode[line.lineCode]; - if (lineDiscussions === undefined) { - return false; - } - - return lineDiscussions.every(discussion => discussion.expanded); + discussionsList(line) { + return line.lineCode !== undefined ? this.singleDiscussionByLineCode(line.lineCode) : []; }, }, }; @@ -65,13 +61,15 @@ export default { :line="line" :is-bottom="index + 1 === diffLinesLength" :key="line.lineCode" + :discussions="discussionsList(line)" /> <inline-diff-comment-row - v-if="shouldRenderCommentRow(line)" + v-if="shouldRenderInlineCommentRow(line)" :diff-file-hash="diffFile.fileHash" :line="line" :line-index="index" :key="index" + :discussions="discussionsList(line)" /> </template> </tbody> diff --git a/app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue b/app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue index cc5248c25d9..48b8feeb0b4 100644 --- a/app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue +++ b/app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue @@ -1,5 +1,5 @@ <script> -import { mapState, mapGetters } from 'vuex'; +import { mapState } from 'vuex'; import diffDiscussions from './diff_discussions.vue'; import diffLineNoteForm from './diff_line_note_form.vue'; @@ -21,30 +21,34 @@ export default { type: Number, required: true, }, + leftDiscussions: { + type: Array, + required: false, + default: () => [], + }, + rightDiscussions: { + type: Array, + required: false, + default: () => [], + }, }, computed: { ...mapState({ diffLineCommentForms: state => state.diffs.diffLineCommentForms, }), - ...mapGetters(['discussionsByLineCode']), leftLineCode() { return this.line.left.lineCode; }, rightLineCode() { return this.line.right.lineCode; }, - hasDiscussion() { - const discussions = this.discussionsByLineCode; - - return discussions[this.leftLineCode] || discussions[this.rightLineCode]; - }, hasExpandedDiscussionOnLeft() { - const discussions = this.discussionsByLineCode[this.leftLineCode]; + const discussions = this.leftDiscussions; return discussions ? discussions.every(discussion => discussion.expanded) : false; }, hasExpandedDiscussionOnRight() { - const discussions = this.discussionsByLineCode[this.rightLineCode]; + const discussions = this.rightDiscussions; return discussions ? discussions.every(discussion => discussion.expanded) : false; }, @@ -52,17 +56,18 @@ export default { return this.hasExpandedDiscussionOnLeft || this.hasExpandedDiscussionOnRight; }, shouldRenderDiscussionsOnLeft() { - return this.discussionsByLineCode[this.leftLineCode] && this.hasExpandedDiscussionOnLeft; + return this.leftDiscussions && this.hasExpandedDiscussionOnLeft; }, shouldRenderDiscussionsOnRight() { - return ( - this.discussionsByLineCode[this.rightLineCode] && - this.hasExpandedDiscussionOnRight && - this.line.right.type - ); + return this.rightDiscussions && this.hasExpandedDiscussionOnRight && this.line.right.type; + }, + showRightSideCommentForm() { + return this.line.right.type && this.diffLineCommentForms[this.rightLineCode]; }, className() { - return this.hasDiscussion ? '' : 'js-temp-notes-holder'; + return this.leftDiscussions.length > 0 || this.rightDiscussions.length > 0 + ? '' + : 'js-temp-notes-holder'; }, }, }; @@ -80,13 +85,12 @@ export default { class="content" > <diff-discussions - v-if="discussionsByLineCode[leftLineCode].length" - :discussions="discussionsByLineCode[leftLineCode]" + v-if="leftDiscussions.length" + :discussions="leftDiscussions" /> </div> <diff-line-note-form - v-if="diffLineCommentForms[leftLineCode] && - diffLineCommentForms[leftLineCode]" + v-if="diffLineCommentForms[leftLineCode]" :diff-file-hash="diffFileHash" :line="line.left" :note-target-line="line.left" @@ -100,13 +104,12 @@ export default { class="content" > <diff-discussions - v-if="discussionsByLineCode[rightLineCode].length" - :discussions="discussionsByLineCode[rightLineCode]" + v-if="rightDiscussions.length" + :discussions="rightDiscussions" /> </div> <diff-line-note-form - v-if="diffLineCommentForms[rightLineCode] && - diffLineCommentForms[rightLineCode] && line.right.type" + v-if="showRightSideCommentForm" :diff-file-hash="diffFileHash" :line="line.right" :note-target-line="line.right" diff --git a/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue b/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue index 0031cedc68f..d4e54c2bd00 100644 --- a/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue +++ b/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue @@ -36,6 +36,16 @@ export default { required: false, default: false, }, + leftDiscussions: { + type: Array, + required: false, + default: () => [], + }, + rightDiscussions: { + type: Array, + required: false, + default: () => [], + }, }, data() { return { @@ -116,6 +126,7 @@ export default { :is-hover="isLeftHover" :show-comment-button="true" :diff-view-type="parallelDiffViewType" + :discussions="leftDiscussions" class="diff-line-num old_line" /> <td @@ -136,6 +147,7 @@ export default { :is-hover="isRightHover" :show-comment-button="true" :diff-view-type="parallelDiffViewType" + :discussions="rightDiscussions" class="diff-line-num new_line" /> <td diff --git a/app/assets/javascripts/diffs/components/parallel_diff_view.vue b/app/assets/javascripts/diffs/components/parallel_diff_view.vue index 32528c9e7ab..24ceb52a04a 100644 --- a/app/assets/javascripts/diffs/components/parallel_diff_view.vue +++ b/app/assets/javascripts/diffs/components/parallel_diff_view.vue @@ -21,8 +21,11 @@ export default { }, }, computed: { - ...mapGetters('diffs', ['commitId']), - ...mapGetters(['discussionsByLineCode']), + ...mapGetters('diffs', [ + 'commitId', + 'singleDiscussionByLineCode', + 'shouldRenderParallelCommentRow', + ]), ...mapState({ diffLineCommentForms: state => state.diffs.diffLineCommentForms, }), @@ -53,29 +56,9 @@ export default { }, }, methods: { - shouldRenderCommentRow(line) { - const leftLineCode = line.left.lineCode; - const rightLineCode = line.right.lineCode; - const discussions = this.discussionsByLineCode; - const leftDiscussions = discussions[leftLineCode]; - const rightDiscussions = discussions[rightLineCode]; - const hasDiscussion = leftDiscussions || rightDiscussions; - - const hasExpandedDiscussionOnLeft = leftDiscussions - ? leftDiscussions.every(discussion => discussion.expanded) - : false; - const hasExpandedDiscussionOnRight = rightDiscussions - ? rightDiscussions.every(discussion => discussion.expanded) - : false; - - if (hasDiscussion && (hasExpandedDiscussionOnLeft || hasExpandedDiscussionOnRight)) { - return true; - } - - const hasCommentFormOnLeft = this.diffLineCommentForms[leftLineCode]; - const hasCommentFormOnRight = this.diffLineCommentForms[rightLineCode]; - - return hasCommentFormOnLeft || hasCommentFormOnRight; + discussionsByLine(line, leftOrRight) { + return line[leftOrRight] && line[leftOrRight].lineCode !== undefined ? + this.singleDiscussionByLineCode(line[leftOrRight].lineCode) : []; }, }, }; @@ -98,13 +81,17 @@ export default { :line="line" :is-bottom="index + 1 === diffLinesLength" :key="index" + :left-discussions="discussionsByLine(line, 'left')" + :right-discussions="discussionsByLine(line, 'right')" /> <parallel-diff-comment-row - v-if="shouldRenderCommentRow(line)" + v-if="shouldRenderParallelCommentRow(line)" :key="`dcr-${index}`" :line="line" :diff-file-hash="diffFile.fileHash" :line-index="index" + :left-discussions="discussionsByLine(line, 'left')" + :right-discussions="discussionsByLine(line, 'right')" /> </template> </tbody> diff --git a/app/assets/javascripts/diffs/store/getters.js b/app/assets/javascripts/diffs/store/getters.js index 9aec117c236..4a47646d7fa 100644 --- a/app/assets/javascripts/diffs/store/getters.js +++ b/app/assets/javascripts/diffs/store/getters.js @@ -64,6 +64,47 @@ export const getDiffFileDiscussions = (state, getters, rootState, rootGetters) = discussion.diff_discussion && _.isEqual(discussion.diff_file.file_hash, diff.fileHash), ) || []; +export const singleDiscussionByLineCode = (state, getters, rootState, rootGetters) => lineCode => { + if (!lineCode || lineCode === undefined) return []; + const discussions = rootGetters.discussionsByLineCode; + return discussions[lineCode] || []; +}; + +export const shouldRenderParallelCommentRow = (state, getters) => line => { + const leftLineCode = line.left.lineCode; + const rightLineCode = line.right.lineCode; + const leftDiscussions = getters.singleDiscussionByLineCode(leftLineCode); + const rightDiscussions = getters.singleDiscussionByLineCode(rightLineCode); + const hasDiscussion = leftDiscussions.length || rightDiscussions.length; + + const hasExpandedDiscussionOnLeft = leftDiscussions.length + ? leftDiscussions.every(discussion => discussion.expanded) + : false; + const hasExpandedDiscussionOnRight = rightDiscussions.length + ? rightDiscussions.every(discussion => discussion.expanded) + : false; + + if (hasDiscussion && (hasExpandedDiscussionOnLeft || hasExpandedDiscussionOnRight)) { + return true; + } + + const hasCommentFormOnLeft = state.diffLineCommentForms[leftLineCode]; + const hasCommentFormOnRight = state.diffLineCommentForms[rightLineCode]; + + return hasCommentFormOnLeft || hasCommentFormOnRight; +}; + +export const shouldRenderInlineCommentRow = (state, getters) => line => { + if (state.diffLineCommentForms[line.lineCode]) return true; + + const lineDiscussions = getters.singleDiscussionByLineCode(line.lineCode); + if (lineDiscussions.length === 0) { + return false; + } + + return lineDiscussions.every(discussion => discussion.expanded); +}; + // prevent babel-plugin-rewire from generating an invalid default during karma∂ tests export const getDiffFileByHash = state => fileHash => state.diffFiles.find(file => file.fileHash === fileHash); diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js index d9589baa76e..82082ac508a 100644 --- a/app/assets/javascripts/diffs/store/utils.js +++ b/app/assets/javascripts/diffs/store/utils.js @@ -173,3 +173,24 @@ export function trimFirstCharOfLineContent(line = {}) { return parsedLine; } + +export function getDiffRefsByLineCode(diffFiles) { + return diffFiles.reduce((acc, diffFile) => { + const { baseSha, headSha, startSha } = diffFile.diffRefs; + const { newPath, oldPath } = diffFile; + + // We can only use highlightedDiffLines to create the map of diff lines because + // highlightedDiffLines will also include every parallel diff line in it. + if (diffFile.highlightedDiffLines) { + diffFile.highlightedDiffLines.forEach(line => { + const { lineCode, oldLine, newLine } = line; + + if (lineCode) { + acc[lineCode] = { baseSha, headSha, startSha, newPath, oldPath, oldLine, newLine }; + } + }); + } + + return acc; + }, {}); +} diff --git a/app/assets/javascripts/groups/components/group_item.vue b/app/assets/javascripts/groups/components/group_item.vue index efbf2e3a295..2b9e2a929fc 100644 --- a/app/assets/javascripts/groups/components/group_item.vue +++ b/app/assets/javascripts/groups/components/group_item.vue @@ -78,17 +78,10 @@ export default { > <div :class="{ 'project-row-contents': !isGroup }" - class="group-row-contents"> - <item-actions - v-if="isGroup" - :group="group" - :parent-group="parentGroup" - /> - <item-stats - :item="group" - /> + class="group-row-contents d-flex justify-content-end align-items-center" + > <div - class="folder-toggle-wrap" + class="folder-toggle-wrap append-right-4 d-flex align-items-center" > <item-caret :is-group-open="group.isOpen" @@ -100,7 +93,7 @@ export default { </div> <div :class="{ 'content-loading': group.isChildrenLoading }" - class="avatar-container prepend-top-8 prepend-left-5 s24 d-none d-sm-block" + class="avatar-container s24 d-none d-sm-block" > <a :href="group.relativePath" @@ -120,32 +113,46 @@ export default { </a> </div> <div - class="title namespace-title" + class="group-text flex-grow" > - <a - v-tooltip - :href="group.relativePath" - :title="group.fullName" - class="no-expand" - data-placement="bottom" - >{{ - // ending bracket must be by closing tag to prevent - // link hover text-decoration from over-extending - group.name - }}</a> - <span - v-if="group.permission" - class="user-access-role" + <div + class="title namespace-title append-right-8" > - {{ group.permission }} - </span> - </div> - <div - v-if="group.description" - class="description"> - <span v-html="group.description"> - </span> + <a + v-tooltip + :href="group.relativePath" + :title="group.fullName" + class="no-expand" + data-placement="bottom" + >{{ + // ending bracket must be by closing tag to prevent + // link hover text-decoration from over-extending + group.name + }}</a> + <span + v-if="group.permission" + class="user-access-role" + > + {{ group.permission }} + </span> + </div> + <div + v-if="group.description" + class="description" + > + <span v-html="group.description"> + </span> + </div> </div> + <item-stats + :item="group" + class="group-stats prepend-top-2" + /> + <item-actions + v-if="isGroup" + :group="group" + :parent-group="parentGroup" + /> </div> <group-folder v-if="group.isOpen && hasChildren" diff --git a/app/assets/javascripts/lazy_loader.js b/app/assets/javascripts/lazy_loader.js index 9bba341e3a3..bd2212edec7 100644 --- a/app/assets/javascripts/lazy_loader.js +++ b/app/assets/javascripts/lazy_loader.js @@ -19,11 +19,17 @@ export default class LazyLoader { scrollContainer.addEventListener('load', () => this.loadCheck()); } searchLazyImages() { - this.lazyImages = [].slice.call(document.querySelectorAll('.lazy')); + const that = this; + requestIdleCallback( + () => { + that.lazyImages = [].slice.call(document.querySelectorAll('.lazy')); - if (this.lazyImages.length) { - this.checkElementsInView(); - } + if (that.lazyImages.length) { + that.checkElementsInView(); + } + }, + { timeout: 500 }, + ); } startContentObserver() { const contentNode = document.querySelector(this.observerNode) || document.querySelector('body'); @@ -56,7 +62,9 @@ export default class LazyLoader { const imgBound = imgTop + imgBoundRect.height; if (scrollTop < imgBound && visHeight > imgTop) { - LazyLoader.loadImage(selectedImage); + requestAnimationFrame(() => { + LazyLoader.loadImage(selectedImage); + }); return false; } diff --git a/app/assets/javascripts/pages/profiles/show/emoji_menu.js b/app/assets/javascripts/pages/profiles/show/emoji_menu.js new file mode 100644 index 00000000000..094837b40e0 --- /dev/null +++ b/app/assets/javascripts/pages/profiles/show/emoji_menu.js @@ -0,0 +1,18 @@ +import { AwardsHandler } from '~/awards_handler'; + +class EmojiMenu extends AwardsHandler { + constructor(emoji, toggleButtonSelector, menuClass, selectEmojiCallback) { + super(emoji); + + this.selectEmojiCallback = selectEmojiCallback; + this.toggleButtonSelector = toggleButtonSelector; + this.menuClass = menuClass; + } + + postEmoji($emojiButton, awardUrl, selectedEmoji, callback) { + this.selectEmojiCallback(selectedEmoji, this.emoji.glEmojiTag(selectedEmoji)); + callback(); + } +} + +export default EmojiMenu; diff --git a/app/assets/javascripts/pages/profiles/show/index.js b/app/assets/javascripts/pages/profiles/show/index.js new file mode 100644 index 00000000000..949219a0837 --- /dev/null +++ b/app/assets/javascripts/pages/profiles/show/index.js @@ -0,0 +1,49 @@ +import $ from 'jquery'; +import createFlash from '~/flash'; +import GfmAutoComplete from '~/gfm_auto_complete'; +import EmojiMenu from './emoji_menu'; + +document.addEventListener('DOMContentLoaded', () => { + const toggleEmojiMenuButtonSelector = '.js-toggle-emoji-menu'; + const toggleEmojiMenuButton = document.querySelector(toggleEmojiMenuButtonSelector); + const statusEmojiField = document.getElementById('js-status-emoji-field'); + const statusMessageField = document.getElementById('js-status-message-field'); + const findNoEmojiPlaceholder = () => document.getElementById('js-no-emoji-placeholder'); + + const removeStatusEmoji = () => { + const statusEmoji = toggleEmojiMenuButton.querySelector('gl-emoji'); + if (statusEmoji) { + statusEmoji.remove(); + } + }; + + const selectEmojiCallback = (emoji, emojiTag) => { + statusEmojiField.value = emoji; + findNoEmojiPlaceholder().classList.add('hidden'); + removeStatusEmoji(); + toggleEmojiMenuButton.innerHTML += emojiTag; + }; + + const clearEmojiButton = document.getElementById('js-clear-user-status-button'); + clearEmojiButton.addEventListener('click', () => { + statusEmojiField.value = ''; + statusMessageField.value = ''; + removeStatusEmoji(); + findNoEmojiPlaceholder().classList.remove('hidden'); + }); + + const emojiAutocomplete = new GfmAutoComplete(); + emojiAutocomplete.setup($(statusMessageField), { emojis: true }); + + import(/* webpackChunkName: 'emoji' */ '~/emoji') + .then(Emoji => { + const emojiMenu = new EmojiMenu( + Emoji, + toggleEmojiMenuButtonSelector, + 'js-status-emoji-menu', + selectEmojiCallback, + ); + emojiMenu.bindEvents(); + }) + .catch(() => createFlash('Failed to load emoji list!')); +}); diff --git a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/image_viewer.vue b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/image_viewer.vue index 133bdbb54f7..8163947cd0c 100644 --- a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/image_viewer.vue +++ b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/image_viewer.vue @@ -42,6 +42,9 @@ export default { }, methods: { onImgLoad() { + requestIdleCallback(this.calculateImgSize, { timeout: 1000 }); + }, + calculateImgSize() { const { contentImg } = this.$refs; if (contentImg) { diff --git a/app/assets/stylesheets/bootstrap_migration.scss b/app/assets/stylesheets/bootstrap_migration.scss index d28ad407734..c20738a20c3 100644 --- a/app/assets/stylesheets/bootstrap_migration.scss +++ b/app/assets/stylesheets/bootstrap_migration.scss @@ -339,3 +339,13 @@ input[type=color].form-control { vertical-align: unset; } } + +// Bootstrap 3 compatibility because bootstrap_form Gem is not updated yet +.input-group-btn:first-child { + @extend .input-group-prepend; +} + +// Bootstrap 3 compatibility because bootstrap_form Gem is not updated yet +.input-group-btn:last-child { + @extend .input-group-append; +} diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss index c9865610b78..af17210f341 100644 --- a/app/assets/stylesheets/framework/common.scss +++ b/app/assets/stylesheets/framework/common.scss @@ -454,6 +454,7 @@ img.emoji { .prepend-left-10 { margin-left: 10px; } .prepend-left-default { margin-left: $gl-padding; } .prepend-left-20 { margin-left: 20px; } +.append-right-4 { margin-right: 4px; } .append-right-5 { margin-right: 5px; } .append-right-8 { margin-right: 8px; } .append-right-10 { margin-right: 10px; } @@ -470,3 +471,5 @@ img.emoji { .center { text-align: center; } .vertical-align-middle { vertical-align: middle; } .flex-align-self-center { align-self: center; } +.flex-grow { flex-grow: 1; } +.flex-no-shrink { flex-shrink: 0; } diff --git a/app/assets/stylesheets/pages/groups.scss b/app/assets/stylesheets/pages/groups.scss index 05bf5596fb3..1587aebfe1d 100644 --- a/app/assets/stylesheets/pages/groups.scss +++ b/app/assets/stylesheets/pages/groups.scss @@ -290,9 +290,8 @@ } .folder-toggle-wrap { - float: left; - line-height: $list-text-height; font-size: 0; + flex-shrink: 0; span { font-size: $gl-font-size; @@ -308,7 +307,7 @@ width: 15px; svg { - margin-bottom: 2px; + margin-bottom: 1px; } } @@ -391,9 +390,17 @@ cursor: pointer; } - .avatar-container > a { - width: 100%; - text-decoration: none; + .group-text { + min-width: 0; // allows for truncated text within flex children + } + + .avatar-container { + flex-shrink: 0; + + > a { + width: 100%; + text-decoration: none; + } } &.has-more-items { @@ -401,9 +408,18 @@ padding: 20px 10px; } + .description { + p { + @include str-truncated; + + max-width: none; + } + } + .stats { position: relative; - line-height: 46px; + line-height: normal; + flex-shrink: 0; > span { display: inline-flex; @@ -422,14 +438,20 @@ } .controls { - margin-left: 5px; + flex-shrink: 0; > .btn { - margin-right: $btn-margin-5; + margin: 0 0 0 $btn-margin-5; } } } + @include media-breakpoint-down(xs) { + .group-stats { + display: none; + } + } + .project-row-contents .stats { line-height: inherit; @@ -451,18 +473,6 @@ } } -ul.group-list-tree { - li.group-row { - > .group-row-contents .title { - line-height: $list-text-height; - } - - &.has-description > .group-row-contents .title { - line-height: inherit; - } - } -} - .js-groups-list-holder { .groups-list-loading { font-size: 34px; diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index 7fc2936c5e6..c369d89d63c 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -546,6 +546,7 @@ ul.notes { svg { @include btn-svg; + margin: 0; } .award-control-icon-positive, diff --git a/app/assets/stylesheets/pages/profile.scss b/app/assets/stylesheets/pages/profile.scss index 5d0d59e12f2..b45e305897c 100644 --- a/app/assets/stylesheets/pages/profile.scss +++ b/app/assets/stylesheets/pages/profile.scss @@ -418,3 +418,23 @@ table.u2f-registrations { } } } + +.edit-user { + .clear-user-status { + svg { + fill: $gl-text-color-secondary; + } + } + + .emoji-menu-toggle-button { + @extend .note-action-button; + + .no-emoji-placeholder { + position: relative; + + svg { + fill: $gl-text-color-secondary; + } + } + } +} diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7228a2f1715..05ed3669a41 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -20,13 +20,13 @@ class ApplicationController < ActionController::Base before_action :ldap_security_check before_action :sentry_context before_action :default_headers - before_action :add_gon_variables, unless: :peek_request? + before_action :add_gon_variables, unless: [:peek_request?, :json_request?] before_action :configure_permitted_parameters, if: :devise_controller? before_action :require_email, unless: :devise_controller? around_action :set_locale - after_action :set_page_title_header, if: -> { request.format == :json } + after_action :set_page_title_header, if: :json_request? protect_from_forgery with: :exception, prepend: true @@ -424,6 +424,10 @@ class ApplicationController < ActionController::Base request.path.start_with?('/-/peek') end + def json_request? + request.format.json? + end + def should_enforce_terms? return false unless Gitlab::CurrentSettings.current_application_settings.enforce_terms diff --git a/app/controllers/projects/runners_controller.rb b/app/controllers/projects/runners_controller.rb index cc7cce887bf..d118cec977c 100644 --- a/app/controllers/projects/runners_controller.rb +++ b/app/controllers/projects/runners_controller.rb @@ -5,7 +5,7 @@ class Projects::RunnersController < Projects::ApplicationController layout 'project_settings' def index - redirect_to project_settings_ci_cd_path(@project) + redirect_to project_settings_ci_cd_path(@project, anchor: 'js-runners-settings') end def edit @@ -50,13 +50,13 @@ class Projects::RunnersController < Projects::ApplicationController def toggle_shared_runners project.toggle!(:shared_runners_enabled) - redirect_to project_settings_ci_cd_path(@project) + redirect_to project_settings_ci_cd_path(@project, anchor: 'js-runners-settings') end def toggle_group_runners project.toggle_ci_cd_settings!(:group_runners_enabled) - redirect_to project_settings_ci_cd_path(@project) + redirect_to project_settings_ci_cd_path(@project, anchor: 'js-runners-settings') end protected diff --git a/app/controllers/projects/triggers_controller.rb b/app/controllers/projects/triggers_controller.rb index 6f3de43f85a..cb12b707087 100644 --- a/app/controllers/projects/triggers_controller.rb +++ b/app/controllers/projects/triggers_controller.rb @@ -7,7 +7,7 @@ class Projects::TriggersController < Projects::ApplicationController layout 'project_settings' def index - redirect_to project_settings_ci_cd_path(@project) + redirect_to project_settings_ci_cd_path(@project, anchor: 'js-pipeline-triggers') end def create @@ -19,7 +19,7 @@ class Projects::TriggersController < Projects::ApplicationController flash[:alert] = 'You could not create a new trigger.' end - redirect_to project_settings_ci_cd_path(@project) + redirect_to project_settings_ci_cd_path(@project, anchor: 'js-pipeline-triggers') end def take_ownership @@ -29,7 +29,7 @@ class Projects::TriggersController < Projects::ApplicationController flash[:alert] = 'You could not take ownership of trigger.' end - redirect_to project_settings_ci_cd_path(@project) + redirect_to project_settings_ci_cd_path(@project, anchor: 'js-pipeline-triggers') end def edit @@ -37,7 +37,7 @@ class Projects::TriggersController < Projects::ApplicationController def update if trigger.update(trigger_params) - redirect_to project_settings_ci_cd_path(@project), notice: 'Trigger was successfully updated.' + redirect_to project_settings_ci_cd_path(@project, anchor: 'js-pipeline-triggers'), notice: 'Trigger was successfully updated.' else render action: "edit" end @@ -50,7 +50,7 @@ class Projects::TriggersController < Projects::ApplicationController flash[:alert] = "Could not remove the trigger." end - redirect_to project_settings_ci_cd_path(@project), status: :found + redirect_to project_settings_ci_cd_path(@project, anchor: 'js-pipeline-triggers'), status: :found end private diff --git a/app/helpers/profiles_helper.rb b/app/helpers/profiles_helper.rb index a6a57db3002..e7aa92e6e5c 100644 --- a/app/helpers/profiles_helper.rb +++ b/app/helpers/profiles_helper.rb @@ -9,8 +9,4 @@ module ProfilesHelper end end end - - def show_user_status_field? - Feature.enabled?(:user_status_form) || cookies[:feature_user_status_form] == 'true' - end end diff --git a/app/views/doorkeeper/authorizations/new.html.haml b/app/views/doorkeeper/authorizations/new.html.haml index ca62a59d909..74791b81ccd 100644 --- a/app/views/doorkeeper/authorizations/new.html.haml +++ b/app/views/doorkeeper/authorizations/new.html.haml @@ -4,7 +4,7 @@ .modal-header %h3.page-title - link_to_client = link_to(@pre_auth.client.name, @pre_auth.redirect_uri, target: '_blank', rel: 'noopener noreferrer') - = _("Authorize %{link_to_client} to use your account?") + = _("Authorize %{link_to_client} to use your account?").html_safe % { link_to_client: link_to_client } .modal-body - if current_user.admin? diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml index e7044f722c5..6f08a294c5d 100644 --- a/app/views/profiles/show.html.haml +++ b/app/views/profiles/show.html.haml @@ -31,17 +31,37 @@ %hr = link_to _('Remove avatar'), profile_avatar_path, data: { confirm: _('Avatar will be removed. Are you sure?') }, method: :delete, class: 'btn btn-danger btn-inverted' - - if show_user_status_field? - %hr - .row - .col-lg-4.profile-settings-sidebar - %h4.prepend-top-0= s_("User|Current Status") - %p= s_("Profiles|This emoji and message will appear on your profile and throughout the interface. The message can contain emoji codes, too.") - .col-lg-8 - .row - = f.fields_for :status, @user.status do |status_form| - = status_form.text_field :emoji - = status_form.text_field :message, maxlength: 100 + %hr + .row + .col-lg-4.profile-settings-sidebar + %h4.prepend-top-0= s_("User|Current status") + %p= s_("Profiles|This emoji and message will appear on your profile and throughout the interface.") + .col-lg-8 + = f.fields_for :status, @user.status do |status_form| + - emoji_button = button_tag type: :button, + class: 'js-toggle-emoji-menu emoji-menu-toggle-button btn has-tooltip', + title: s_("Profiles|Add status emoji") do + - if @user.status + = emoji_icon @user.status.emoji + %span#js-no-emoji-placeholder.no-emoji-placeholder{ class: ('hidden' if @user.status) } + = sprite_icon('emoji_slightly_smiling_face', css_class: 'award-control-icon-neutral') + = sprite_icon('emoji_smiley', css_class: 'award-control-icon-positive') + = sprite_icon('emoji_smile', css_class: 'award-control-icon-super-positive') + - reset_message_button = button_tag type: :button, + id: 'js-clear-user-status-button', + class: 'clear-user-status btn has-tooltip', + title: s_("Profiles|Clear status") do + = sprite_icon("close") + + = status_form.hidden_field :emoji, id: 'js-status-emoji-field' + = status_form.text_field :message, + id: 'js-status-message-field', + class: 'form-control input-lg', + label: s_("Profiles|Your status"), + prepend: emoji_button, + append: reset_message_button, + placeholder: s_("Profiles|What's your status?") + %hr .row .col-lg-4.profile-settings-sidebar diff --git a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml index 7d878b38e85..ab9ba5c7569 100644 --- a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml +++ b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml @@ -1,6 +1,6 @@ .row .col-lg-12 - = form_for @project, url: project_settings_ci_cd_path(@project) do |f| + = form_for @project, url: project_settings_ci_cd_path(@project, anchor: 'autodevops-settings') do |f| = form_errors(@project) %fieldset.builds-feature.js-auto-devops-settings .form-group diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml index 64751e5616a..434aed2f603 100644 --- a/app/views/projects/settings/ci_cd/_form.html.haml +++ b/app/views/projects/settings/ci_cd/_form.html.haml @@ -1,6 +1,6 @@ .row.prepend-top-default .col-lg-12 - = form_for @project, url: project_settings_ci_cd_path(@project) do |f| + = form_for @project, url: project_settings_ci_cd_path(@project, anchor: 'js-general-pipeline-settings') do |f| = form_errors(@project) %fieldset.builds-feature .form-group.append-bottom-default.js-secret-runner-token diff --git a/changelogs/unreleased/46703-group-dashboard-line-height-is-too-tall-for-group-names.yml b/changelogs/unreleased/46703-group-dashboard-line-height-is-too-tall-for-group-names.yml new file mode 100644 index 00000000000..5b91c6d5a9f --- /dev/null +++ b/changelogs/unreleased/46703-group-dashboard-line-height-is-too-tall-for-group-names.yml @@ -0,0 +1,5 @@ +--- +title: Solves group dashboard line height is too tall for group names. +merge_request: 21033 +author: +type: fixed diff --git a/changelogs/unreleased/pl-json-gon.yml b/changelogs/unreleased/pl-json-gon.yml new file mode 100644 index 00000000000..c0f93006c07 --- /dev/null +++ b/changelogs/unreleased/pl-json-gon.yml @@ -0,0 +1,5 @@ +--- +title: Don't set gon variables in JSON requests +merge_request: 21016 +author: Peter Leitzen +type: performance diff --git a/changelogs/unreleased/tz-mr-port-memory-fixes.yml b/changelogs/unreleased/tz-mr-port-memory-fixes.yml new file mode 100644 index 00000000000..61d3c9abf71 --- /dev/null +++ b/changelogs/unreleased/tz-mr-port-memory-fixes.yml @@ -0,0 +1,5 @@ +--- +title: Improve performance and memory footprint of Changes tab of Merge Requests +merge_request: 21028 +author: +type: performance diff --git a/changelogs/unreleased/winh-restyle-user-status.yml b/changelogs/unreleased/winh-restyle-user-status.yml new file mode 100644 index 00000000000..90370e87825 --- /dev/null +++ b/changelogs/unreleased/winh-restyle-user-status.yml @@ -0,0 +1,5 @@ +--- +title: Restyle status message input on profile settings +merge_request: 20903 +author: +type: changed diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 8bd46dedb7f..bec60cf592a 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -4118,9 +4118,15 @@ msgstr "" msgid "Profiles|Add key" msgstr "" +msgid "Profiles|Add status emoji" +msgstr "" + msgid "Profiles|Change username" msgstr "" +msgid "Profiles|Clear status" +msgstr "" + msgid "Profiles|Current path: %{path}" msgstr "" @@ -4148,7 +4154,7 @@ msgstr "" msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?" msgstr "" -msgid "Profiles|This emoji and message will appear on your profile and throughout the interface. The message can contain emoji codes, too." +msgid "Profiles|This emoji and message will appear on your profile and throughout the interface." msgstr "" msgid "Profiles|Type your %{confirmationValue} to confirm:" @@ -4166,6 +4172,9 @@ msgstr "" msgid "Profiles|Username successfully changed" msgstr "" +msgid "Profiles|What's your status?" +msgstr "" + msgid "Profiles|You don't have access to delete this user." msgstr "" @@ -4175,6 +4184,9 @@ msgstr "" msgid "Profiles|Your account is currently an owner in these groups:" msgstr "" +msgid "Profiles|Your status" +msgstr "" + msgid "Profiles|e.g. My MacBook key" msgstr "" @@ -5763,7 +5775,7 @@ msgstr "" msgid "Users" msgstr "" -msgid "User|Current Status" +msgid "User|Current status" msgstr "" msgid "Variables" diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb index bad7a28556c..421ab006792 100644 --- a/spec/controllers/application_controller_spec.rb +++ b/spec/controllers/application_controller_spec.rb @@ -56,6 +56,57 @@ describe ApplicationController do end end + describe '#add_gon_variables' do + before do + Gon.clear + sign_in user + end + + let(:json_response) { JSON.parse(response.body) } + + controller(described_class) do + def index + render json: Gon.all_variables + end + end + + shared_examples 'setting gon variables' do + it 'sets gon variables' do + get :index, format: format + + expect(json_response.size).not_to be_zero + end + end + + shared_examples 'not setting gon variables' do + it 'does not set gon variables' do + get :index, format: format + + expect(json_response.size).to be_zero + end + end + + context 'with html format' do + let(:format) { :html } + + it_behaves_like 'setting gon variables' + + context 'for peek requests' do + before do + request.path = '/-/peek' + end + + it_behaves_like 'not setting gon variables' + end + end + + context 'with json format' do + let(:format) { :json } + + it_behaves_like 'not setting gon variables' + end + end + describe "#authenticate_user_from_personal_access_token!" do before do stub_authentication_activity_metrics(debug: false) diff --git a/spec/features/profiles/user_edit_profile_spec.rb b/spec/features/profiles/user_edit_profile_spec.rb index 96bbe6f93f1..9e60b4995bd 100644 --- a/spec/features/profiles/user_edit_profile_spec.rb +++ b/spec/features/profiles/user_edit_profile_spec.rb @@ -8,6 +8,10 @@ describe 'User edit profile' do visit(profile_path) end + def submit_settings + click_button 'Update profile settings' + end + it 'changes user profile' do fill_in 'user_skype', with: 'testskype' fill_in 'user_linkedin', with: 'testlinkedin' @@ -16,7 +20,7 @@ describe 'User edit profile' do fill_in 'user_location', with: 'Ukraine' fill_in 'user_bio', with: 'I <3 GitLab' fill_in 'user_organization', with: 'GitLab' - click_button 'Update profile settings' + submit_settings expect(user.reload).to have_attributes( skype: 'testskype', @@ -34,7 +38,7 @@ describe 'User edit profile' do context 'user avatar' do before do attach_file(:user_avatar, Rails.root.join('spec', 'fixtures', 'banana_sample.gif')) - click_button 'Update profile settings' + submit_settings end it 'changes user avatar' do @@ -56,30 +60,75 @@ describe 'User edit profile' do end end - context 'user status' do - it 'hides user status when the feature is disabled' do - stub_feature_flags(user_status_form: false) + context 'user status', :js do + def select_emoji(emoji_name) + toggle_button = find('.js-toggle-emoji-menu') + toggle_button.click + emoji_button = find(%Q{.js-status-emoji-menu .js-emoji-btn gl-emoji[data-name="#{emoji_name}"]}) + emoji_button.click + end + it 'shows the user status form' do visit(profile_path) - expect(page).not_to have_content('Current Status') + expect(page).to have_content('Current status') end - it 'shows the status form when the feature is enabled' do - stub_feature_flags(user_status_form: true) + it 'adds emoji to user status' do + emoji = 'biohazard' + visit(profile_path) + select_emoji(emoji) + submit_settings + visit user_path(user) + within('.cover-status') do + expect(page).to have_emoji(emoji) + end + end + + it 'adds message to user status' do + message = 'I have something to say' visit(profile_path) + fill_in 'js-status-message-field', with: message + submit_settings + + visit user_path(user) + within('.cover-status') do + expect(page).to have_emoji('speech_balloon') + expect(page).to have_content message + end + end - expect(page).to have_content('Current Status') + it 'adds message and emoji to user status' do + emoji = 'tanabata_tree' + message = 'Playing outside' + visit(profile_path) + select_emoji(emoji) + fill_in 'js-status-message-field', with: message + submit_settings + + visit user_path(user) + within('.cover-status') do + expect(page).to have_emoji(emoji) + expect(page).to have_content message + end end - it 'shows the status form when the feature is enabled by setting a cookie', :js do - stub_feature_flags(user_status_form: false) - set_cookie('feature_user_status_form', 'true') + it 'clears the user status' do + user_status = create(:user_status, user: user, message: 'Eating bread', emoji: 'stuffed_flatbread') + + visit user_path(user) + within('.cover-status') do + expect(page).to have_emoji(user_status.emoji) + expect(page).to have_content user_status.message + end visit(profile_path) + click_button 'js-clear-user-status-button' + submit_settings - expect(page).to have_content('Current Status') + visit user_path(user) + expect(page).not_to have_selector '.cover-status' end end end diff --git a/spec/javascripts/diffs/components/diff_line_gutter_content_spec.js b/spec/javascripts/diffs/components/diff_line_gutter_content_spec.js index 2d136a63c52..a1a37b342b7 100644 --- a/spec/javascripts/diffs/components/diff_line_gutter_content_spec.js +++ b/spec/javascripts/diffs/components/diff_line_gutter_content_spec.js @@ -48,7 +48,11 @@ describe('DiffLineGutterContent', () => { it('should return discussions for the given lineCode', () => { const { lineCode } = getDiffFileMock().highlightedDiffLines[1]; - const component = createComponent({ lineCode, showCommentButton: true }); + const component = createComponent({ + lineCode, + showCommentButton: true, + discussions: getDiscussionsMockData(), + }); setDiscussions(component); diff --git a/spec/javascripts/diffs/store/getters_spec.js b/spec/javascripts/diffs/store/getters_spec.js index 7706c32d24d..a59b26b2634 100644 --- a/spec/javascripts/diffs/store/getters_spec.js +++ b/spec/javascripts/diffs/store/getters_spec.js @@ -184,6 +184,104 @@ describe('Diffs Module Getters', () => { }); }); + describe('singleDiscussionByLineCode', () => { + it('returns found discussion per line Code', () => { + const discussionsMock = {}; + discussionsMock.ABC = discussionMock; + + expect( + getters.singleDiscussionByLineCode(localState, {}, null, { + discussionsByLineCode: () => discussionsMock, + })('DEF'), + ).toEqual([]); + }); + + it('returns empty array when no discussions match', () => { + expect( + getters.singleDiscussionByLineCode(localState, {}, null, { + discussionsByLineCode: () => {}, + })('DEF'), + ).toEqual([]); + }); + }); + + describe('shouldRenderParallelCommentRow', () => { + let line; + + beforeEach(() => { + line = {}; + + line.left = { + lineCode: 'ABC', + }; + + line.right = { + lineCode: 'DEF', + }; + }); + + it('returns true when discussion is expanded', () => { + discussionMock.expanded = true; + + expect( + getters.shouldRenderParallelCommentRow(localState, { + singleDiscussionByLineCode: () => [discussionMock], + })(line), + ).toEqual(true); + }); + + it('returns false when no discussion was found', () => { + localState.diffLineCommentForms.ABC = false; + localState.diffLineCommentForms.DEF = false; + + expect( + getters.shouldRenderParallelCommentRow(localState, { + singleDiscussionByLineCode: () => [], + })(line), + ).toEqual(false); + }); + + it('returns true when discussionForm was found', () => { + localState.diffLineCommentForms.ABC = {}; + + expect( + getters.shouldRenderParallelCommentRow(localState, { + singleDiscussionByLineCode: () => [discussionMock], + })(line), + ).toEqual(true); + }); + }); + + describe('shouldRenderInlineCommentRow', () => { + it('returns true when diffLineCommentForms has form', () => { + localState.diffLineCommentForms.ABC = {}; + + expect( + getters.shouldRenderInlineCommentRow(localState)({ + lineCode: 'ABC', + }), + ).toEqual(true); + }); + + it('returns false when no line discussions were found', () => { + expect( + getters.shouldRenderInlineCommentRow(localState, { + singleDiscussionByLineCode: () => [], + })('DEF'), + ).toEqual(false); + }); + + it('returns true if all found discussions are expanded', () => { + discussionMock.expanded = true; + + expect( + getters.shouldRenderInlineCommentRow(localState, { + singleDiscussionByLineCode: () => [discussionMock], + })('ABC'), + ).toEqual(true); + }); + }); + describe('getDiffFileDiscussions', () => { it('returns an array with discussions when fileHash matches and the discussion belongs to a diff', () => { discussionMock.diff_file.file_hash = diffFileMock.fileHash; diff --git a/spec/javascripts/pages/profiles/show/emoji_menu_spec.js b/spec/javascripts/pages/profiles/show/emoji_menu_spec.js new file mode 100644 index 00000000000..b70368fc92f --- /dev/null +++ b/spec/javascripts/pages/profiles/show/emoji_menu_spec.js @@ -0,0 +1,117 @@ +import $ from 'jquery'; +import axios from '~/lib/utils/axios_utils'; +import EmojiMenu from '~/pages/profiles/show/emoji_menu'; +import { TEST_HOST } from 'spec/test_constants'; + +describe('EmojiMenu', () => { + const dummyEmojiTag = '<dummy></tag>'; + const dummyToggleButtonSelector = '.toggle-button-selector'; + const dummyMenuClass = 'dummy-menu-class'; + + let emojiMenu; + let dummySelectEmojiCallback; + let dummyEmojiList; + + beforeEach(() => { + dummySelectEmojiCallback = jasmine.createSpy('dummySelectEmojiCallback'); + dummyEmojiList = { + glEmojiTag() { + return dummyEmojiTag; + }, + normalizeEmojiName(emoji) { + return emoji; + }, + isEmojiNameValid() { + return true; + }, + getEmojiCategoryMap() { + return { dummyCategory: [] }; + }, + }; + + emojiMenu = new EmojiMenu( + dummyEmojiList, + dummyToggleButtonSelector, + dummyMenuClass, + dummySelectEmojiCallback, + ); + }); + + afterEach(() => { + emojiMenu.destroy(); + }); + + describe('addAward', () => { + const dummyAwardUrl = `${TEST_HOST}/award/url`; + const dummyEmoji = 'tropical_fish'; + const dummyVotesBlock = () => $('<div />'); + + it('calls selectEmojiCallback', done => { + expect(dummySelectEmojiCallback).not.toHaveBeenCalled(); + + emojiMenu.addAward(dummyVotesBlock(), dummyAwardUrl, dummyEmoji, false, () => { + expect(dummySelectEmojiCallback).toHaveBeenCalledWith(dummyEmoji, dummyEmojiTag); + done(); + }); + }); + + it('does not make an axios requst', done => { + spyOn(axios, 'request').and.stub(); + + emojiMenu.addAward(dummyVotesBlock(), dummyAwardUrl, dummyEmoji, false, () => { + expect(axios.request).not.toHaveBeenCalled(); + done(); + }); + }); + }); + + describe('bindEvents', () => { + beforeEach(() => { + spyOn(emojiMenu, 'registerEventListener').and.stub(); + }); + + it('binds event listeners to custom toggle button', () => { + emojiMenu.bindEvents(); + + expect(emojiMenu.registerEventListener).toHaveBeenCalledWith( + 'one', + jasmine.anything(), + 'mouseenter focus', + dummyToggleButtonSelector, + 'mouseenter focus', + jasmine.anything(), + ); + expect(emojiMenu.registerEventListener).toHaveBeenCalledWith( + 'on', + jasmine.anything(), + 'click', + dummyToggleButtonSelector, + jasmine.anything(), + ); + }); + + it('binds event listeners to custom menu class', () => { + emojiMenu.bindEvents(); + + expect(emojiMenu.registerEventListener).toHaveBeenCalledWith( + 'on', + jasmine.anything(), + 'click', + `.js-awards-block .js-emoji-btn, .${dummyMenuClass} .js-emoji-btn`, + jasmine.anything(), + ); + }); + }); + + describe('createEmojiMenu', () => { + it('renders the menu with custom menu class', () => { + const menuElement = () => + document.body.querySelector(`.emoji-menu.${dummyMenuClass} .emoji-menu-content`); + expect(menuElement()).toBe(null); + + emojiMenu.createEmojiMenu(); + + expect(menuElement()).not.toBe(null); + }); + }); +}); diff --git a/spec/javascripts/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js b/spec/javascripts/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js index b878286ae3f..dde49b4a5d7 100644 --- a/spec/javascripts/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js +++ b/spec/javascripts/vue_shared/components/diff_viewer/viewers/image_diff_viewer_spec.js @@ -170,8 +170,6 @@ describe('ImageDiffViewer', () => { vm.$el.querySelector('.view-modes-menu li:nth-child(3)').click(); vm.$nextTick(() => { - expect(vm.$el.querySelector('.dragger').style.left).toBe('100px'); - dragSlider(vm.$el.querySelector('.dragger')); vm.$nextTick(() => { diff --git a/vendor/Dockerfile/Node-alpine.Dockerfile b/vendor/Dockerfile/Node-alpine.Dockerfile index 9776b1336b5..5b9b495644a 100644 --- a/vendor/Dockerfile/Node-alpine.Dockerfile +++ b/vendor/Dockerfile/Node-alpine.Dockerfile @@ -1,14 +1,15 @@ -FROM node:7.9-alpine +FROM node:8.11-alpine WORKDIR /usr/src/app ARG NODE_ENV ENV NODE_ENV $NODE_ENV + COPY package.json /usr/src/app/ -RUN npm install && npm cache clean -COPY . /usr/src/app +RUN npm install -CMD [ "npm", "start" ] +COPY . /usr/src/app # replace this with your application's default port EXPOSE 8888 +CMD [ "npm", "start" ] diff --git a/vendor/Dockerfile/Node.Dockerfile b/vendor/Dockerfile/Node.Dockerfile index 7e936d5e887..e8b64b3a6e4 100644 --- a/vendor/Dockerfile/Node.Dockerfile +++ b/vendor/Dockerfile/Node.Dockerfile @@ -1,14 +1,15 @@ -FROM node:7.9 +FROM node:8.11 WORKDIR /usr/src/app ARG NODE_ENV ENV NODE_ENV $NODE_ENV + COPY package.json /usr/src/app/ -RUN npm install && npm cache clean -COPY . /usr/src/app +RUN npm install -CMD [ "npm", "start" ] +COPY . /usr/src/app # replace this with your application's default port EXPOSE 8888 +CMD [ "npm", "start" ]
\ No newline at end of file diff --git a/vendor/Dockerfile/Ruby-alpine.Dockerfile b/vendor/Dockerfile/Ruby-alpine.Dockerfile index 9db4e2130f2..dffe9a65116 100644 --- a/vendor/Dockerfile/Ruby-alpine.Dockerfile +++ b/vendor/Dockerfile/Ruby-alpine.Dockerfile @@ -1,8 +1,8 @@ -FROM ruby:2.4-alpine +FROM ruby:2.5-alpine # Edit with nodejs, mysql-client, postgresql-client, sqlite3, etc. for your needs. # Or delete entirely if not needed. -RUN apk --no-cache add nodejs postgresql-client +RUN apk --no-cache add nodejs postgresql-client tzdata # throw errors if Gemfile has been modified since Gemfile.lock RUN bundle config --global frozen 1 @@ -11,7 +11,10 @@ RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY Gemfile Gemfile.lock /usr/src/app/ -RUN bundle install +# Install build dependencies - required for gems with native dependencies +RUN apk add --no-cache --virtual build-deps build-base postgresql-dev && \ + bundle install && \ + apk del build-deps COPY . /usr/src/app @@ -21,4 +24,4 @@ COPY . /usr/src/app # For Rails EXPOSE 3000 -CMD ["rails", "server"] +CMD ["bundle", "exec", "rails", "server"] diff --git a/vendor/Dockerfile/Ruby.Dockerfile b/vendor/Dockerfile/Ruby.Dockerfile index feb880ee4b2..289ed57bfa2 100644 --- a/vendor/Dockerfile/Ruby.Dockerfile +++ b/vendor/Dockerfile/Ruby.Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:2.4 +FROM ruby:2.5 # Edit with nodejs, mysql-client, postgresql-client, sqlite3, etc. for your needs. # Or delete entirely if not needed. @@ -24,4 +24,4 @@ COPY . /usr/src/app # For Rails EXPOSE 3000 -CMD ["rails", "server", "-b", "0.0.0.0"] +CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"] diff --git a/vendor/gitignore/Autotools.gitignore b/vendor/gitignore/Autotools.gitignore index 96d6ed2cfea..f4f545c9ca4 100644 --- a/vendor/gitignore/Autotools.gitignore +++ b/vendor/gitignore/Autotools.gitignore @@ -16,6 +16,8 @@ autom4te.cache /compile /config.guess /config.h.in +/config.log +/config.status /config.sub /configure /configure.scan diff --git a/vendor/gitignore/Laravel.gitignore b/vendor/gitignore/Laravel.gitignore index a4854bef534..67e2146f2bc 100644 --- a/vendor/gitignore/Laravel.gitignore +++ b/vendor/gitignore/Laravel.gitignore @@ -1,6 +1,7 @@ vendor/ node_modules/ npm-debug.log +yarn-error.log # Laravel 4 specific bootstrap/compiled.php @@ -10,11 +11,7 @@ app/storage/ public/storage public/hot storage/*.key -.env.*.php -.env.php .env Homestead.yaml Homestead.json - -# Rocketeer PHP task runner and deployment package. https://github.com/rocketeers/rocketeer -.rocketeer/ +/.vagrant diff --git a/vendor/gitignore/VisualStudio.gitignore b/vendor/gitignore/VisualStudio.gitignore index f431ddc7cf5..94b41b913fb 100644 --- a/vendor/gitignore/VisualStudio.gitignore +++ b/vendor/gitignore/VisualStudio.gitignore @@ -59,7 +59,7 @@ StyleCopReport.xml # Files built by Visual Studio *_i.c *_p.c -*_i.h +*_h.h *.ilk *.meta *.obj @@ -327,3 +327,6 @@ ASALocalRun/ # MFractors (Xamarin productivity tool) working folder .mfractor/ + +# Local History for Visual Studio +.localhistory/ diff --git a/vendor/gitlab-ci-yml/Maven.gitlab-ci.yml b/vendor/gitlab-ci-yml/Maven.gitlab-ci.yml index d5ee7ed2c13..5f9c9b2c965 100644 --- a/vendor/gitlab-ci-yml/Maven.gitlab-ci.yml +++ b/vendor/gitlab-ci-yml/Maven.gitlab-ci.yml @@ -17,7 +17,7 @@ variables: # This will supress any download for dependencies and plugins or upload messages which would clutter the console log. # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work. - MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true" + MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true" # As of Maven 3.3.0 instead of this you may define these options in `.mvn/maven.config` so the same config is used # when running from the command line. # `installAtEnd` and `deployAtEnd` are only effective with recent version of the corresponding plugins. diff --git a/vendor/gitlab-ci-yml/Ruby.gitlab-ci.yml b/vendor/gitlab-ci-yml/Ruby.gitlab-ci.yml index ff7bdd32239..93cb31f48c0 100644 --- a/vendor/gitlab-ci-yml/Ruby.gitlab-ci.yml +++ b/vendor/gitlab-ci-yml/Ruby.gitlab-ci.yml @@ -1,6 +1,6 @@ # Official language image. Look for the different tagged releases at: # https://hub.docker.com/r/library/ruby/tags/ -image: "ruby:2.4" +image: "ruby:2.5" # Pick zero or more services to be used on all builds. # Only needed when using a docker container to run your tests in. diff --git a/vendor/licenses.csv b/vendor/licenses.csv index 7503160baa0..a462daf3067 100644 --- a/vendor/licenses.csv +++ b/vendor/licenses.csv @@ -7,28 +7,29 @@ @babel/template,7.0.0-beta.44,MIT @babel/traverse,7.0.0-beta.44,MIT @babel/types,7.0.0-beta.44,MIT -@gitlab-org/gitlab-svgs,1.25.0,SEE LICENSE IN LICENSE +@gitlab-org/gitlab-svgs,1.27.0,SEE LICENSE IN LICENSE +@gitlab-org/gitlab-ui,1.0.5,UNKNOWN @sindresorhus/is,0.7.0,MIT @types/jquery,2.0.48,MIT @vue/component-compiler-utils,1.2.1,MIT -@webassemblyjs/ast,1.5.10,MIT -@webassemblyjs/floating-point-hex-parser,1.5.10,MIT -@webassemblyjs/helper-api-error,1.5.10,MIT -@webassemblyjs/helper-buffer,1.5.10,MIT -@webassemblyjs/helper-code-frame,1.5.10,MIT -@webassemblyjs/helper-fsm,1.5.10,ISC -@webassemblyjs/helper-module-context,1.5.10,MIT -@webassemblyjs/helper-wasm-bytecode,1.5.10,MIT -@webassemblyjs/helper-wasm-section,1.5.10,MIT -@webassemblyjs/ieee754,1.5.10,Unknown -@webassemblyjs/leb128,1.5.10,Apache 2.0 -@webassemblyjs/utf8,1.5.10,MIT -@webassemblyjs/wasm-edit,1.5.10,MIT -@webassemblyjs/wasm-gen,1.5.10,MIT -@webassemblyjs/wasm-opt,1.5.10,MIT -@webassemblyjs/wasm-parser,1.5.10,MIT -@webassemblyjs/wast-parser,1.5.10,MIT -@webassemblyjs/wast-printer,1.5.10,MIT +@webassemblyjs/ast,1.5.13,MIT +@webassemblyjs/floating-point-hex-parser,1.5.13,MIT +@webassemblyjs/helper-api-error,1.5.13,MIT +@webassemblyjs/helper-buffer,1.5.13,MIT +@webassemblyjs/helper-code-frame,1.5.13,MIT +@webassemblyjs/helper-fsm,1.5.13,ISC +@webassemblyjs/helper-module-context,1.5.13,MIT +@webassemblyjs/helper-wasm-bytecode,1.5.13,MIT +@webassemblyjs/helper-wasm-section,1.5.13,MIT +@webassemblyjs/ieee754,1.5.13,MIT +@webassemblyjs/leb128,1.5.13,MIT +@webassemblyjs/utf8,1.5.13,MIT +@webassemblyjs/wasm-edit,1.5.13,MIT +@webassemblyjs/wasm-gen,1.5.13,MIT +@webassemblyjs/wasm-opt,1.5.13,MIT +@webassemblyjs/wasm-parser,1.5.13,MIT +@webassemblyjs/wast-parser,1.5.13,MIT +@webassemblyjs/wast-printer,1.5.13,MIT RedCloth,4.3.2,MIT abbrev,1.0.9,ISC abbrev,1.1.1,ISC @@ -36,6 +37,7 @@ accepts,1.3.4,MIT ace-rails-ap,4.1.2,MIT acorn,3.3.0,MIT acorn,5.6.2,MIT +acorn,5.7.1,MIT acorn-dynamic-import,3.0.0,MIT acorn-jsx,3.0.1,MIT actionmailer,4.2.10,MIT @@ -50,31 +52,29 @@ addressable,2.5.2,Apache 2.0 addressparser,1.0.1,MIT aes_key_wrap,1.0.1,MIT after,0.8.2,MIT -agent-base,2.1.1,MIT +agent-base,4.2.1,MIT ajv,5.5.2,MIT ajv,6.1.1,MIT ajv-keywords,2.1.1,MIT ajv-keywords,3.1.0,MIT akismet,2.0.0,MIT align-text,0.1.4,MIT -alphanum-sort,1.0.2,MIT amdefine,1.0.1,BSD-3-Clause OR MIT amqplib,0.5.2,MIT ansi-align,2.0.0,ISC +ansi-escapes,1.4.0,MIT ansi-escapes,3.0.0,MIT ansi-html,0.0.7,Apache 2.0 ansi-regex,2.1.1,MIT ansi-regex,3.0.0,MIT ansi-styles,2.2.1,MIT ansi-styles,3.2.1,MIT -anymatch,1.3.2,ISC anymatch,2.0.0,ISC append-transform,0.4.0,MIT aproba,1.2.0,ISC are-we-there-yet,1.1.4,ISC arel,6.0.4,MIT argparse,1.0.9,MIT -arr-diff,2.0.0,MIT arr-diff,4.0.0,MIT arr-flatten,1.1.0,MIT arr-union,3.1.0,MIT @@ -102,8 +102,8 @@ asset_sync,2.4.0,MIT assign-symbols,1.0.0,MIT ast-types,0.11.3,MIT async,1.5.2,MIT -async,2.1.5,MIT async,2.6.0,MIT +async,2.6.1,MIT async-each,1.0.1,MIT async-limiter,1.0.0,MIT asynckit,0.4.0,MIT @@ -111,7 +111,6 @@ atob,2.0.3,(MIT OR Apache-2.0) atomic,1.1.99,Apache 2.0 attr_encrypted,3.1.0,MIT attr_required,1.0.0,MIT -autoprefixer,6.7.7,MIT autosize,4.0.0,MIT aws-sign2,0.6.0,Apache 2.0 aws-sign2,0.7.0,Apache 2.0 @@ -138,7 +137,7 @@ babel-helper-regex,6.26.0,MIT babel-helper-remap-async-to-generator,6.24.1,MIT babel-helper-replace-supers,6.24.1,MIT babel-helpers,6.24.1,MIT -babel-loader,7.1.4,MIT +babel-loader,7.1.5,MIT babel-messages,6.23.0,MIT babel-plugin-check-es2015-constants,6.22.0,MIT babel-plugin-istanbul,4.1.6,New BSD @@ -182,6 +181,7 @@ babel-plugin-transform-exponentiation-operator,6.24.1,MIT babel-plugin-transform-object-rest-spread,6.23.0,MIT babel-plugin-transform-regenerator,6.26.0,MIT babel-plugin-transform-strict-mode,6.24.1,MIT +babel-polyfill,6.23.0,MIT babel-preset-es2015,6.24.1,MIT babel-preset-es2016,6.24.1,MIT babel-preset-es2017,6.24.1,MIT @@ -197,7 +197,6 @@ babosa,1.0.2,MIT babylon,6.18.0,MIT babylon,7.0.0-beta.44,MIT backo2,1.0.2,MIT -balanced-match,0.4.2,MIT balanced-match,1.0.0,MIT base,0.11.2,MIT base32,0.3.2,MIT @@ -213,8 +212,9 @@ better-assert,1.0.2,MIT bfj-node4,5.2.1,MIT big.js,3.1.3,MIT binary-extensions,1.11.0,MIT +binaryextensions,2.1.1,MIT bindata,2.4.3,ruby -bitsyntax,0.0.4,Unknown +bitsyntax,0.0.4,UNKNOWN bl,1.1.2,MIT blackst0ne-mermaid,7.1.0-fixed,MIT blob,0.0.4,MIT* @@ -226,11 +226,12 @@ boom,2.10.1,New BSD boom,4.3.1,New BSD boom,5.2.0,New BSD bootstrap,4.1.1,MIT +bootstrap,4.1.2,MIT +bootstrap-vue,2.0.0-rc.11,MIT bootstrap_form,2.7.0,MIT boxen,1.3.0,MIT brace-expansion,1.1.11,MIT braces,0.1.5,MIT -braces,1.8.5,MIT braces,2.3.1,MIT brorand,1.1.0,MIT browser,2.2.0,MIT @@ -240,7 +241,6 @@ browserify-des,1.0.0,MIT browserify-rsa,4.0.1,MIT browserify-sign,4.0.4,ISC browserify-zlib,0.2.0,MIT -browserslist,1.7.7,MIT buffer,4.9.1,MIT buffer-from,1.0.0,MIT buffer-indexof,1.1.0,MIT @@ -263,8 +263,6 @@ camelcase,1.2.1,MIT camelcase,2.1.1,MIT camelcase,4.1.0,MIT camelcase-keys,2.1.0,MIT -caniuse-api,1.6.1,MIT -caniuse-db,1.0.30000649,CC-BY-4.0 capture-stack-trace,1.0.0,MIT carrierwave,1.2.3,MIT caseless,0.11.0,Apache 2.0 @@ -274,22 +272,22 @@ center-align,0.1.3,MIT chalk,1.1.3,MIT chalk,2.4.1,MIT chardet,0.4.2,MIT +chardet,0.5.0,MIT charenc,0.0.2,New BSD charlock_holmes,0.7.6,MIT chart.js,1.0.2,MIT check-types,7.3.0,MIT -chokidar,1.7.0,MIT chokidar,2.0.2,MIT +chokidar,2.0.4,MIT chownr,1.0.1,ISC -chrome-trace-event,0.1.2,MIT +chrome-trace-event,1.0.0,MIT chronic,0.10.2,MIT chronic_duration,0.10.6,MIT chunky_png,1.3.5,MIT cipher-base,1.0.4,MIT circular-json,0.3.3,MIT -circular-json,0.5.1,MIT +circular-json,0.5.5,MIT citrus,3.0.2,MIT -clap,1.1.3,MIT class-utils,0.3.6,MIT classlist-polyfill,1.2.0,Unlicense cli-boxes,1.0.0,MIT @@ -298,19 +296,16 @@ cli-width,2.1.0,ISC clipboard,1.7.1,MIT cliui,2.1.0,ISC cliui,4.0.0,ISC -clone,1.0.3,MIT clone-response,1.0.2,MIT -co,3.0.6,MIT co,4.6.0,MIT -coa,1.0.1,MIT code-point-at,1.1.0,MIT +codesandbox-api,0.0.18,MIT +codesandbox-import-util-types,1.2.11,UNKNOWN +codesandbox-import-utils,1.2.11,UNKNOWN coercible,1.0.0,MIT collection-visit,1.0.0,MIT -color,0.11.4,MIT color-convert,1.9.1,MIT color-name,1.1.2,MIT -color-string,0.3.0,MIT -colormin,1.1.2,MIT colors,1.1.2,MIT combine-lists,1.0.1,MIT combined-stream,1.0.6,MIT @@ -361,28 +356,36 @@ cryptiles,2.0.5,New BSD cryptiles,3.1.2,New BSD crypto-browserify,3.12.0,MIT crypto-random-string,1.0.0,MIT -css-color-names,0.0.4,MIT -css-loader,0.28.11,MIT +css-loader,1.0.0,MIT css-selector-tokenizer,0.7.0,MIT css_parser,1.5.0,MIT cssesc,0.1.0,MIT -cssnano,3.10.0,MIT -csso,2.3.2,MIT currently-unhandled,0.4.1,MIT custom-event,1.0.1,MIT cyclist,0.2.2,MIT* d3,3.5.17,New BSD +d3,4.12.2,New BSD d3-array,1.2.1,New BSD d3-axis,1.0.8,New BSD d3-brush,1.0.4,New BSD +d3-chord,1.0.4,New BSD d3-collection,1.0.4,New BSD d3-color,1.0.3,New BSD d3-dispatch,1.0.3,New BSD d3-drag,1.2.1,New BSD +d3-dsv,1.0.8,New BSD d3-ease,1.0.3,New BSD +d3-force,1.1.0,New BSD d3-format,1.2.1,New BSD +d3-geo,1.9.1,New BSD +d3-hierarchy,1.1.5,New BSD d3-interpolate,1.1.6,New BSD d3-path,1.0.5,New BSD +d3-polygon,1.0.3,New BSD +d3-quadtree,1.0.3,New BSD +d3-queue,3.0.7,New BSD +d3-random,1.1.0,New BSD +d3-request,1.0.6,New BSD d3-scale,1.0.7,New BSD d3-selection,1.2.0,New BSD d3-shape,1.2.0,New BSD @@ -390,6 +393,8 @@ d3-time,1.0.8,New BSD d3-time-format,2.1.1,New BSD d3-timer,1.0.7,New BSD d3-transition,1.1.1,New BSD +d3-voronoi,1.1.2,New BSD +d3-zoom,1.7.1,New BSD dagre-d3-renderer,0.4.24,MIT dagre-layout,0.8.0,MIT dashdash,1.14.1,MIT @@ -398,7 +403,6 @@ date-format,1.2.0,MIT date-now,0.1.4,MIT dateformat,3.0.3,MIT de-indent,1.0.2,MIT -debug,2.2.0,MIT debug,2.6.8,MIT debug,2.6.9,MIT debug,3.1.0,MIT @@ -418,7 +422,6 @@ define-properties,1.1.2,MIT define-property,0.2.5,MIT define-property,1.0.0,MIT define-property,2.0.2,MIT -defined,1.0.0,MIT degenerator,1.0.4,MIT del,2.2.2,MIT del,3.0.0,MIT @@ -426,6 +429,7 @@ delayed-stream,1.0.0,MIT delegate,3.1.2,MIT delegates,1.0.0,MIT depd,1.1.1,MIT +depd,1.1.2,MIT des.js,1.0.0,MIT descendants_tracker,0.0.4,MIT destroy,1.0.4,MIT @@ -465,14 +469,15 @@ duplexer3,0.1.4,New BSD duplexify,3.5.3,MIT ecc-jsbn,0.1.1,MIT ed25519,1.2.4,MIT +editions,1.3.4,MIT ee-first,1.1.1,MIT ejs,2.5.9,Apache 2.0 -electron-to-chromium,1.3.3,ISC elliptic,6.4.0,MIT email_reply_trimmer,0.1.6,MIT emoji-unicode-version,0.2.1,MIT emojis-list,2.1.0,MIT encodeurl,1.0.2,MIT +encoding,0.1.12,MIT encryptor,3.0.0,MIT end-of-stream,1.4.1,MIT engine.io,3.1.5,MIT @@ -480,6 +485,7 @@ engine.io-client,3.1.5,MIT engine.io-parser,2.1.2,MIT enhanced-resolve,0.9.1,MIT enhanced-resolve,4.0.0,MIT +enhanced-resolve,4.1.0,MIT ent,2.2.0,MIT entities,1.1.1,Simplified BSD equalizer,0.0.11,MIT @@ -490,6 +496,8 @@ erubis,2.7.0,MIT es-abstract,1.10.0,MIT es-to-primitive,1.1.1,MIT es6-promise,3.0.2,MIT +es6-promise,4.2.4,MIT +es6-promisify,5.0.0,MIT escape-html,1.0.3,MIT escape-string-regexp,1.0.5,MIT escape_utils,1.1.1,MIT @@ -530,10 +538,8 @@ excon,0.62.0,MIT execa,0.7.0,MIT execjs,2.6.0,MIT expand-braces,0.1.2,MIT -expand-brackets,0.1.5,MIT expand-brackets,2.1.4,MIT expand-range,0.1.1,MIT -expand-range,1.8.2,MIT exports-loader,0.7.0,MIT express,4.16.2,MIT expression_parser,0.9.0,MIT @@ -541,7 +547,7 @@ extend,3.0.1,MIT extend-shallow,2.0.1,MIT extend-shallow,3.0.2,MIT external-editor,2.2.0,MIT -extglob,0.3.2,MIT +external-editor,3.0.0,MIT extglob,2.0.4,MIT extsprintf,1.3.0,MIT extsprintf,1.4.0,MIT @@ -561,10 +567,8 @@ figures,2.0.0,MIT file-entry-cache,2.0.0,MIT file-loader,1.1.11,MIT file-uri-to-path,1.0.0,MIT -filename-regex,2.0.1,MIT fileset,2.0.3,MIT filesize,3.6.0,New BSD -fill-range,2.2.3,MIT fill-range,4.0.0,MIT finalhandler,1.1.0,MIT find-cache-dir,1.0.0,MIT @@ -572,7 +576,6 @@ find-root,1.1.0,MIT find-up,1.1.2,MIT find-up,2.1.0,MIT flat-cache,1.2.2,MIT -flatten,1.0.2,MIT flipper,0.13.0,MIT flipper-active_record,0.13.0,MIT flipper-active_support_cache_store,0.13.0,MIT @@ -591,13 +594,12 @@ follow-redirects,1.0.0,MIT follow-redirects,1.2.6,MIT font-awesome-rails,4.7.0.1,"MIT,SIL Open Font License" for-in,1.0.2,MIT -for-own,0.1.5,MIT foreach,2.0.5,MIT forever-agent,0.6.1,Apache 2.0 form-data,2.0.0,MIT -form-data,2.1.4,MIT form-data,2.3.2,MIT formatador,0.2.5,MIT +formdata-polyfill,3.0.11,MIT forwarded,0.1.2,MIT fragment-cache,0.2.1,MIT fresh,0.5.2,MIT @@ -620,13 +622,13 @@ generate-object-property,1.2.0,MIT get-caller-file,1.0.2,ISC get-stdin,4.0.1,MIT get-stream,3.0.0,MIT -get-uri,2.0.1,MIT +get-uri,2.0.2,MIT get-value,2.0.6,MIT get_process_mem,0.2.0,MIT getpass,0.1.7,MIT gettext_i18n_rails,1.8.0,MIT gettext_i18n_rails_js,1.3.0,MIT -gitaly-proto,0.105.0,MIT +gitaly-proto,0.112.0,MIT github-linguist,5.3.3,MIT github-markup,1.7.0,MIT gitlab-flowdock-git-hook,1.0.1,MIT @@ -637,8 +639,6 @@ gitlab-markup,1.6.4,MIT gitlab_omniauth-ldap,2.0.4,MIT glob,5.0.15,ISC glob,7.1.2,ISC -glob-base,0.3.0,MIT -glob-parent,2.0.0,ISC glob-parent,3.1.0,ISC global-dirs,0.1.1,MIT global-modules-path,2.1.0,Apache 2.0 @@ -660,16 +660,17 @@ gpgme,2.0.13,LGPL-2.1+ graceful-fs,4.1.11,ISC grape,1.0.3,MIT grape-entity,0.7.1,MIT -grape-path-helpers,1.0.5,MIT +grape-path-helpers,1.0.6,MIT grape_logging,1.7.0,MIT graphiql-rails,1.4.10,MIT graphlib,2.1.1,MIT graphql,1.8.1,MIT grpc,1.11.0,Apache 2.0 gzip-size,4.1.0,MIT -hamlit,2.6.1,MIT +hamlit,2.8.8,MIT handle-thing,1.2.5,MIT handlebars,4.0.6,MIT +hangouts-chat,0.0.5,MIT har-schema,2.0.0,ISC har-validator,2.0.6,ISC har-validator,5.0.3,ISC @@ -704,9 +705,8 @@ hoek,4.2.1,New BSD home-or-tmp,2.0.0,MIT hosted-git-info,2.2.0,ISC hpack.js,2.1.6,MIT -html-comment-regex,1.1.1,MIT html-entities,1.2.0,MIT -html-pipeline,2.8.3,MIT +html-pipeline,2.8.4,MIT html2text,0.2.0,MIT htmlentities,4.3.4,MIT htmlparser2,3.9.2,MIT @@ -715,9 +715,10 @@ http-cache-semantics,3.8.1,Simplified BSD http-cookie,1.0.3,MIT http-deceiver,1.2.7,MIT http-errors,1.6.2,MIT +http-errors,1.6.3,MIT http-form_data,1.0.3,MIT http-proxy,1.16.2,MIT -http-proxy-agent,1.0.0,MIT +http-proxy-agent,2.1.0,MIT http-proxy-middleware,0.18.0,MIT http-signature,1.1.1,MIT http-signature,1.2.0,MIT @@ -727,7 +728,7 @@ httpclient,2.8.3,ruby httpntlm,1.6.1,MIT httpreq,0.4.24,MIT https-browserify,1.0.0,MIT -https-proxy-agent,1.0.0,MIT +https-proxy-agent,2.2.1,MIT i18n,0.9.5,MIT icalendar,2.4.1,ruby ice_nine,0.11.2,MIT @@ -749,25 +750,24 @@ imurmurhash,0.1.4,MIT indent-string,2.1.0,MIT indexes-of,1.0.1,MIT indexof,0.0.1,MIT* -inflection,1.10.0,MIT +inflection,1.12.0,MIT inflection,1.3.8,MIT inflight,1.0.6,ISC influxdb,0.2.3,MIT inherits,2.0.1,ISC inherits,2.0.3,ISC ini,1.3.5,ISC +inquirer,3.0.6,MIT inquirer,3.3.0,MIT -inquirer,5.2.0,MIT +inquirer,6.0.0,MIT internal-ip,1.2.0,MIT interpret,1.1.0,MIT into-stream,3.1.0,MIT invariant,2.2.2,New BSD invert-kv,1.0.0,MIT -ip,1.0.1,MIT ip,1.1.5,MIT ipaddr.js,1.6.0,MIT ipaddress,0.8.3,MIT -is-absolute-url,2.1.0,MIT is-accessor-descriptor,0.1.6,MIT is-accessor-descriptor,1.0.0,MIT is-arrayish,0.2.1,MIT @@ -780,16 +780,12 @@ is-data-descriptor,1.0.0,MIT is-date-object,1.0.1,MIT is-descriptor,0.1.6,MIT is-descriptor,1.0.2,MIT -is-dotfile,1.0.3,MIT -is-equal-shallow,0.1.3,MIT is-extendable,0.1.1,MIT is-extendable,1.0.1,MIT -is-extglob,1.0.0,MIT is-extglob,2.1.1,MIT is-finite,1.0.2,MIT is-fullwidth-code-point,1.0.0,MIT is-fullwidth-code-point,2.0.0,MIT -is-glob,2.0.1,MIT is-glob,3.1.0,MIT is-glob,4.0.0,MIT is-installed-globally,0.1.0,MIT @@ -797,7 +793,6 @@ is-my-ip-valid,1.0.0,MIT is-my-json-valid,2.17.2,MIT is-npm,1.0.0,MIT is-number,0.1.1,MIT -is-number,2.1.0,MIT is-number,3.0.0,MIT is-number,4.0.0,MIT is-obj,1.0.1,MIT @@ -808,8 +803,6 @@ is-path-in-cwd,1.0.0,MIT is-path-inside,1.0.0,MIT is-plain-obj,1.1.0,MIT is-plain-object,2.0.4,MIT -is-posix-bracket,0.1.1,MIT -is-primitive,2.0.0,MIT is-promise,2.1.0,MIT is-property,1.0.2,MIT is-redirect,1.0.0,MIT @@ -817,7 +810,6 @@ is-regex,1.0.4,MIT is-resolvable,1.0.0,MIT is-retry-allowed,1.1.0,MIT is-stream,1.1.0,MIT -is-svg,2.1.0,MIT is-symbol,1.0.1,MIT is-typedarray,1.0.0,MIT is-utf8,0.2.1,MIT @@ -840,8 +832,10 @@ istanbul-lib-instrument,1.10.1,New BSD istanbul-lib-report,1.1.2,New BSD istanbul-lib-source-maps,1.2.2,New BSD istanbul-reports,1.1.3,New BSD +istextorbinary,2.2.1,MIT isurl,1.0.0,MIT jasmine-core,2.9.0,MIT +jasmine-diff,0.1.3,MIT jasmine-jquery,2.1.1,MIT jed,1.1.1,MIT jira-ruby,1.4.1,MIT @@ -849,11 +843,9 @@ jquery,3.3.1,MIT jquery-atwho-rails,1.3.2,MIT jquery-ujs,1.2.2,MIT jquery.waitforimages,2.2.0,MIT -js-base64,2.1.9,New BSD js-cookie,2.1.3,MIT js-tokens,3.0.2,MIT js-yaml,3.11.0,MIT -js-yaml,3.7.0,MIT jsbn,0.1.1,MIT jsesc,0.5.0,MIT jsesc,1.3.0,MIT @@ -877,13 +869,13 @@ kaminari,1.0.1,MIT kaminari-actionview,1.0.1,MIT kaminari-activerecord,1.0.1,MIT kaminari-core,1.0.1,MIT -karma,2.0.2,MIT +karma,2.0.4,MIT karma-chrome-launcher,2.2.0,MIT karma-coverage-istanbul-reporter,1.4.2,MIT -karma-jasmine,1.1.1,MIT +karma-jasmine,1.1.2,MIT karma-mocha-reporter,2.2.5,MIT karma-sourcemap-loader,0.3.7,MIT -karma-webpack,3.0.0,MIT +karma-webpack,4.0.0-beta.0,MIT katex,0.8.3,MIT keyv,3.0.0,MIT kgio,2.10.0,LGPL-2.1+ @@ -897,7 +889,6 @@ latest-version,3.1.0,MIT lazy-cache,1.0.4,MIT lazy-cache,2.0.2,MIT lcid,1.0.0,MIT -leb,0.3.0,Apache 2.0 levn,0.3.0,MIT libbase64,0.1.0,MIT libmime,3.0.0,MIT @@ -915,43 +906,44 @@ lodash,4.17.10,MIT lodash,4.17.4,MIT lodash.camelcase,4.3.0,MIT lodash.clonedeep,4.5.0,MIT +lodash.debounce,4.0.8,MIT lodash.escaperegexp,4.1.2,MIT +lodash.get,4.4.2,MIT +lodash.isequal,4.5.0,MIT lodash.kebabcase,4.1.1,MIT -lodash.memoize,4.1.2,MIT lodash.mergewith,4.6.0,MIT lodash.snakecase,4.1.1,MIT -lodash.uniq,4.5.0,MIT +lodash.startcase,4.4.0,MIT lodash.upperfirst,4.3.1,MIT log-symbols,2.2.0,MIT -log4js,2.5.3,Apache 2.0 +log4js,2.11.0,Apache 2.0 logging,2.2.2,MIT loggly,1.1.1,MIT loglevel,1.4.1,MIT loglevelnext,1.0.3,MIT lograge,0.10.0,MIT long,3.2.0,Apache 2.0 +long,4.0.0,Apache 2.0 longest,1.0.1,MIT loofah,2.2.2,MIT loose-envify,1.3.1,MIT loud-rejection,1.6.0,MIT lowercase-keys,1.0.0,MIT lru-cache,2.2.4,MIT -lru-cache,2.6.5,ISC lru-cache,4.1.3,ISC -macaddress,0.2.8,MIT +lz-string,1.4.4,WTFPL mail,2.7.0,MIT mail_room,0.9.1,MIT mailcomposer,4.0.1,MIT -mailgun-js,0.7.15,MIT +mailgun-js,0.18.1,MIT make-dir,1.2.0,MIT mamacro,0.0.3,MIT map-cache,0.2.2,MIT map-obj,1.0.1,MIT -map-stream,0.1.0,Unknown +map-stream,0.1.0,UNKNOWN map-visit,1.0.0,MIT marked,0.3.12,MIT match-at,0.1.1,MIT -math-expression-evaluator,1.2.16,MIT md5.js,1.3.4,MIT media-typer,0.3.0,MIT mem,1.1.0,MIT @@ -963,7 +955,6 @@ merge-descriptors,1.0.1,MIT merge-source-map,1.1.0,MIT method_source,0.8.2,MIT methods,1.1.2,MIT -micromatch,2.3.11,MIT micromatch,3.1.10,MIT miller-rabin,4.0.1,MIT mime,1.4.1,MIT @@ -996,8 +987,8 @@ monaco-editor-webpack-plugin,1.4.0,MIT mousetrap,1.4.6,Apache 2.0 mousetrap-rails,1.4.6,"MIT,Apache" move-concurrently,1.0.1,ISC -ms,0.7.1,MIT ms,2.0.0,MIT +msgpack,1.2.4,Apache 2.0 multi_json,1.13.1,MIT multi_xml,0.6.0,MIT multicast-dns,6.1.1,MIT @@ -1018,6 +1009,7 @@ net-ssh,5.0.1,MIT netmask,1.0.6,MIT netrc,0.11.0,MIT nice-try,1.0.4,MIT +node-fetch,1.6.3,MIT node-forge,0.6.33,New BSD node-libs-browser,2.1.0,MIT node-pre-gyp,0.10.0,New BSD @@ -1029,23 +1021,20 @@ nodemailer-shared,1.1.0,MIT nodemailer-smtp-pool,2.8.2,MIT nodemailer-smtp-transport,2.7.2,MIT nodemailer-wellknown,0.1.10,MIT -nodemon,1.17.3,MIT -nokogiri,1.8.3,MIT +nodemon,1.18.2,MIT +nokogiri,1.8.4,MIT nokogumbo,1.5.0,Apache 2.0 nopt,1.0.10,MIT nopt,3.0.6,ISC nopt,4.0.1,ISC normalize-package-data,2.4.0,Simplified BSD normalize-path,2.1.1,MIT -normalize-range,0.1.2,MIT -normalize-url,1.9.1,MIT normalize-url,2.0.1,MIT npm-bundled,1.0.3,ISC npm-packlist,1.1.10,ISC npm-run-path,2.0.2,MIT npmlog,4.1.2,ISC null-check,1.0.0,MIT -num2fraction,1.2.2,MIT number-is-nan,1.0.1,MIT numerizer,0.1.1,MIT oauth,0.5.4,MIT @@ -1056,7 +1045,6 @@ object-component,0.0.3,MIT* object-copy,0.1.0,MIT object-keys,1.0.11,MIT object-visit,1.0.1,MIT -object.omit,2.0.1,MIT object.pick,1.3.0,MIT obuf,1.1.1,MIT octokit,4.9.0,MIT @@ -1082,7 +1070,9 @@ on-finished,2.3.0,MIT on-headers,1.0.1,MIT once,1.4.0,ISC onetime,2.0.1,MIT +opencollective,1.0.3,MIT opener,1.4.3,(WTFPL OR MIT) +opn,4.0.2,MIT opn,5.2.0,MIT optimist,0.6.1,MIT optionator,0.8.2,MIT @@ -1103,13 +1093,12 @@ p-locate,2.0.0,MIT p-map,1.1.1,MIT p-timeout,2.0.1,MIT p-try,1.0.0,MIT -pac-proxy-agent,1.1.0,MIT -pac-resolver,2.0.0,MIT +pac-proxy-agent,2.0.2,MIT +pac-resolver,3.0.0,MIT package-json,4.0.1,MIT pako,1.0.6,(MIT AND Zlib) parallel-transform,1.1.0,MIT parse-asn1,5.1.0,ISC -parse-glob,3.0.4,MIT parse-json,2.2.0,MIT parseqs,0.0.5,MIT parseuri,0.0.5,MIT @@ -1151,47 +1140,19 @@ popper.js,1.14.3,MIT portfinder,1.0.13,MIT posix-character-classes,0.1.1,MIT posix-spawn,0.3.13,MIT -postcss,5.2.16,MIT postcss,6.0.22,MIT -postcss-calc,5.3.1,MIT -postcss-colormin,2.2.2,MIT -postcss-convert-values,2.6.1,MIT -postcss-discard-comments,2.0.4,MIT -postcss-discard-duplicates,2.1.0,MIT -postcss-discard-empty,2.1.0,MIT -postcss-discard-overridden,0.1.1,MIT -postcss-discard-unused,2.2.3,MIT -postcss-filter-plugins,2.0.2,MIT -postcss-merge-idents,2.1.7,MIT -postcss-merge-longhand,2.0.2,MIT -postcss-merge-rules,2.1.2,MIT -postcss-message-helpers,2.0.0,MIT -postcss-minify-font-values,1.0.5,MIT -postcss-minify-gradients,1.0.5,MIT -postcss-minify-params,1.2.2,MIT -postcss-minify-selectors,2.1.1,MIT +postcss,6.0.23,MIT postcss-modules-extract-imports,1.2.0,ISC postcss-modules-local-by-default,1.2.0,MIT postcss-modules-scope,1.1.0,ISC postcss-modules-values,1.3.0,ISC -postcss-normalize-charset,1.1.1,MIT -postcss-normalize-url,3.0.8,MIT -postcss-ordered-values,2.2.3,MIT -postcss-reduce-idents,2.4.0,MIT -postcss-reduce-initial,1.0.1,MIT -postcss-reduce-transforms,1.0.4,MIT -postcss-selector-parser,2.2.3,MIT postcss-selector-parser,3.1.1,MIT -postcss-svgo,2.1.6,MIT -postcss-unique-selectors,2.0.2,MIT postcss-value-parser,3.3.0,MIT -postcss-zindex,2.2.0,MIT prelude-ls,1.1.2,MIT premailer,1.10.4,New BSD premailer-rails,1.9.7,MIT prepend-http,1.0.4,MIT prepend-http,2.0.0,MIT -preserve,0.2.0,MIT prettier,1.12.1,MIT prismjs,1.6.0,MIT private,0.1.8,MIT @@ -1199,10 +1160,12 @@ process,0.11.10,MIT process-nextick-args,1.0.7,MIT process-nextick-args,2.0.0,MIT progress,2.0.0,MIT -prometheus-client-mmap,0.9.3,Apache 2.0 +prometheus-client-mmap,0.9.4,Apache 2.0 promise-inflight,1.0.1,ISC +promisify-call,2.0.4,MIT proxy-addr,2.0.3,MIT -proxy-agent,2.0.0,MIT +proxy-agent,3.0.1,MIT +proxy-from-env,1.0.0,MIT prr,0.0.0,MIT prr,1.0.1,MIT ps-tree,1.1.0,MIT @@ -1215,12 +1178,9 @@ pumpify,1.4.0,MIT punycode,1.3.2,MIT punycode,1.4.1,MIT pyu-ruby-sasl,0.0.3.3,MIT -q,1.4.1,MIT -q,1.5.0,MIT qjobs,1.2.0,MIT qs,6.2.3,New BSD qs,6.5.1,New BSD -query-string,4.3.2,MIT query-string,5.1.1,MIT querystring,0.2.0,MIT querystring-es3,0.2.1,MIT @@ -1243,16 +1203,17 @@ railties,4.2.10,MIT rainbow,2.2.2,MIT raindrops,0.18.0,LGPL-2.1+ rake,12.3.1,MIT -randomatic,1.1.7,MIT randombytes,2.0.6,MIT randomfill,1.0.4,MIT range-parser,1.2.0,MIT raphael,2.2.7,MIT raven-js,3.22.1,Simplified BSD raw-body,2.3.2,MIT +raw-body,2.3.3,MIT raw-loader,0.5.1,MIT rb-fsevent,0.10.2,MIT rb-inotify,0.9.10,MIT +rbtrace,0.4.10,MIT rc,1.2.5,(BSD-2-Clause OR MIT OR Apache-2.0) rdoc,6.0.4,ruby re2,1.1.1,New BSD @@ -1279,12 +1240,10 @@ redis-parser,2.6.0,MIT redis-rack,2.0.4,MIT redis-rails,5.0.2,MIT redis-store,1.4.1,MIT -reduce-css-calc,1.3.0,MIT -reduce-function-call,1.0.2,MIT regenerate,1.3.2,MIT +regenerator-runtime,0.10.5,MIT regenerator-runtime,0.11.0,MIT regenerator-transform,0.10.1,BSD -regex-cache,0.4.4,MIT regex-not,1.0.2,MIT regexpu-core,1.0.0,MIT regexpu-core,2.0.0,MIT @@ -1323,7 +1282,7 @@ rimraf,2.6.2,ISC rinku,2.0.0,ISC ripemd160,2.0.1,MIT rotp,2.1.2,MIT -rouge,3.1.1,MIT +rouge,3.2.0,MIT rqrcode,0.7.0,MIT rqrcode-rails3,0.1.7,MIT ruby-enum,0.7.2,MIT @@ -1338,21 +1297,22 @@ rufus-scheduler,3.4.0,MIT rugged,0.27.2,MIT run-async,2.3.0,MIT run-queue,1.0.3,ISC +rw,1.3.3,New BSD +rx,4.1.0,Apache 2.0 rx-lite,4.0.8,Apache 2.0 rx-lite-aggregates,4.0.8,Apache 2.0 -rxjs,5.5.10,Apache 2.0 +rxjs,6.2.1,Apache 2.0 safe-buffer,5.1.1,MIT safe-buffer,5.1.2,MIT safe-regex,1.1.0,MIT safe_yaml,1.0.4,MIT safer-buffer,2.1.2,MIT -sanitize,4.6.5,MIT +sanitize,4.6.6,MIT sanitize-html,1.16.3,MIT sass,3.5.5,MIT sass-listen,4.0.0,MIT sass-rails,5.0.6,MIT sawyer,0.8.1,MIT -sax,1.2.2,ISC sax,1.2.4,ISC schema-utils,0.4.5,MIT seed-fu,2.3.7,MIT @@ -1361,7 +1321,6 @@ select-hose,2.0.0,MIT select2,3.5.2-browserify,Apache* select2-rails,3.5.9.3,MIT selfsigned,1.10.1,MIT -semver,5.0.3,ISC semver,5.5.0,ISC semver-diff,2.1.0,MIT send,0.16.1,MIT @@ -1393,6 +1352,8 @@ slack-notifier,1.5.1,MIT slash,1.0.0,MIT slice-ansi,1.0.0,MIT smart-buffer,1.1.15,MIT +smart-buffer,4.0.1,MIT +smooshpack,0.0.48,SEE LICENSE.MD IN ROOT smtp-connection,2.12.0,MIT snapdragon,0.8.1,MIT snapdragon-node,2.1.1,MIT @@ -1407,8 +1368,9 @@ sockjs,0.3.19,MIT sockjs-client,1.1.4,MIT socks,1.1.10,MIT socks,1.1.9,MIT -socks-proxy-agent,2.1.1,MIT -sort-keys,1.1.2,MIT +socks,2.2.1,MIT +socks-proxy-agent,3.0.1,MIT +socks-proxy-agent,4.0.1,MIT sort-keys,2.0.0,MIT sortablejs,1.7.0,MIT source-list-map,2.0.0,MIT @@ -1442,6 +1404,7 @@ state_machines-activerecord,0.5.1,MIT static-extend,0.1.2,MIT statuses,1.3.1,MIT statuses,1.4.0,MIT +statuses,1.5.0,MIT stickyfilljs,2.0.5,MIT stream-browserify,2.0.1,MIT stream-combiner,0.0.4,MIT @@ -1469,18 +1432,17 @@ supports-color,2.0.0,MIT supports-color,3.2.3,MIT supports-color,5.4.0,MIT svg4everybody,2.1.9,CC0-1.0 -svgo,0.7.2,MIT -symbol-observable,1.0.1,MIT sys-filesystem,1.1.6,Artistic 2.0 table,4.0.2,New BSD tapable,0.1.10,MIT tapable,1.0.0,MIT tar,4.4.4,ISC -temple,0.7.7,MIT +temple,0.8.0,MIT term-size,1.2.0,MIT test-exclude,4.2.1,ISC text,1.3.1,MIT text-table,0.2.0,MIT +textextensions,2.2.0,MIT thor,0.19.4,MIT thread_safe,0.3.6,Apache 2.0 three,0.84.0,MIT @@ -1490,7 +1452,7 @@ through,2.3.8,MIT through2,2.0.3,MIT thunkify,2.1.2,MIT thunky,0.1.0,MIT* -tilt,2.0.6,MIT +tilt,2.0.8,MIT timeago.js,3.0.2,MIT timed-out,4.0.1,MIT timers-browserify,2.0.10,MIT @@ -1511,9 +1473,11 @@ tough-cookie,2.3.3,New BSD traverse,0.6.6,MIT trim-newlines,1.0.0,MIT trim-right,1.0.1,MIT +trollop,2.1.3,MIT truncato,0.7.10,MIT tryer,1.0.0,MIT tryit,1.0.3,MIT +tslib,1.9.3,Apache 2.0 tsscmp,1.0.5,MIT tty-browserify,0.0.0,MIT tunnel-agent,0.4.3,Apache 2.0 @@ -1540,8 +1504,6 @@ unicorn,5.1.0,ruby unicorn-worker-killer,0.4.4,ruby union-value,1.0.0,MIT uniq,1.0.1,MIT -uniqid,4.1.1,MIT -uniqs,2.0.0,MIT unique-filename,1.1.0,ISC unique-slug,2.0.0,ISC unique-string,1.0.0,MIT @@ -1549,10 +1511,10 @@ unpipe,1.0.0,MIT unset-value,1.0.0,MIT unzip-response,2.0.1,MIT upath,1.0.5,MIT +upath,1.1.0,MIT update-notifier,2.3.0,Simplified BSD urix,0.1.0,MIT url,0.11.0,MIT -url-join,2.0.5,MIT url-join,4.0.0,MIT url-loader,1.0.1,MIT url-parse,1.0.5,MIT @@ -1572,7 +1534,6 @@ validate-npm-package-license,3.0.1,Apache 2.0 validates_hostname,1.0.6,MIT vary,1.1.1,MIT vary,1.1.2,MIT -vendors,1.0.1,MIT verror,1.10.0,MIT version_sorter,2.1.0,MIT virtus,1.0.5,MIT @@ -1582,8 +1543,9 @@ vmstat,2.3.0,MIT void-elements,2.0.1,MIT vue,2.5.16,MIT vue-eslint-parser,2.0.3,MIT +vue-functional-data-merge,2.0.6,MIT vue-hot-reload-api,2.3.0,MIT -vue-loader,15.2.0,MIT +vue-loader,15.2.4,MIT vue-resource,1.5.0,MIT vue-router,3.0.1,MIT vue-style-loader,4.1.0,MIT @@ -1594,10 +1556,9 @@ vuex,3.0.1,MIT warden,1.2.7,MIT watchpack,1.5.0,MIT wbuf,1.7.2,MIT -webpack,4.11.1,MIT -webpack-bundle-analyzer,2.11.1,MIT -webpack-cli,3.0.2,MIT -webpack-dev-middleware,2.0.6,MIT +webpack,4.16.0,MIT +webpack-bundle-analyzer,2.13.1,MIT +webpack-cli,3.0.8,MIT webpack-dev-middleware,3.1.3,MIT webpack-dev-server,3.1.4,MIT webpack-log,1.2.0,MIT @@ -1607,13 +1568,13 @@ webpack-stats-plugin,0.2.1,MIT websocket-driver,0.6.5,MIT websocket-extensions,0.1.1,MIT when,3.7.8,MIT -whet.extend,0.9.9,MIT which,1.3.0,ISC which-module,2.0.0,ISC wide-align,1.1.2,ISC widest-line,2.0.0,MIT wikicloth,0.8.1,MIT window-size,0.1.0,MIT +with-callback,1.0.2,MIT wordwrap,0.0.2,MIT wordwrap,0.0.3,MIT wordwrap,1.0.0,MIT @@ -1627,9 +1588,11 @@ ws,3.3.3,MIT ws,4.0.0,MIT xdg-basedir,3.0.0,MIT xml-simple,1.1.5,ruby +xmlhttprequest,1.8.0,MIT xmlhttprequest-ssl,1.5.5,MIT xregexp,2.0.0,MIT xtend,4.0.1,MIT +xterm,3.5.0,MIT y18n,3.2.1,ISC y18n,4.0.0,ISC yallist,2.1.2,ISC |